summaryrefslogtreecommitdiff
path: root/gpxe/src/include/gpxe/efi/import.pl
blob: 169939443928d8e604bed941ea47d29387987008 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/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 );