This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
parts/apicheck.pl: Handle const parameters
[perl5.git] / configpm
index 5484b18..88f0150 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
 
 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
 
 use strict;
-use vars qw(%Config $Config_SH_expanded);
+our (%Config, $Config_SH_expanded);
 
 my $how_many_common = 22;
 
@@ -92,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
@@ -159,7 +155,7 @@ $config_txt .= sprintf << 'EOT', $], $export_funcs;
 package Config;
 use strict;
 use warnings;
-use vars '%%Config', '$VERSION';
+our ( %%Config, $VERSION );
 
 $VERSION = "%s";
 
@@ -216,11 +212,24 @@ my $in_v     = 0;
 my %Data     = ();
 my $quote;
 
+# These variables were set in older versions of Perl, but are no longer needed
+# by the core. However, some CPAN modules may rely on them; in particular, Tk
+# (at least up to version 804.034) fails to build without them. We force them
+# to be emitted to Config_heavy.pl for backcompat with such modules (and we may
+# find that this set needs to be extended in future). See RT#132347.
+my @v_forced = map "$_\n", split /\n+/, <<'EOT';
+i_limits='define'
+i_stdlib='define'
+i_string='define'
+i_time='define'
+prototype='define'
+EOT
+
 
 my %seen_quotes;
 {
   my ($name, $val);
-  open(CONFIG_SH, $Config_SH) || die "Can't open $Config_SH: $!";
+  open(CONFIG_SH, '<', $Config_SH) || die "Can't open $Config_SH: $!";
   while (<CONFIG_SH>) {
     next if m:^#!/bin/sh:;
 
@@ -252,6 +261,9 @@ my %seen_quotes;
     else { 
        $quote = $2;
         ($name,$val) = ($1,$3); 
+       if ($name eq 'cc') {
+           $val =~ s{^(['"]?+).*\bccache\s+}{$1};
+       }
     }
     $in_v = $val !~ /$quote\n/;
     next if $in_v;
@@ -320,7 +332,7 @@ die if $@;
 
 # Calculation for the keys for byteorder
 # This is somewhat grim, but I need to run fetch_string here.
-our $Config_SH_expanded = join "\n", '', @v_others;
+$Config_SH_expanded = join "\n", '', @v_others;
 
 my $t = fetch_string ({}, 'ivtype');
 my $s = fetch_string ({}, 'ivsize');
@@ -457,7 +469,7 @@ $heavy_txt .= sprintf <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwi
 package Config;
 use strict;
 use warnings;
-use vars '%%Config';
+our %%Config;
 
 sub bincompat_options {
     return split ' ', (Internals::V())[0];
@@ -482,20 +494,17 @@ 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;
+    my @opts = sort split ' ', "$bincompat $non_bincompat";
 
     print Config::myconfig();
     print "\nCharacteristics of this %s: \n";
 
-    print "  Compile-time options: $opts\n";
+    print "  Compile-time options:\n";
+    print "    $_\n" for @opts;
 
     if (@patches) {
         print "  Locally applied patches:\n";
-        print "\t$_\n" foreach @patches;
+        print "    $_\n" foreach @patches;
     }
 
     print "  Built under %s\n";
@@ -534,7 +543,7 @@ $heavy_txt .= join('', @non_v) . "\n";
 
 # copy config summary format from the myconfig.SH script
 $heavy_txt .= "our \$summary = <<'!END!';\n";
-open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
+open(MYCONFIG,'<','myconfig.SH') || die "open myconfig.SH failed: $!";
 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
 do { $heavy_txt .= $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
 close(MYCONFIG);
@@ -564,8 +573,17 @@ sub myconfig {
 local *_ = \my $a;
 $_ = <<'!END!';
 EOT
-
-$heavy_txt .= join('', sort @v_others) . "!END!\n";
+#proper lexicographical order of the keys
+my %seen_var;
+$heavy_txt .= join('',
+    map { $_->[-1] }
+    sort {$a->[0] cmp $b->[0] }
+    grep { !$seen_var{ $_->[0] }++ }
+    map {
+        /^([^=]+)/ ? [ $1, $_ ]
+                   : [ $_, $_ ] # shouldnt happen
+    } @v_others, @v_forced
+) . "!END!\n";
 
 # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of
 # the precached keys
@@ -632,6 +650,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';
@@ -820,10 +856,12 @@ tie %%Config, 'Config', {
 ENDOFTIE
 
 
-open(CONFIG_POD, ">$Config_POD") or die "Can't open $Config_POD: $!";
+open(CONFIG_POD, '>', $Config_POD) or die "Can't open $Config_POD: $!";
 print CONFIG_POD <<'ENDOFTAIL';
 =head1 NAME
 
+=for comment  Generated by configpm.  Any changes made here will be lost!
+
 Config - access Perl configuration information
 
 =head1 SYNOPSIS
@@ -973,11 +1011,12 @@ in such cases.
 ENDOFTAIL
 
 if ($Opts{glossary}) {
-  open(GLOS, "<$Glossary") or die "Can't open $Glossary: $!";
+  open(GLOS, '<', $Glossary) or die "Can't open $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) {
@@ -986,23 +1025,21 @@ sub process {
       print CONFIG_POD <<EOF if $text;
 =back
 
-=cut
-
 EOF
       print CONFIG_POD <<EOF;
 =head2 $c
 
 =over 4
 
-=cut
-
 EOF
      $text = 1;
     }
   }
   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
@@ -1039,6 +1076,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';
@@ -1096,7 +1140,6 @@ if ($orig_config_txt ne $config_txt or $orig_heavy_txt ne $heavy_txt) {
 
 # 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;