Add Config::header_files() to list the header dependencies for XS code.
authorNicholas Clark <nick@ccl4.org>
Sat, 19 Feb 2011 14:58:36 +0000 (14:58 +0000)
committerNicholas Clark <nick@ccl4.org>
Sat, 19 Feb 2011 14:58:36 +0000 (14:58 +0000)
Currently ExtUtils::MM_{Unix,VMS} contain hard-coded lists, which omit some
headers, and include other headers that we would like to like to eliminate.
Having the Perl installation providing the canonical list for itself allows
us to avoid the these problems.

configpm

index 5ca58c7..0975373 100755 (executable)
--- a/configpm
+++ b/configpm
@@ -61,6 +61,36 @@ $Common{$_} = $_ foreach qw(dlext so);
 my %Extensions = map {($_,$_)}
                  qw(dynamic_ext static_ext extensions known_extensions);
 
+# The plan is that this information is used by ExtUtils::MakeMaker to generate
+# Makefile dependencies, rather than hardcoding a list, which has become out
+# of date. However, currently, MM_Unix.pm and MM_VMS.pm have *different* lists,
+# *and* descrip_mms.template doesn't actually install all the headers.
+# The "Unix" list seems to (attempt to) avoid the generated headers, which I'm
+# not sure is the right thing to do. Also, not certain whether it would be
+# easier to parse MANIFEST to get these (adding config.h, and potentially
+# removing others), but for now, stick to a hard coded list.
+
+# Could use a map to add ".h", but I suspect that it's easier to use literals,
+# so that anyone using grep will find them
+# This is the list from MM_VMS, plus pad.h, parser.h, perlsfio.h utf8.h
+# which it installs. It *doesn't* install perliol.h - FIXME.
+my @header_files = qw(EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h
+                     embed.h embedvar.h form.h gv.h handy.h hv.h intrpvar.h
+                     iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h
+                     pad.h parser.h patchlevel.h perl.h perlio.h perlsdio.h
+                     perlsfio.h perlvars.h perly.h pp.h pp_proto.h proto.h
+                     regcomp.h regexp.h regnodes.h scope.h sv.h thread.h utf8.h
+                     util.h);
+
+# No point in adding fakethr.h, as it no longer works
+push @header_files,
+    $^O eq 'VMS' ? 'vmsish.h' : qw(dosish.h perliol.h time64.h unixish.h);
+
+my $header_files = '    return qw(' . join(' ', sort @header_files) . ');';
+$header_files =~ s/(?=.{64})   # If line is still overlength
+                  (.{1,64})\  # Split at the last convenient space
+                 /$1\n              /gx;
+
 # allowed opts as well as specifies default and initial values
 my %Allowed_Opts = (
     'cross'    => '', # --cross=PLATFORM - crosscompiling for PLATFORM
@@ -183,13 +213,17 @@ sub _V {
     print "    $_\n" foreach @INC;
 }
 
+sub header_files {
 ENDOFBEG
 
+$heavy_txt .= $header_files . "\n}\n\n";
+
 my $export_funcs = <<'EOT';
 my %Export_Cache = (myconfig => 1,
                    config_sh => 1, config_vars => 1, config_re => 1,
                    bincompat_options => 1, non_bincompat_options => 1,
-                   compile_date => 1, local_patches => 1);
+                   compile_date => 1, local_patches => 1,
+                   header_files => 1);
 EOT
 
 my %export_ok = eval $export_funcs or die;
@@ -886,6 +920,11 @@ C<perl -V>
 Returns a list of the names of locally applied patches, equivalent to what
 is shown by C<perl -V>.
 
+=item header_files()
+
+Returns a list of the header files that should be used as dependencies for
+XS code, for this version of Perl on this platform.
+
 =back
 
 =head1 EXAMPLE