Change 31784 by [EMAIL PROTECTED] on 2007/09/03 11:04:04

        Add Win32 makefile option to link all extensions statically
        
        Subject: [PATCH-at31768] RE: [PATCH at 31761] RE: MakeMaker + static 
misbehaviour
        From: "Konovalov, Vadim Vladimirovich (Vadim)** CTR **" <[EMAIL 
PROTECTED]>
        Date: Fri, 31 Aug 2007 08:56:47 +0200
        Message-ID: <[EMAIL PROTECTED]>
        
        (with a couple of tweaks to comments in Makefile, exclusion of one more
        module (Hash/Utils) from the "all static" build option, plus the same
        changes in makefile.mk)

Affected files ...

... //depot/perl/win32/FindExt.pm#13 edit
... //depot/perl/win32/Makefile#342 edit
... //depot/perl/win32/buildext.pl#16 edit
... //depot/perl/win32/makefile.mk#381 edit

Differences ...

==== //depot/perl/win32/FindExt.pm#13 (text) ====
Index: perl/win32/FindExt.pm
--- perl/win32/FindExt.pm#12~31103~     2007-04-27 10:12:05.000000000 -0700
+++ perl/win32/FindExt.pm       2007-09-03 04:04:04.000000000 -0700
@@ -1,6 +1,6 @@
 package FindExt;
 
-our $VERSION = '1.01';
+our $VERSION = '1.02';
 
 use strict;
 use warnings;
@@ -20,12 +20,18 @@
     return $ENV{'PWD'} = $_;
 }
 
