# Do not remove the following line; MakeMaker relies on it to identify
# this file as a template for defsubs.h
# Extracting defsubs.h (with variable substitutions)
-#!perl
-my ($out) = __FILE__ =~ /(^.*)\.PL/;
-if ($^O eq 'VMS') { ($out) = __FILE__ =~ /^(.+)_PL$/i; }
+#!perl -w
+use File::Spec;
+my (undef, $headerpath) = @ARGV;
+my ($out) = __FILE__ =~ /(^.*)\.PL/i;
+$out =~ s/_h$/.h/;
+unlink $out if -l $out;
open(OUT,">$out") || die "Cannot open $file:$!";
-print "Extracting $out . . .\n";
-foreach my $const (qw(AVf_REAL
+print "Extracting $out...\n";
+print OUT <<"END";
+/*
+ !!! Don't modify this file - it's autogenerated from $0 !!!
+ */
+END
+
+foreach my $const (qw(
+ CVf_ANON
+ CVf_CLONE
+ CVf_CLONED
+ CVf_CONST
+ CVf_LVALUE
+ CVf_METHOD
+ CVf_NODEBUG
+ CVf_UNIQUE
+ CVf_WEAKOUTSIDE
+ GVf_IMPORTED_AV
+ GVf_IMPORTED_CV
+ GVf_IMPORTED_HV
+ GVf_IMPORTED_SV
HEf_SVKEY
- SVf_IOK SVf_IVisUV SVf_NOK SVf_POK
- SVf_ROK SVp_IOK SVp_POK ))
+ SVTYPEMASK
+ SVf_FAKE
+ SVf_IOK
+ SVf_IVisUV
+ SVf_NOK
+ SVf_POK
+ SVf_READONLY
+ SVf_ROK
+ SVp_IOK
+ SVp_NOK
+ SVp_POK
+ SVpad_OUR
+ SVs_RMG
+ SVs_SMG
+ SVt_PVGV
+ SVt_PVHV
+ PAD_FAKELEX_ANON
+ PAD_FAKELEX_MULTI
+ ))
{
doconst($const);
}
-foreach my $file (qw(op.h cop.h))
+
+if ($] < 5.009) {
+ # This is only present in 5.10, but it's useful to B::Deparse to be able
+ # to import a dummy value from B
+ doconst(OPpPAD_STATE);
+}
+
+if ($] >= 5.009) {
+ # Constant not present in 5.8.x
+ doconst(CVf_ISXSUB);
+} else {
+ # Constant not present after 5.8.x
+ doconst(AVf_REAL);
+}
+
+if ($] < 5.011) {
+ # Constant not present after 5.10.x
+ doconst(CVf_LOCKED);
+}
+
+foreach my $tuple (['op.h'],['cop.h'],['regexp.h','RXf_'])
{
- open(OPH,"../../$file") || die "Cannot open ../../$file:$!";
+ my $file = $tuple->[0];
+ my $pfx = $tuple->[1] || '';
+ my $path = File::Spec->catfile($headerpath, $file);
+ open(OPH,"$path") || die "Cannot open $path:$!";
while (<OPH>)
{
- doconst($1) if (/#define\s+(\w+)\s+([\(\)\|\dx]+)\s*(?:$|\/\*)/);
+ doconst($1) if (/#define\s+($pfx\w+)\s+([\(\)\|\dx]+)\s*(?:$|\/\*)/);
}
close(OPH);
}