=head1 NAME buildext.pl - build extensions =head1 SYNOPSIS buildext.pl make [-make_opts] dep directory [target] !ext1 !ext2 E.g. buildext.pl nmake -nologo perldll.def ..\ext buildext.pl nmake -nologo perldll.def ..\ext clean buildext.pl dmake perldll.def ..\ext buildext.pl dmake perldll.def ..\ext clean Will skip building extensions which are marked with an '!' char. Mostly because they still not ported to specified platform. =cut use File::Basename; use Cwd; use FindExt; # @ARGV with '!' at first position are exclusions my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV; @ARGV = grep {!/^!/} @ARGV; my $here = getcwd(); my $perl = $^X; $here =~ s,/,\\,g; 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); print "@args\n"; system(@args) unless defined $::Cross::platform; } my $make = shift; $make .= " ".shift while $ARGV[0]=~/^-/; my $dep = shift; my $dmod = -M $dep; my $dir = shift; chdir($dir) || die "Cannot cd to $dir\n"; my $targ = shift; (my $ext = getcwd()) =~ s,/,\\,g; my $code; FindExt::scan_ext($ext); my @ext = FindExt::extensions(); foreach my $dir (sort @ext) { if (exists $excl{$dir}) { warn "Skipping extension $ext\\$dir, not ported to current platform"; next; } if (chdir("$ext\\$dir")) { my $mmod = -M 'Makefile'; if (!(-f 'Makefile') || $mmod > $dmod) { print "\nRunning Makefile.PL in $dir\n"; my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL', 'INSTALLDIRS=perl', 'PERL_CORE=1'); if (defined $::Cross::platform) { @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]); } print join(' ', @perl), "\n"; $code = system(@perl); warn "$code from $dir's Makefile.PL" if $code; $mmod = -M 'Makefile'; if ($mmod > $dmod) { warn "Makefile $mmod > $dmod ($dep)\n"; } } if ($targ) { print "Making $targ in $dir\n$make $targ\n"; $code = system("$make $targ"); die "Unsuccessful make($dir): code=$code" if $code!=0; } else { print "Making $dir\n$make\n"; $code = system($make); die "Unsuccessful make($dir): code=$code" if $code!=0; } chdir($here) || die "Cannot cd to $here:$!"; } else { warn "Cannot cd to $ext\\$dir:$!"; } }