This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix assertion failure with undef &my_sub/&anon
[perl5.git] / configpm
index d38c268..21bd3ef 100755 (executable)
--- a/configpm
+++ b/configpm
@@ -11,7 +11,6 @@
 #    lib/Config.pm
 #    lib/Config_heavy.pl
 #    lib/Config.pod
-#    lib/Cross.pm (optionally)
 #
 #
 # from the contents of the static files
@@ -23,7 +22,6 @@
 #
 #    config.sh
 #
-# Note that output directory is xlib/[cross-name]/ for cross-compiling
 #
 # It will only update Config.pm and Config_heavy.pl if the contents of
 # either file would be different. Note that *both* files are updated in
@@ -32,7 +30,6 @@
 
 sub usage { die <<EOF }
 usage: $0  [ options ]
-    --cross=PLATFORM    cross-compile for a different platform
     --no-glossary       don't include Porting/Glossary in lib/Config.pod
     --chdir=dir         change directory before writing files
 EOF
@@ -72,17 +69,16 @@ my %Extensions = map {($_,$_)}
 
 # 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
+# This is the list from MM_VMS, plus pad.h, parser.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
+                     embed.h embedvar.h form.h gv.h handy.h hv.h hv_func.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
+                     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);
 
@@ -93,7 +89,6 @@ $header_files =~ s/(?=.{64})   # If line is still overlength
 
 # allowed opts as well as specifies default and initial values
 my %Allowed_Opts = (
-    'cross'    => '', # --cross=PLATFORM - crosscompiling for PLATFORM
     'glossary' => 1,  # --no-glossary  - no glossary file inclusion,
                       #                  for compactness
     'chdir'    => '', # --chdir=dir    - change directory before writing files
@@ -129,19 +124,10 @@ if ($Opts{chdir}) {
 my ($Config_SH, $Config_PM, $Config_heavy, $Config_POD);
 my $Glossary = 'Porting/Glossary';
 
-if ($Opts{cross}) {
-  # creating cross-platform config file
-  mkdir "xlib";
-  mkdir "xlib/$Opts{cross}";
-  $Config_PM = "xlib/$Opts{cross}/Config.pm";
-  $Config_POD = "xlib/$Opts{cross}/Config.pod";
-  $Config_SH = "Cross/config-$Opts{cross}.sh";
-}
-else {
-  $Config_PM = "lib/Config.pm";
-  $Config_POD = "lib/Config.pod";
-  $Config_SH = "config.sh";
-}
+$Config_PM = "lib/Config.pm";
+$Config_POD = "lib/Config.pod";
+$Config_SH = "config.sh";
+
 ($Config_heavy = $Config_PM) =~ s/\.pm$/_heavy.pl/;
 die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
   if $Config_heavy eq $Config_PM;
@@ -149,75 +135,6 @@ die "Can't automatically determine name for Config_heavy.pl from '$Config_PM'"
 my $config_txt;
 my $heavy_txt;
 
-$heavy_txt .= <<'ENDOFBEG';
-# This file was created by configpm when Perl was built. Any changes
-# made to this file will be lost the next time perl is built.
-
-package Config;
-use strict;
-use warnings;
-use vars '%Config';
-
-sub bincompat_options {
-    return split ' ', (Internals::V())[0];
-}
-
-sub non_bincompat_options {
-    return split ' ', (Internals::V())[1];
-}
-
-sub compile_date {
-    return (Internals::V())[2]
-}
-
-sub local_patches {
-    my (undef, undef, undef, @patches) = Internals::V();
-    return @patches;
-}
-
-sub _V {
-    my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
-
-    my $opts = join ' ', sort split ' ', "$bincompat $non_bincompat";
-
-    # wrap at 76 columns.
-
-    $opts =~ s/(?=.{53})(.{1,53}) /$1\n                        /mg;
-
-    print Config::myconfig();
-    if ($^O eq 'VMS') {
-        print "\nCharacteristics of this PERLSHR image: \n";
-    } else {
-        print "\nCharacteristics of this binary (from libperl): \n";
-    }
-
-    print "  Compile-time options: $opts\n";
-
-    if (@patches) {
-        print "  Locally applied patches:\n";
-        print "\t$_\n" foreach @patches;
-    }
-
-    print "  Built under $^O\n";
-
-    print "  $date\n" if defined $date;
-
-    my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %ENV;
-    push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $^O eq 'cygwin' and $ENV{CYGWIN};
-
-    if (@env) {
-        print "  \%ENV:\n";
-        print "    $_\n" foreach @env;
-    }
-    print "  \@INC:\n";
-    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, compile_date => 1, local_patches => 1,
@@ -227,7 +144,7 @@ EOT
 
 my %export_ok = eval $export_funcs or die;
 
-$config_txt .= sprintf << 'EOT', $export_funcs;
+$config_txt .= sprintf << 'EOT', $], $export_funcs;
 # This file was created by configpm when Perl was built. Any changes
 # made to this file will be lost the next time perl is built.
 
@@ -238,7 +155,9 @@ $config_txt .= sprintf << 'EOT', $export_funcs;
 package Config;
 use strict;
 use warnings;
-use vars '%%Config';
+use vars '%%Config', '$VERSION';
+
+$VERSION = "%s";
 
 # Skip @Config::EXPORT because it only contains %%Config, which we special
 # case below as it's not a function. @Config::EXPORT won't change in the
@@ -278,12 +197,11 @@ sub import {
     return;
 }
 
-die "Perl lib version (%s) doesn't match executable '$0' version ($])"
+die "$0: Perl lib version (%s) doesn't match executable '$^X' version ($])"
     unless $^V;
 
 $^V eq %s
-    or die "Perl lib version (%s) doesn't match executable '$0' version (" .
-       sprintf("v%%vd",$^V) . ")";
+    or die sprintf "%%s: Perl lib version (%s) doesn't match executable '$^X' version (%%vd)", $0, $^V;
 
 ENDOFBEG
 
@@ -382,7 +300,7 @@ $fetch_string .= <<'EOT';
 EOT
 
 } else {
-    # We only have ' delimted.
+    # We only have ' delimited.
 
 $fetch_string .= <<'EOT';
     return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s;
@@ -523,6 +441,78 @@ sub relocate_inc {
 }
 EOT
 
+my $osname = fetch_string({}, 'osname');
+my $from = $osname eq 'VMS' ? 'PERLSHR image' : 'binary (from libperl)';
+my $env_cygwin = $osname eq 'cygwin'
+    ? 'push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $ENV{CYGWIN};' . "\n" : "";
+
+$heavy_txt .= sprintf <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwin;
+# This file was created by configpm when Perl was built. Any changes
+# made to this file will be lost the next time perl is built.
+
+package Config;
+use strict;
+use warnings;
+use vars '%%Config';
+
+sub bincompat_options {
+    return split ' ', (Internals::V())[0];
+}
+
+sub non_bincompat_options {
+    return split ' ', (Internals::V())[1];
+}
+
+sub compile_date {
+    return (Internals::V())[2]
+}
+
+sub local_patches {
+    my (undef, undef, undef, @patches) = Internals::V();
+    return @patches;
+}
+
+sub _V {
+    die "Perl lib was built for '%s' but is being run on '$^O'"
+        unless "%s" eq $^O;
+
+    my ($bincompat, $non_bincompat, $date, @patches) = Internals::V();
+
+    my $opts = join ' ', sort split ' ', "$bincompat $non_bincompat";
+
+    # wrap at 76 columns.
+
+    $opts =~ s/(?=.{53})(.{1,53}) /$1\n                        /mg;
+
+    print Config::myconfig();
+    print "\nCharacteristics of this %s: \n";
+
+    print "  Compile-time options: $opts\n";
+
+    if (@patches) {
+        print "  Locally applied patches:\n";
+        print "\t$_\n" foreach @patches;
+    }
+
+    print "  Built under %s\n";
+
+    print "  $date\n" if defined $date;
+
+    my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV;
+%s
+    if (@env) {
+        print "  \%%ENV:\n";
+        print "    $_\n" foreach @env;
+    }
+    print "  \@INC:\n";
+    print "    $_\n" foreach @INC;
+}
+
+sub header_files {
+ENDOFBEG
+
+$heavy_txt .= $header_files . "\n}\n\n";
+
 if (%need_relocation) {
   my $relocations_in_common;
   # otherlibdirs only features in the hash
@@ -638,6 +628,24 @@ foreach my $prefix (qw(libs libswanted)) {
     $heavy_txt .= "${prefix}_nolargefiles='$value'\n";
 }
 
+if (open(my $fh, "cflags")) {
+    my $ccwarnflags;
+    my $ccstdflags;
+    while (<$fh>) {
+        if (/^warn="(.+)"$/) {
+            $ccwarnflags = $1;
+        } elsif (/^stdflags="(.+)"$/) {
+            $ccstdflags = $1;
+        }
+    }
+    if (defined $ccwarnflags) {
+      $heavy_txt .= "ccwarnflags='$ccwarnflags'\n";
+    }
+    if (defined $ccstdflags) {
+      $heavy_txt .= "ccstdflags='$ccstdflags'\n";
+    }
+}
+
 $heavy_txt .= "EOVIRTUAL\n";
 
 $heavy_txt .= <<'ENDOFGIT';
@@ -984,6 +992,7 @@ if ($Opts{glossary}) {
 my %seen = ();
 my $text = 0;
 $/ = '';
+my $errors= 0;
 
 sub process {
   if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) {
@@ -1008,7 +1017,9 @@ EOF
   }
   elsif (!$text || !/\A\t/) {
     warn "Expected a Configure variable header",
-      ($text ? " or another paragraph of description" : () );
+      ($text ? " or another paragraph of description" : () ),
+      ", instead we got:\n$_";
+    $errors++;
   }
   s/n't/n\00t/g;               # leave can't, won't etc untouched
   s/^\t\s+(.*)/\n$1/gm;                # Indented lines ===> new paragraph
@@ -1017,7 +1028,7 @@ EOF
   s{([\'\"])([^\'\"\s]+)\1}(C<$2>)g; # "date" command
   s{\'([A-Za-z_\- *=/]+)\'}(C<$1>)g; # 'ln -s'
   s{
-     (?<! [\w./<\'\"] )                # Only standalone file names
+     (?<! [\w./<\'\"\$] )              # Only standalone file names
      (?! e \. g \. )           # Not e.g.
      (?! \. \. \. )            # Not ...
      (?! \d )                  # Not 5.004
@@ -1045,6 +1056,13 @@ if ($Opts{glossary}) {
     process;
     print CONFIG_POD;
   }
+  if ($errors) {
+    die "Errors encountered while processing $Glossary. ",
+        "Header lines are expected to be of the form:\n",
+        "NAME (CLASS):\n",
+        "Maybe there is a malformed header?\n",
+    ;
+  }
 }
 
 print CONFIG_POD <<'ENDOFTAIL';
@@ -1100,39 +1118,8 @@ if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
     print "updated $Config_heavy\n";
 }
 
-
-# Now create Cross.pm if needed
-if ($Opts{cross}) {
-  open CROSS, ">lib/Cross.pm" or die "Can not open >lib/Cross.pm: $!";
-  my $cross = <<'EOS';
-# typical invocation:
-#   perl -MCross Makefile.PL
-#   perl -MCross=wince -V:cc
-package Cross;
-
-sub import {
-  my ($package,$platform) = @_;
-  unless (defined $platform) {
-    # if $platform is not specified, then use last one when
-    # 'configpm; was invoked with --cross option
-    $platform = '***replace-marker***';
-  }
-  @INC = map {/\blib\b/?(do{local $_=$_;s/\blib\b/xlib\/$platform/;$_},$_):($_)} @INC;
-  $::Cross::platform = $platform;
-}
-
-1;
-EOS
-  $cross =~ s/\*\*\*replace-marker\*\*\*/$Opts{cross}/g;
-  print CROSS $cross;
-  close CROSS;
-  print "written lib/Cross.pm\n";
-  unshift(@INC,"xlib/$Opts{cross}");
-}
-
 # Now do some simple tests on the Config.pm file we have created
 unshift(@INC,'lib');
-unshift(@INC,'xlib/symbian') if $Opts{cross};
 require $Config_PM;
 require $Config_heavy;
 import Config;