-sub set_static_extensions
-{
+sub set_static_extensions {
     # adjust results of scan_ext, and also save
     # statics in case scan_ext hasn't been called yet.
+    # if '*' is passed then all XS extensions are static
+    # (with possible exclusions)
     %static = ();
-    for (@_) {
+    my @list = @_;
+    if ($_[0] eq '*') {
+       my %excl = map {$_=>1} map {m/^!(.*)$/} @_[1 .. $#_];
+       @list = grep {!exists $excl{$_}} keys %ext;
+    }
+    for (@list) {
         $static{$_} = 1;
         $ext{$_} = 'static' if $ext{$_} && $ext{$_} eq 'dynamic';
     }

==== //depot/perl/win32/Makefile#342 (text) ====
Index: perl/win32/Makefile
--- perl/win32/Makefile#341~31761~      2007-08-29 09:58:25.000000000 -0700
+++ perl/win32/Makefile 2007-09-03 04:04:04.000000000 -0700
@@ -169,13 +169,22 @@
 #
 # set this to additionally provide a statically linked perl-static.exe.
 # Note that dynamic loading will not work with this perl, so you must
-# include required modules statically using STATIC_EXT variable below.
-# A static library perl59s.lib will also be created.
+# include required modules statically using the STATIC_EXT or ALL_STATIC
+# variables below. A static library perl59s.lib will also be created.
 # Ordinary perl.exe is not affected by this option.
 #
 #BUILD_STATIC  = define
 
 #
+# in addition to BUILD_STATIC the option ALL_STATIC makes *every*
+# extension get statically built
+# This will result in a very large perl executable, but the main purpose
+# is to have proper linking set so as to be able to create miscellaneous
+# executables with different built-in extensions
+#
+#ALL_STATIC    = define
+
+#
 #
 # set the install locations of the compiler include/libraries
 # Running VCVARS32.BAT is *required* when using Visual C.
@@ -784,9 +793,18 @@
 SETARGV_OBJ    = setargv$(o)
 !ENDIF
 
-# specify static extensions here
+!IF "$(ALL_STATIC)" == "define"
+# some exclusions, unfortunately, until fixed:
+#  - Win32 extension contains overlapped symbols with win32.c (BUG!)
+#  - MakeMaker isn't capable enough for SDBM_File (smaller bug)
+#  - Encode (encoding search algorithm relies on shared library?)
+#  - Hash/Util (fails various tests when linked statically)
+STATIC_EXT     = * !Win32 !SDBM_File !Encode !Hash/Util
+!ELSE
+# specify static extensions here, for example:
 #STATIC_EXT    = Cwd Compress/Raw/Zlib
 STATIC_EXT     = Win32CORE
+!ENDIF
 
 DYNALOADER     = $(EXTDIR)\DynaLoader\DynaLoader
 
@@ -822,8 +840,8 @@
 # Top targets
 #
 
-all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE) \
-       $(X2P) MakePPPort Extensions $(PERLSTATIC)
+all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(UNIDATAFILES) MakePPPort \
+       $(PERLEXE) $(X2P) Extensions $(PERLSTATIC)
        @echo   Everything is up to date. '$(MAKE_BARE) test' to run test suite.
 
 ..\regnodes.h : ..\regcomp.sym ..\regcomp.pl ..\regexp.h
@@ -1011,7 +1029,7 @@
 
 $(PERLEXESTATIC): $(PERLSTATICLIB) $(CONFIGPM) $(PERLEXEST_OBJ) $(PERLEXE_RES)
        $(LINK32) -subsystem:console -out:$@ -stack:0x1000000 $(LINK_FLAGS) \
-           @Extensions_static $(PERLSTATICLIB) \
+           @Extensions_static $(PERLSTATICLIB) /PDB:NONE \
            $(LIBFILES) $(PERLEXEST_OBJ) $(SETARGV_OBJ) $(PERLEXE_RES)
        $(EMBED_EXE_MANI)
 

==== //depot/perl/win32/buildext.pl#16 (text) ====
Index: perl/win32/buildext.pl
--- perl/win32/buildext.pl#15~28293~    2006-05-23 19:53:38.000000000 -0700
+++ perl/win32/buildext.pl      2007-09-03 04:04:04.000000000 -0700
@@ -63,8 +63,7 @@
     print $fh "#ifdef STATIC2\n",(map {"    EXTERN_C void boot_$_ (pTHX_ CV* 
cv);\n"} @statics1),"#undef STATIC2\n#endif\n";
     print $fh "#ifdef STATIC3\n",(map {"    
newXS(\"$statics2[$_]::bootstrap\", boot_$statics1[$_], file);\n"} 0 .. 
$#statics),"#undef STATIC3\n#endif\n";
     close $fh;
-  }
-  else {
+  } else {
     my %extralibs;
     for (@statics) {
       open my $fh, "<..\\lib\\auto\\$_\\extralibs.ld" or die "can't open 
<..\\lib\\auto\\$_\\extralibs.ld: $!";
@@ -76,17 +75,14 @@
   exit(0);
 }
 
-my $here = getcwd();
+(my $here = getcwd()) =~ s{/}{\\}g;
 my $perl = $^X;
-$here =~ s,/,\\,g;
-if ($perl =~ m#^\.\.#)
- {
-  $perl = "$here\\$perl";
- }
+if ($perl =~ m#^\.\.#) {
+    $perl = "$here\\$perl";
+}
 (my $topdir = $perl) =~ s/\\[^\\]+$//;
 # miniperl needs to find perlglob and pl2bat
 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
-#print "PATH=$ENV{PATH}\n";
 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
 unless (-f "$pl2bat.bat") {
     my @args = ($perl, ("$pl2bat.pl") x 2);
@@ -100,7 +96,7 @@
 my $dir  = shift;
 chdir($dir) || die "Cannot cd to $dir\n";
 my $targ  = shift;
-(my $ext = getcwd()) =~ s,/,\\,g;
+(my $ext = getcwd()) =~ s{/}{\\}g;
 my $code;
 FindExt::scan_ext($ext);
 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne 
"ext";

==== //depot/perl/win32/makefile.mk#381 (text) ====
Index: perl/win32/makefile.mk
--- perl/win32/makefile.mk#380~31761~   2007-08-29 09:58:25.000000000 -0700
+++ perl/win32/makefile.mk      2007-09-03 04:04:04.000000000 -0700
@@ -187,13 +187,22 @@
 #
 # set this to additionally provide a statically linked perl-static.exe.
 # Note that dynamic loading will not work with this perl, so you must
-# include required modules statically using STATIC_EXT variable below.
-# A static library perl59s.lib will also be created.
+# include required modules statically using the STATIC_EXT or ALL_STATIC
+# variables below. A static library perl59s.lib will also be created.
 # Ordinary perl.exe is not affected by this option.
 #
 #BUILD_STATIC  *= define
 
 #
+# in addition to BUILD_STATIC the option ALL_STATIC makes *every*
+# extension get statically built
+# This will result in a very large perl executable, but the main purpose
+# is to have proper linking set so as to be able to create miscellaneous
+# executables with different built-in extensions
+#
+#ALL_STATIC    *= define
+
+#
 # set the install locations of the compiler include/libraries
 # Running VCVARS32.BAT is *required* when using Visual C.
 # Some versions of Visual C don't define MSVCDIR in the environment,
@@ -940,9 +949,18 @@
 SETARGV_OBJ    = setargv$(o)
 .ENDIF
 
-# specify static extensions here
+.IF "$(ALL_STATIC)" == "define"
+# some exclusions, unfortunately, until fixed:
+#  - Win32 extension contains overlapped symbols with win32.c (BUG!)
+#  - MakeMaker isn't capable enough for SDBM_File (smaller bug)
+#  - Encode (encoding search algorithm relies on shared library?)
+#  - Hash/Util (fails various tests when linked statically)
+STATIC_EXT     = * !Win32 !SDBM_File !Encode !Hash/Util
+.ELSE
+# specify static extensions here, for example:
 #STATIC_EXT    = Cwd Compress/Raw/Zlib
 STATIC_EXT     = Win32CORE
+.ENDIF
 
 DYNALOADER     = $(EXTDIR)\DynaLoader\DynaLoader
 
@@ -1010,8 +1028,8 @@
 #
 
 all : CHECKDMAKE .\config.h $(GLOBEXE) $(MINIPERL) $(MK2)              \
-       $(RIGHTMAKE) $(MINIMOD) $(CONFIGPM) $(UNIDATAFILES) $(PERLEXE)  \
-       $(X2P) MakePPPort Extensions $(PERLSTATIC)
+       $(RIGHTMAKE) $(MINIMOD) $(CONFIGPM) $(UNIDATAFILES) MakePPPort  \
+       $(PERLEXE) $(X2P) Extensions $(PERLSTATIC)
 
 ..\regnodes.h : ..\regcomp.sym ..\regcomp.pl ..\regexp.h
        cd .. && regcomp.pl && cd win32
@@ -1341,7 +1359,7 @@
                $(PERLEXE_RES) $(LKPOST))
 .ELSE
        $(LINK32) -subsystem:console -out:$@ -stack:0x1000000 $(BLINK_FLAGS) \
-           @Extensions_static $(PERLSTATICLIB) \
+           @Extensions_static $(PERLSTATICLIB) /PDB:NONE \
            $(LIBFILES) $(PERLEXEST_OBJ) $(SETARGV_OBJ) $(PERLEXE_RES)
        $(EMBED_EXE_MANI)
 .ENDIF
End of Patch.

Reply via email to