Put Config.pm on a diet. 3K rather than 32K
Nicholas Clark [Sat, 27 Nov 2004 16:56:35 +0000 (16:56 +0000)]
configpm now generates 2 files, a small Config.pm containing the
commonly used functions and values, which AUTOLOADs a
Config_heavy.pl containing anything else needed.
The "common" values in the small Config.pm may need some
tweaking, based on real world data.

p4raw-id: //depot/perl@23554

Makefile.SH
configpm
vms/descrip_mms.template
win32/Makefile
win32/makefile.mk

index 3ee015c..d616c89 100644 (file)
@@ -299,7 +299,8 @@ CCCMD    = `sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $@`
 
 CCCMDSRC = `sh $(shellflags) cflags "optimize='$(OPTIMIZE)'" $<`
 
-private = preplibrary lib/Config.pm lib/ExtUtils/Miniperl.pm
+CONFIGPM = lib/Config.pm lib/Config_heavy.pl
+private = preplibrary $(CONFIGPM) lib/ExtUtils/Miniperl.pm
 
 # Files to be built with variable substitution before miniperl
 # is available.
@@ -372,10 +373,10 @@ compile: all
        cd x2p; $(MAKE) compile;
        cd pod; $(MAKE) compile;
 
-translators:   miniperl$(EXE_EXT) lib/Config.pm FORCE
+translators:   miniperl$(EXE_EXT) $(CONFIGPM) FORCE
        @echo " "; echo "       Making x2p stuff"; cd x2p; $(LDLIBPTH) $(MAKE) all
 
-utilities:     miniperl$(EXE_EXT) lib/Config.pm $(plextract) lib/lib.pm FORCE
+utilities:     miniperl$(EXE_EXT) $(CONFIGPM) $(plextract) lib/lib.pm FORCE
        @echo " "; echo "       Making utilities"; cd utils; $(LDLIBPTH) $(MAKE) all
 
 
@@ -728,7 +729,7 @@ sperl$(OBJ_EXT): perl.c $(h)
 # We need to autosplit in two steps because VOS can't handle so many args
 #
 .PHONY: preplibrary
-preplibrary: miniperl$(EXE_EXT) lib/Config.pm lib/lib.pm $(PREPLIBRARY_LIBPERL)
+preplibrary: miniperl$(EXE_EXT) $(CONFIGPM) lib/lib.pm $(PREPLIBRARY_LIBPERL)
        @sh ./makedir lib/auto
        @echo " AutoSplitting perl library"
        $(LDLIBPTH) ./miniperl -Ilib -e 'use AutoSplit; \
@@ -740,11 +741,11 @@ preplibrary: miniperl$(EXE_EXT) lib/Config.pm lib/lib.pm $(PREPLIBRARY_LIBPERL)
 # Take care to avoid modifying lib/Config.pm without reason
 # (If trying to create a new port and having problems with the configpm script,
 # try 'make minitest' and/or commenting out the tests at the end of configpm.)
-lib/Config.pm: config.sh miniperl$(EXE_EXT) configpm Porting/Glossary
-       $(LDLIBPTH) ./miniperl -Ilib configpm configpm.tmp
-       sh mv-if-diff configpm.tmp $@
+$(CONFIGPM): config.sh miniperl$(EXE_EXT) configpm Porting/Glossary
+       $(LDLIBPTH) ./miniperl -Ilib configpm --heavy=lib/Config_heavy.pl configpm.tmp
+       sh mv-if-diff configpm.tmp lib/Config.pm
 
-lib/ExtUtils/Miniperl.pm: miniperlmain.c miniperl$(EXE_EXT) minimod.pl lib/Config.pm
+lib/ExtUtils/Miniperl.pm: miniperlmain.c miniperl$(EXE_EXT) minimod.pl $(CONFIGPM)
        $(LDLIBPTH) ./miniperl minimod.pl > minimod.tmp
        sh mv-if-diff minimod.tmp $@
        -touch lib/ExtUtils/Miniperl.pm
@@ -752,18 +753,18 @@ lib/ExtUtils/Miniperl.pm: miniperlmain.c miniperl$(EXE_EXT) minimod.pl lib/Confi
 lib/re.pm: ext/re/re.pm
        cp ext/re/re.pm ext/re/re.tmp && sh mv-if-diff ext/re/re.tmp lib/re.pm
 
-$(plextract):  miniperl$(EXE_EXT) lib/Config.pm x2p/s2p
+$(plextract):  miniperl$(EXE_EXT) $(CONFIGPM) x2p/s2p
        @-rm -f $@
        $(LDLIBPTH) ./miniperl -Ilib $@.PL
 
