diff options
author | Nicholas Clark <nick@ccl4.org> | 2009-02-02 21:42:33 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2009-02-02 21:43:00 +0000 |
commit | 286d62c215d35caf69b83afb884cdaa350bd6aa3 (patch) | |
tree | 7c81a8cb05c1341cf31e370bbe607334d1efce09 /make_ext.pl | |
parent | 767c16ab361d1225fb153423fb22b590c1e0c7ea (diff) | |
download | perl-286d62c215d35caf69b83afb884cdaa350bd6aa3.tar.gz |
Fold win32/buildext.pl into make_ext.pl
Diffstat (limited to 'make_ext.pl')
-rw-r--r-- | make_ext.pl | 96 |
1 files changed, 89 insertions, 7 deletions
diff --git a/make_ext.pl b/make_ext.pl index 422d5806c8..db3a1affa6 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 { |