Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / xen / import.pl
diff --git a/qemu/roms/ipxe/src/include/xen/import.pl b/qemu/roms/ipxe/src/include/xen/import.pl
new file mode 100755 (executable)
index 0000000..9f09a77
--- /dev/null
@@ -0,0 +1,116 @@
+#!/usr/bin/perl -w
+
+=head1 NAME
+
+import.pl
+
+=head1 SYNOPSIS
+
+import.pl [options] /path/to/xen
+
+Options:
+
+    -h,--help          Display brief help message
+    -v,--verbose       Increase verbosity
+    -q,--quiet         Decrease verbosity
+
+=cut
+
+use File::Spec::Functions qw ( :ALL );
+use File::Find;
+use File::Path;
+use Getopt::Long;
+use Pod::Usage;
+use FindBin;
+use strict;
+use warnings;
+
+my $verbosity = 0;
+
+sub try_import_file {
+  my $ipxedir = shift;
+  my $xendir = shift;
+  my $filename = shift;
+
+  # Skip everything except headers
+  return unless $filename =~ /\.h$/;
+
+  # Search for importable header
+  ( undef, my $subdir, undef ) = splitpath ( $filename );
+  my $outfile = catfile ( $ipxedir, $filename );
+  my $infile = catfile ( $xendir, "xen/include/public", $filename );
+  die "$infile does not exist\n" unless -e $infile;
+
+  # Import header file
+  print "$filename <- ".catfile ( $xendir, $filename )."\n"
+      if $verbosity >= 1;
+  open my $infh, "<", $infile or die "Could not open $infile: $!\n";
+  mkpath ( catdir ( $xendir, $subdir ) );
+  open my $outfh, ">", $outfile or die "Could not open $outfile: $!\n";
+  my @dependencies = ();
+  my $maybe_guard;
+  my $guard;
+  while ( <$infh> ) {
+    # Strip CR and trailing whitespace
+    s/\r//g;
+    s/\s*$//g;
+    chomp;
+    # Update include lines, and record included files
+    if ( /^\#include\s+[<\"](\S+)[>\"]/ ) {
+      push @dependencies, catfile ( $subdir, $1 );
+    }
+    # Write out line
+    print $outfh "$_\n";
+    # Apply FILE_LICENCE() immediately after include guard
+    if ( defined $maybe_guard ) {
+      if ( /^\#define\s+_+${maybe_guard}_H_*$/ ) {
+       die "Duplicate header guard detected in $infile\n" if $guard;
+       $guard = $maybe_guard;
+       print $outfh "\nFILE_LICENCE ( MIT );\n";
+      }
+      undef $maybe_guard;
+    }
+    if ( /^#ifndef\s+_+(\S+)_H_*$/ ) {
+      $maybe_guard = $1;
+    }
+  }
+  close $outfh;
+  close $infh;
+  # Warn if no header guard was detected
+  warn "Cannot detect header guard in $infile\n" unless $guard;
+  # Recurse to handle any included files that we don't already have
+  foreach my $dependency ( @dependencies ) {
+    if ( ! -e catfile ( $ipxedir, $dependency ) ) {
+      print "...following dependency on $dependency\n" if $verbosity >= 1;
+      try_import_file ( $ipxedir, $xendir, $dependency );
+    }
+  }
+  return;
+}
+
+# Parse command-line options
+Getopt::Long::Configure ( 'bundling', 'auto_abbrev' );
+GetOptions (
+  'verbose|v+' => sub { $verbosity++; },
+  'quiet|q+' => sub { $verbosity--; },
+  'help|h' => sub { pod2usage ( 1 ); },
+) or die "Could not parse command-line options\n";
+pod2usage ( 1 ) unless @ARGV == 1;
+my $xendir = shift;
+
+# Identify Xen import directory
+die "Directory \"$xendir\" does not appear to contain the Xen source tree\n"
+    unless -e catfile ( $xendir, "xen/include/public/xen.h" );
+
+# Identify iPXE Xen includes directory
+my $ipxedir = $FindBin::Bin;
+die "Directory \"$ipxedir\" does not appear to contain the iPXE Xen includes\n"
+    unless -e catfile ( $ipxedir, "../../include/ipxe" );
+
+print "Importing Xen headers into $ipxedir\nfrom $xendir\n"
+    if $verbosity >= 1;
+
+# Import headers
+find ( { wanted => sub {
+  try_import_file ( $ipxedir, $xendir, abs2rel ( $_, $ipxedir ) );
+}, no_chdir => 1 }, $ipxedir );