-x2p/s2p: miniperl$(EXE_EXT) lib/Config.pm x2p/s2p.PL
+x2p/s2p: miniperl$(EXE_EXT) $(CONFIGPM) x2p/s2p.PL
        cd x2p; $(LDLIBPTH) $(MAKE) s2p
 
-lib/lib.pm:    miniperl$(EXE_EXT) lib/Config.pm
+lib/lib.pm:    miniperl$(EXE_EXT) $(CONFIGPM)
        @-rm -f $@
        $(LDLIBPTH) ./miniperl -Ilib lib/lib_pm.PL
 
-$(unidatafiles): miniperl$(EXE_EXT) lib/Config.pm lib/unicore/mktables
+$(unidatafiles): miniperl$(EXE_EXT) $(CONFIGPM) lib/unicore/mktables
        cd lib/unicore && $(LDLIBPTH) ../../miniperl -I../../lib mktables -w
 
 extra.pods: miniperl$(EXE_EXT)
index 9b83df0..3f4cb46 100755 (executable)
--- a/configpm
+++ b/configpm
@@ -17,9 +17,10 @@ my %Extensions = map {($_,$_)}
 
 # allowed opts as well as specifies default and initial values
 my %Allowed_Opts = (
-    'cross'    => '', # --cross=PALTFORM - crosscompiling for PLATFORM
-    'glossary' => 1,  # --no-glossary  - no glossary file inclusion, 
+    'cross'    => '', # --cross=PLATFORM - crosscompiling for PLATFORM
+    'glossary' => 1,  # --no-glossary  - no glossary file inclusion,
                       #                  for compactness
+    'heavy' => '',   # pathname of the Config_heavy.pl file
 );
 
 sub opts {
@@ -44,7 +45,7 @@ sub opts {
 
 my %Opts = opts();
 
-my $Config_PM;
+my ($Config_PM, $Config_heavy);
 my $Glossary = $ARGV[1] || 'Porting/Glossary';
 
 if ($Opts{cross}) {
@@ -56,9 +57,27 @@ if ($Opts{cross}) {
 else {
   $Config_PM = $ARGV[0] || 'lib/Config.pm';
 }
-
+if ($Opts{heavy}) {
+  $Config_heavy = $Opts{heavy};
+}
+else {
+  ($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;
+}
 
 open CONFIG, ">$Config_PM" or die "Can't open $Config_PM: $!\n";
+open CONFIG_HEAVY, ">$Config_heavy" or die "Can't open $Config_heavy: $!\n";
+
+print CONFIG_HEAVY <<'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; Pulls in Carp
+# use vars pulls in Carp
+ENDOFBEG
 
 my $myver = sprintf "v%vd", $^V;
 
@@ -239,32 +258,33 @@ if ($s == 4 || $s == 8) {
 my \$i = 0;
 foreach my \$c ($list) { \$i |= ord(\$c); \$i <<= 8 }
 \$i |= ord(1);
-my \$byteorder = join('', unpack('$format', pack('$f', \$i)));
+our \$byteorder = join('', unpack('$format', pack('$f', \$i)));
 EOT
 } else {
-    $byteorder_code = "my \$byteorder = '?'x$s;\n";
+    $byteorder_code = "our \$byteorder = '?'x$s;\n";
 }
+print CONFIG $byteorder_code;
 
-print CONFIG @non_v, "\n";
+print CONFIG_HEAVY @non_v, "\n";
 
 # copy config summary format from the myconfig.SH script
-print CONFIG "our \$summary : unique = <<'!END!';\n";
+print CONFIG_HEAVY "our \$summary : unique = <<'!END!';\n";
 open(MYCONFIG,"<myconfig.SH") || die "open myconfig.SH failed: $!";
 1 while defined($_ = <MYCONFIG>) && !/^Summary of/;
-do { print CONFIG $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
+do { print CONFIG_HEAVY $_ } until !defined($_ = <MYCONFIG>) || /^\s*$/;
 close(MYCONFIG);
 
 # NB. as $summary is unique, we need to copy it in a lexical variable
 # before expanding it, because may have been made readonly if a perl
 # interpreter has been cloned.
 
-print CONFIG "\n!END!\n", $byteorder_code, <<'EOT';
+print CONFIG_HEAVY "\n!END!\n", <<'EOT';
 my $summary_expanded;
 
 sub myconfig {
     return $summary_expanded if $summary_expanded;
     ($summary_expanded = $summary) =~ s{\$(\w+)}
-                { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge;
+                { my $c = $Config::Config{$1}; defined($c) ? $c : 'undef' }ge;
     $summary_expanded;
 }
 
@@ -272,11 +292,11 @@ local *_ = \my $a;
 $_ = <<'!END!';
 EOT
 
-print CONFIG join("", @v_fast, sort @v_others);
+print CONFIG_HEAVY join("", @v_fast, sort @v_others);
 
-print CONFIG <<'EOT';
+print CONFIG_HEAVY <<'EOT';
 !END!
-s/(byteorder=)(['"]).*?\2/$1$2$byteorder$2/m;
+s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m;
 our $Config_SH : unique = $_;
 
 our $Config_SH_expanded : unique = "\n$_" . << 'EOVIRTUAL';
@@ -286,7 +306,7 @@ foreach my $prefix (qw(ccflags ldflags)) {
     my $value = fetch_string ({}, $prefix);
     my $withlargefiles = fetch_string ({}, $prefix . "_uselargefiles");
     $value =~ s/\Q$withlargefiles\E\b//;
-    print CONFIG "${prefix}_nolargefiles='$value'\n";
+    print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n";
 }
 
 foreach my $prefix (qw(libs libswanted)) {
@@ -307,16 +327,16 @@ foreach my $prefix (qw(libs libswanted)) {
            $value = join(' ', @libswanted);
        }
     }
-    print CONFIG "${prefix}_nolargefiles='$value'\n";
+    print CONFIG_HEAVY "${prefix}_nolargefiles='$value'\n";
 }
 
-print CONFIG "EOVIRTUAL\n";
+print CONFIG_HEAVY "EOVIRTUAL\n";
 
-print CONFIG $fetch_string;
+print CONFIG_HEAVY $fetch_string;
 
 print CONFIG <<'ENDOFEND';
 
-sub FETCH { 
+sub FETCH {
     my($self, $key) = @_;
 
     # check for cached value (which may be undef so we use exists not defined)
@@ -324,7 +344,9 @@ sub FETCH {
 
     return $self->fetch_string($key);
 }
+ENDOFEND
+
+print CONFIG_HEAVY <<'ENDOFEND';
 my $prevpos = 0;
 
 sub FIRSTKEY {
@@ -380,13 +402,21 @@ sub config_vars {
            print map "$_$lnend", @matches ? @matches : "$qry: not found"               if !$notag;
            print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found"  if  $notag;
        } else {
-           my $v = (exists $Config{$qry}) ? $Config{$qry} : 'UNKNOWN';
+           my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry}
+                                                  : 'UNKNOWN';
            $v = 'undef' unless defined $v;
            print "${prfx}'${v}'$lnend";
        }
     }
 }
 
+# Called by the real AUTOLOAD
+sub launcher {
+    undef &AUTOLOAD;
+    goto \&$Config::AUTOLOAD;
+}
+
+1;
 ENDOFEND
 
 if ($^O eq 'os2') {
@@ -426,9 +456,14 @@ my $fast_config = join '', map { "    $_,\n" }
 
 print CONFIG sprintf <<'ENDOFTIE', $fast_config;
 
-# avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD
 sub DESTROY { }
 
+sub AUTOLOAD {
+    require 'config_heavy.pl';
+    goto \&launcher;
+    die "&Config::AUTOLOAD failed on $Config::AUTOLOAD";
+}
+
 tie %%Config, 'Config', {
 %s
 };
@@ -635,6 +670,7 @@ outside of it.
 
 ENDOFTAIL
 
+close(CONFIG_HEAVY);
 close(CONFIG);
 close(GLOS);
 close(CONFIG_POD);
index 271ae01..76af39c 100644 (file)
@@ -475,6 +475,10 @@ $(ARCHDIR)Config.pm : [.lib]Config.pm
        Create/Directory $(ARCHDIR)
        Copy/NoConfirm/Log $(MMS$SOURCE) $(ARCHDIR)
 
+$(ARCHDIR)Config_heavy.pl : [.lib]Config_heavy.pl
+       Create/Directory $(ARCHDIR)
+       Copy/NoConfirm/Log $(MMS$SOURCE) $(ARCHDIR)
+
 [.lib]Config.pm : config.h $(MINIPERL_EXE)
        $(MINIPERL) ConfigPM.
 
@@ -1303,6 +1307,7 @@ archify : all
        Backup/Log/Verify [.lib.auto...]*.*;/Exclude=(*.al,*.ix) 'archroot'/New_Version
        Delete/Log/NoConfirm [.lib.auto...]*.*;*/exclude=(*.al,*.ix,*.dir)
        Delete/Log/NoConfirm [.lib]Config.pm;*
+       Delete/Log/NoConfirm [.lib]Config_heavy.pl;*
        Copy/Log/NoConfirm *$(E);,[.x2p]$(DBG)a2p$(E); $(ARCHDIR)
        Delete/Log/NoConfirm Perl*$(E);*,[.x2p]$(DBG)a2p$(E);*
        @ QUALIFIERS := $(MMSQUALIFIERS)
@@ -1638,6 +1643,8 @@ tidy : cleanlis
        - If F$Search("[.Lib]XSLoader.pm;-1").nes."" Then Purge/NoConfirm/Log [.Lib]XSLoader.pm
        - If F$Search("[.Lib]Config.pm;-1").nes."" Then Purge/NoConfirm/Log [.Lib]Config.pm
        - If F$Search("$(ARCHDIR)Config.pm;-1").nes."" Then Purge/NoConfirm/Log $(ARCHDIR)Config.pm
+       - If F$Search("[.Lib]Config_heavy.pl;-1").nes."" Then Purge/NoConfirm/Log [.Lib]Config_heavy.pl
+       - If F$Search("$(ARCHDIR)Config_heavy.pl;-1").nes."" Then Purge/NoConfirm/Log $(ARCHDIR)Config_heavy.pl
        - If F$Search("[.lib.ExtUtils]Miniperl.pm").nes."" Then Purge/NoConfirm/Log [.lib.ExtUtils]Miniperl.pm
        - If F$Search("[.lib.ExtUtils]XSSymSet.pm").nes."" Then Purge/NoConfirm/Log [.lib.ExtUtils]XSSymSet.pm
        - If F$Search("[.Lib.VMS]*.*;-1").nes."" Then Purge/NoConfirm/Log [.Lib.VMS]*.*
@@ -1688,11 +1695,13 @@ realclean : clean
        - If F$Search("[.Lib]DynaLoader.pm").nes."" Then Delete/NoConfirm/Log [.Lib]DynaLoader.pm;*
        - If F$Search("[.Lib]XSLoader.pm").nes."" Then Delete/NoConfirm/Log [.Lib]XSLoader.pm;*
        - If F$Search("[.Lib]Config.pm").nes."" Then Delete/NoConfirm/Log [.Lib]Config.pm;*
+       - If F$Search("[.Lib]Config_heavy.pl").nes."" Then Delete/NoConfirm/Log [.Lib]Config_heavy.pl;*
        - If F$Search("[.Lib]*.com").nes."" Then Delete/NoConfirm/Log [.Lib]*.com;*
        - If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log [.pod]*.com;*
        - If F$Search("[.utils]*.com").nes."" Then Delete/NoConfirm/Log [.utils]*.com;*
        - If F$Search("[.x2p]*.com").nes."" Then Delete/NoConfirm/Log [.x2p]*.com;*
        - If F$Search("$(ARCHDIR)Config.pm").nes."" Then Delete/NoConfirm/Log $(ARCHDIR)Config.pm;*
+       - If F$Search("$(ARCHDIR)Config_heavy.pl").nes."" Then Delete/NoConfirm/Log $(ARCHDIR)Config_heavy.pl;*
        - If F$Search("[.lib.ExtUtils]Miniperl.pm").nes."" Then Delete/NoConfirm/Log [.lib.ExtUtils]Miniperl.pm;*
        - If F$Search("[.lib.ExtUtils]XSSymSet.pm").nes."" Then Delete/NoConfirm/Log [.lib.ExtUtils]XSSymSet.pm;*
        - If F$Search("[.lib.pod]*.pod").nes."" Then Delete/NoConfirm/Log [.lib.pod]*.pod;*
index ae2ed4c..b03c1c9 100644 (file)
@@ -447,7 +447,7 @@ MINIDIR             = .\mini
 PERLEXE                = ..\perl.exe
 WPERLEXE       = ..\wperl.exe
 GLOBEXE                = ..\perlglob.exe
-CONFIGPM       = ..\lib\Config.pm
+CONFIGPM       = ..\lib\Config.pm ..\Config_heavy.pl
 MINIMOD                = ..\lib\ExtUtils\Miniperl.pm
 X2P            = ..\x2p\a2p.exe
 
index 1117f28..095be64 100644 (file)
@@ -584,7 +584,7 @@ MINIDIR             = .\mini
 PERLEXE                = ..\perl.exe
 WPERLEXE       = ..\wperl.exe
 GLOBEXE                = ..\perlglob.exe
-CONFIGPM       = ..\lib\Config.pm
+CONFIGPM       = ..\lib\Config.pm ..\lib\Config_heavy.pl
 MINIMOD                = ..\lib\ExtUtils\Miniperl.pm
 X2P            = ..\x2p\a2p.exe