#!/usr/bin/perl -w use File::Spec::Functions qw ( :ALL ); use File::Find; use File::Path; use FindBin; use strict; use warnings; sub try_import_file { my $gpxedir = shift; my $edkdirs = shift; my $filename = shift; # Skip everything except headers return unless $filename =~ /\.h$/; print "$filename..."; my $outfile = catfile ( $gpxedir, $filename ); foreach my $edkdir ( @$edkdirs ) { my $infile = catfile ( $edkdir, $filename ); if ( -e $infile ) { # We have found a matching source file - import it print "$infile\n"; open my $infh, "<$infile" or die "Could not open $infile: $!\n"; ( undef, my $outdir, undef ) = splitpath ( $outfile ); mkpath ( $outdir ); open my $outfh, ">$outfile" or die "Could not open $outfile: $!\n"; my @dependencies = (); while ( <$infh> ) { # Strip CR and trailing whitespace s/\r//g; s/\s*$//g; chomp; # Update include lines, and record included files if ( s/^\#include\s+[<\"](\S+)[>\"]/\#include / ) { push @dependencies, $1; } print $outfh "$_\n"; } close $outfh; close $infh; # Recurse to handle any included files that we don't already have foreach my $dependency ( @dependencies ) { if ( ! -e catfile ( $gpxedir, $dependency ) ) { print "...following dependency on $dependency\n"; try_import_file ( $gpxedir, $edkdirs, $dependency ); } } return; } } print "no equivalent found\n"; } # Identify edk import directories die "Syntax $0 /path/to/edk2/edk2\n" unless @ARGV == 1; my $edktop = shift; die "Directory \"$edktop\" does not appear to contain the EFI EDK2\n" unless -e catfile ( $edktop, "MdePkg" ); my $edkdirs = [ catfile ( $edktop, "MdePkg/Include" ), catfile ( $edktop, "IntelFrameworkPkg/Include" ) ]; # Identify gPXE EFI includes directory my $gpxedir = $FindBin::Bin; die "Directory \"$gpxedir\" does not appear to contain the gPXE EFI includes\n" unless -e catfile ( $gpxedir, "../../../include/gpxe/efi" ); print "Importing EFI headers into $gpxedir\nfrom "; print join ( "\n and ", @$edkdirs )."\n"; # Import headers find ( { wanted => sub { try_import_file ( $gpxedir, $edkdirs, abs2rel ( $_, $gpxedir ) ); }, no_chdir => 1 }, $gpxedir );