blob: 169939443928d8e604bed941ea47d29387987008 [file] [log] [blame]
#!/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 <gpxe\/efi\/$1>/ ) {
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 );