3 buildext.pl - build extensions
7 buildext.pl "MAKE=make [-make_opts]" --dir=directory [--target=target] [--static|--dynamic|--all] +ext2 !ext1
11 buildext.pl "MAKE=nmake -nologo" --dir=..\ext
13 buildext.pl "MAKE=nmake -nologo" --dir=..\ext --target=clean
15 buildext.pl MAKE=dmake --dir=..\ext
17 buildext.pl MAKE=dmake --dir=..\ext --target=clean
19 Will skip building extensions which are marked with an '!' char.
20 Mostly because they still not ported to specified platform.
22 If any extensions are listed with a '+' char then only those
23 extensions will be built, but only if they arent countermanded
24 by an '!ext' and are appropriate to the type of building being done.
26 If '--static' specified, only static extensions will be built.
27 If '--dynamic' specified, only dynamic extensions will be built.
36 # @ARGV with '!' at first position are exclusions
37 # @ARGV with '+' at first position are inclusions
38 # -- are long options.
40 my (%excl, %incl, %opts, @extspec, @pass_through);
45 } elsif (/^\+(.*)$/) {
47 } elsif (/^--([\w\-]+)$/) {
49 } elsif (/^--([\w\-]+)=(.*)$/) {
52 push @pass_through, $_;
58 my $static = $opts{static} || $opts{all};
59 my $dynamic = $opts{dynamic} || $opts{all};
61 my $makecmd = shift @pass_through;
62 unshift @pass_through, 'PERL_CORE=1';
64 my $dir = $opts{dir} || 'ext';
65 my $target = $opts{target};
66 $target = 'all' unless defined $target;
69 if (defined($makecmd) and $makecmd =~ /^MAKE=(.*)$/) {
73 print "$0: WARNING: Please include MAKE=\$(MAKE)\n";
74 print "\tin your call to buildext.pl. See buildext.pl for details.\n";
78 # Strip whitespace at end of $make to ease passing of (potentially empty) parameters
81 # fallback to config.sh's MAKE
82 $make ||= $Config{make} || $ENV{MAKE};
83 my @run = $Config{run};
84 @run = () if not defined $run[0] or $run[0] eq '';
86 (my $here = getcwd()) =~ s{/}{\\}g;
88 if ($perl =~ m#^\.\.#) {
89 $perl = "$here\\$perl";
91 (my $topdir = $perl) =~ s/\\[^\\]+$//;
92 # miniperl needs to find perlglob and pl2bat
93 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
94 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
95 unless (-f "$pl2bat.bat") {
96 my @args = ($perl, ("$pl2bat.pl") x 2);
98 system(@args) unless defined $::Cross::platform;
101 print "In ", getcwd();
102 chdir($dir) || die "Cannot cd to $dir\n";
103 (my $ext = getcwd()) =~ s{/}{\\}g;
104 FindExt::scan_ext($ext);
105 FindExt::set_static_extensions(split ' ', $Config{static_ext});
108 push @ext, FindExt::static_ext() if $static;
109 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
112 foreach $dir (sort @ext)
114 if (%incl and !exists $incl{$dir}) {
115 #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
118 if (exists $excl{$dir}) {
119 warn "Skipping extension $ext\\$dir, not ported to current platform";
123 build_extension($ext, "$ext\\$dir", $here, "$here\\..\\lib",
125 FindExt::is_static($dir) ? ('LINKTYPE=static') : ()]);
128 sub build_extension {
129 my ($ext, $ext_dir, $return_dir, $lib_dir, $pass_through) = @_;
130 unless (chdir "$ext_dir") {
131 warn "Cannot cd to $ext_dir: $!";
135 if (!-f 'Makefile') {
136 print "\nRunning Makefile.PL in $ext_dir\n";
138 # Presumably this can be simplified
140 if (defined $::Cross::platform) {
141 # Inherited from win32/buildext.pl
142 @cross = "-MCross=$::Cross::platform";
143 } elsif ($opts{cross}) {
144 # Inherited from make_ext.pl
148 my @perl = (@run, $perl, "-I$lib_dir", @cross, 'Makefile.PL',
149 'INSTALLDIRS=perl', 'INSTALLMAN3DIR=none', 'PERL_CORE=1',
151 print join(' ', @perl), "\n";
152 my $code = system @perl;
153 warn "$code from $ext_dir\'s Makefile.PL" if $code;
155 if (!$target or $target !~ /clean$/) {
156 # Give makefile an opportunity to rewrite itself.
157 # reassure users that life goes on...
158 my @config = (@run, $make, 'config', @$pass_through);
159 system @config and print "@config failed, continuing anyway...\n";
161 my @targ = (@run, $make, $target, @$pass_through);
162 print "Making $target in $ext_dir\n@targ\n";
163 my $code = system @targ;
164 die "Unsuccessful make($ext_dir): code=$code" if $code != 0;
166 chdir $return_dir || die "Cannot cd to $return_dir: $!";