From: Nicholas Clark Date: Mon, 2 Feb 2009 21:42:33 +0000 (+0000) Subject: Fold win32/buildext.pl into make_ext.pl X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=286d62c215d35caf69b83afb884cdaa350bd6aa3;p=p5sagit%2Fp5-mst-13.2.git Fold win32/buildext.pl into make_ext.pl --- diff --git a/MANIFEST b/MANIFEST index 4286b97..5713bde 100644 --- a/MANIFEST +++ b/MANIFEST @@ -4338,7 +4338,6 @@ win32/bin/perlglob.pl Win32 globbing win32/bin/pl2bat.pl wrap perl scripts into batch files win32/bin/runperl.pl run perl script via batch file namesake win32/bin/search.pl Win32 port -win32/buildext.pl Build extensions once miniperl is built win32/ce-helpers/cecopy-lib.pl WinCE port win32/ce-helpers/compile-all.bat WinCE port win32/ce-helpers/compile.bat WinCE port diff --git a/make_ext.pl b/make_ext.pl index 422d580..db3a1af 100644 --- a/make_ext.pl +++ b/make_ext.pl @@ -2,13 +2,42 @@ use strict; use warnings; use Config; +use Cwd; # This script acts as a simple interface for building extensions. -# It primarily used by the perl Makefile: + +# It's actually a cut and shut of the Unix version ext/utils/makeext and the +# Windows version win32/build_ext.pl hence the two invocation styles. + +# On Unix, it primarily used by the perl Makefile one extention at a time: # # d_dummy $(dynamic_ext): miniperl preplibrary FORCE # @$(RUN) ./miniperl make_ext.pl --target=dynamic $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL) # +# On Windows, +# If '--static' is specified, static extensions will be built. +# If '--dynamic' is specified, dynamic (and nonxs) extensions will be built. +# If '--all' is specified, all extensions will be built. +# +# make_ext.pl "MAKE=make [-make_opts]" --dir=directory [--target=target] [--static|--dynamic|--all] +ext2 !ext1 +# +# E.g. +# +# make_ext.pl "MAKE=nmake -nologo" --dir=..\ext +# +# make_ext.pl "MAKE=nmake -nologo" --dir=..\ext --target=clean +# +# make_ext.pl MAKE=dmake --dir=..\ext +# +# make_ext.pl MAKE=dmake --dir=..\ext --target=clean +# +# Will skip building extensions which are marked with an '!' char. +# Mostly because they still not ported to specified platform. +# +# If any extensions are listed with a '+' char then only those +# extensions will be built, but only if they arent countermanded +# by an '!ext' and are appropriate to the type of building being done. + # It may be deleted in a later release of perl so try to # avoid using it for other purposes. @@ -16,6 +45,8 @@ my $is_Win32 = $^O eq 'MSWin32'; my $is_VMS = $^O eq 'VMS'; my $is_Unix = !$is_Win32 && !$is_VMS; +require FindExt if $is_Win32; + my (%excl, %incl, %opts, @extspec, @pass_through); foreach (@ARGV) { @@ -34,6 +65,9 @@ foreach (@ARGV) { } } +my $static = $opts{static} || $opts{all}; +my $dynamic = $opts{dynamic} || $opts{all}; + # The Perl Makefile.SH will expand all extensions to # lib/auto/X/X.a (or lib/auto/X/Y/Y.a if nested) # A user wishing to run make_ext might use @@ -61,6 +95,7 @@ foreach (@extspec) { my $makecmd = shift @pass_through; # Should be something like MAKE=make unshift @pass_through, 'PERL_CORE=1'; +my $dir = $opts{dir} || 'ext'; my $target = $opts{target}; $target = 'all' unless defined $target; @@ -83,9 +118,6 @@ my @make = split ' ', $1 || $Config{make} || $ENV{MAKE}; my @run = $Config{run}; @run = () if not defined $run[0] or $run[0] eq ''; -if (!@extspec) { - die "$0: no extension specified\n"; -} if ($target eq '') { die "make_ext: no make target specified (eg all or clean)\n"; @@ -94,6 +126,56 @@ if ($target eq '') { die "$0: unknown make target '$target'\n"; } +if (!@extspec and !$static and !$dynamic) { + die "$0: no extension specified\n"; +} + +my $perl; +my %extra_passthrough; + +if ($is_Win32) { + (my $here = getcwd()) =~ s{/}{\\}g; + $perl = $^X; + 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}"; + my $pl2bat = "$topdir\\win32\\bin\\pl2bat"; + unless (-f "$pl2bat.bat") { + my @args = ($perl, ("$pl2bat.pl") x 2); + print "@args\n"; + system(@args) unless defined $::Cross::platform; + } + + print "In ", getcwd(); + chdir($dir) || die "Cannot cd to $dir\n"; + (my $ext = getcwd()) =~ s{/}{\\}g; + FindExt::scan_ext($ext); + FindExt::set_static_extensions(split ' ', $Config{static_ext}); + + my @ext; + push @ext, FindExt::static_ext() if $static; + push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic; + + foreach (sort @ext) { + if (%incl and !exists $incl{$_}) { + #warn "Skipping extension $ext\\$_, not in inclusion list\n"; + next; + } + if (exists $excl{$_}) { + warn "Skipping extension $ext\\$_, not ported to current platform"; + next; + } + push @extspec, $_; + if(FindExt::is_static($_)) { + push @{$extra_passthrough{$_}}, 'LINKTYPE=static'; + } + } + chdir '..'; # now in the Perl build directory +} + foreach my $pname (@extspec) { my $mname = $pname; $mname =~ s!/!::!g; @@ -101,7 +183,6 @@ foreach my $pname (@extspec) { $depth =~ s![^/]+!..!g; # Always need one more .. for ext/ my $up = "../$depth"; - my $perl = "$up/miniperl"; if ($Config{osname} eq 'catamount') { # Snowball's chance of building extensions. @@ -110,8 +191,9 @@ foreach my $pname (@extspec) { print "\tMaking $mname ($target)\n"; - build_extension('ext', "ext/$pname", $up, $perl, "$up/lib", - \@pass_through); + build_extension('ext', "ext/$pname", $up, $perl || "$up/miniperl", + "$up/lib", + [@pass_through, @{$extra_passthrough{$pname} || []}]); } sub build_extension { diff --git a/win32/Makefile b/win32/Makefile index d5389d5..75fab78 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -1061,24 +1061,24 @@ MakePPPort_clean: -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\mkppport --clean #------------------------------------------------------------------------------- -Extensions: buildext.pl $(PERLDEP) $(CONFIGPM) +Extensions: ..\make_ext.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic -Extensions_reonly: buildext.pl $(PERLDEP) $(CONFIGPM) +Extensions_reonly: ..\make_ext.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic +re + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic +re -Extensions_static : buildext.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) +Extensions_static : ..\make_ext.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --static + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --static $(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static Extensions_clean: - -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=clean + -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=clean Extensions_realclean: - -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=realclean + -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=realclean #------------------------------------------------------------------------------- diff --git a/win32/buildext.pl b/win32/buildext.pl deleted file mode 100644 index 8b6a797..0000000 --- a/win32/buildext.pl +++ /dev/null @@ -1,161 +0,0 @@ -=head1 NAME - -buildext.pl - build extensions - -=head1 SYNOPSIS - - buildext.pl "MAKE=make [-make_opts]" --dir=directory [--target=target] [--static|--dynamic|--all] +ext2 !ext1 - -E.g. - - buildext.pl "MAKE=nmake -nologo" --dir=..\ext - - buildext.pl "MAKE=nmake -nologo" --dir=..\ext --target=clean - - buildext.pl MAKE=dmake --dir=..\ext - - buildext.pl MAKE=dmake --dir=..\ext --target=clean - -Will skip building extensions which are marked with an '!' char. -Mostly because they still not ported to specified platform. - -If any extensions are listed with a '+' char then only those -extensions will be built, but only if they arent countermanded -by an '!ext' and are appropriate to the type of building being done. - -If '--static' specified, only static extensions will be built. -If '--dynamic' specified, only dynamic extensions will be built. - -=cut - -use strict; -use Cwd; -require FindExt; -use Config; - -# @ARGV with '!' at first position are exclusions -# @ARGV with '+' at first position are inclusions -# -- are long options. - -my (%excl, %incl, %opts, @extspec, @pass_through); - -foreach (@ARGV) { - if (/^!(.*)$/) { - $excl{$1} = 1; - } elsif (/^\+(.*)$/) { - $incl{$1} = 1; - } elsif (/^--([\w\-]+)$/) { - $opts{$1} = 1; - } elsif (/^--([\w\-]+)=(.*)$/) { - $opts{$1} = $2; - } elsif (/=/) { - push @pass_through, $_; - } else { - push @extspec, $_; - } -} - -my $static = $opts{static} || $opts{all}; -my $dynamic = $opts{dynamic} || $opts{all}; - -my $makecmd = shift @pass_through; -unshift @pass_through, 'PERL_CORE=1'; - -my $dir = $opts{dir} || 'ext'; -my $target = $opts{target}; -$target = 'all' unless defined $target; - -unless(defined $makecmd and $makecmd =~ /^MAKE=(.*)$/) { - die "$0: WARNING: Please include MAKE=\$(MAKE) in \@ARGV\n"; -} - -# This isn't going to cope with anything fancy, such as spaces inside command -# names, but neither did what it replaced. Once there is a use case that needs -# it, please supply patches. Until then, I'm sticking to KISS -my @make = split ' ', $1 || $Config{make} || $ENV{MAKE}; -# Using an array of 0 or 1 elements makes the subsequent code simpler. -my @run = $Config{run}; -@run = () if not defined $run[0] or $run[0] eq ''; - -(my $here = getcwd()) =~ s{/}{\\}g; -my $perl = $^X; -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}"; -my $pl2bat = "$topdir\\win32\\bin\\pl2bat"; -unless (-f "$pl2bat.bat") { - my @args = ($perl, ("$pl2bat.pl") x 2); - print "@args\n"; - system(@args) unless defined $::Cross::platform; -} - -print "In ", getcwd(); -chdir($dir) || die "Cannot cd to $dir\n"; -(my $ext = getcwd()) =~ s{/}{\\}g; -FindExt::scan_ext($ext); -FindExt::set_static_extensions(split ' ', $Config{static_ext}); - -my @ext; -push @ext, FindExt::static_ext() if $static; -push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic; - - -foreach $dir (sort @ext) - { - if (%incl and !exists $incl{$dir}) { - #warn "Skipping extension $ext\\$dir, not in inclusion list\n"; - next; - } - if (exists $excl{$dir}) { - warn "Skipping extension $ext\\$dir, not ported to current platform"; - next; - } - - build_extension($ext, "$ext\\$dir", $here, "$here\\..\\lib", - [@pass_through, - FindExt::is_static($dir) ? ('LINKTYPE=static') : ()]); - } - -sub build_extension { - my ($ext, $ext_dir, $return_dir, $lib_dir, $pass_through) = @_; - unless (chdir "$ext_dir") { - warn "Cannot cd to $ext_dir: $!"; - return; - } - - if (!-f 'Makefile') { - print "\nRunning Makefile.PL in $ext_dir\n"; - - # Presumably this can be simplified - my @cross; - if (defined $::Cross::platform) { - # Inherited from win32/buildext.pl - @cross = "-MCross=$::Cross::platform"; - } elsif ($opts{cross}) { - # Inherited from make_ext.pl - @cross = '-MCross'; - } - - my @perl = (@run, $perl, "-I$lib_dir", @cross, 'Makefile.PL', - 'INSTALLDIRS=perl', 'INSTALLMAN3DIR=none', 'PERL_CORE=1', - @$pass_through); - print join(' ', @perl), "\n"; - my $code = system @perl; - warn "$code from $ext_dir\'s Makefile.PL" if $code; - } - if (!$target or $target !~ /clean$/) { - # Give makefile an opportunity to rewrite itself. - # reassure users that life goes on... - my @config = (@run, @make, 'config', @$pass_through); - system @config and print "@config failed, continuing anyway...\n"; - } - my @targ = (@run, @make, $target, @$pass_through); - print "Making $target in $ext_dir\n@targ\n"; - my $code = system @targ; - die "Unsuccessful make($ext_dir): code=$code" if $code != 0; - - chdir $return_dir || die "Cannot cd to $return_dir: $!"; -} diff --git a/win32/makefile.mk b/win32/makefile.mk index 54d891f..bb1ab78 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -1387,24 +1387,24 @@ MakePPPort_clean: -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\mkppport --clean #------------------------------------------------------------------------------- -Extensions : buildext.pl $(PERLDEP) $(CONFIGPM) +Extensions : ..\make_ext.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic -Extensions_reonly : buildext.pl $(PERLDEP) $(CONFIGPM) +Extensions_reonly : ..\make_ext.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic +re + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --dynamic +re -Extensions_static : buildext.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) +Extensions_static : ..\make_ext.pl list_static_libs.pl $(PERLDEP) $(CONFIGPM) $(XCOPY) ..\*.h $(COREDIR)\*.* - $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --static + $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --static $(MINIPERL) -I..\lib list_static_libs.pl > Extensions_static Extensions_clean : - -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=clean + -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=clean Extensions_realclean : - -if exist $(MINIPERL) $(MINIPERL) -I..\lib buildext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=realclean + -if exist $(MINIPERL) $(MINIPERL) -I..\lib ..\make_ext.pl "MAKE=$(MAKE)" --dir=$(EXTDIR) --all --target=realclean #-------------------------------------------------------------------------------