3 buildext.pl - build extensions
7 buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic] +ext2 !ext1
11 buildext.pl nmake -nologo perldll.def ..\ext
13 buildext.pl nmake -nologo perldll.def ..\ext clean
15 buildext.pl dmake perldll.def ..\ext
17 buildext.pl dmake perldll.def ..\ext 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.
30 creates perllibst.h file for inclusion from perllib.c
32 prints libraries for static linking and exits
40 # @ARGV with '!' at first position are exclusions
41 my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
42 @ARGV = grep {!/^!/} @ARGV;
43 # @ARGV with '+' at first position are inclusions
44 my %incl = map {$_=>1} map {/^\+(.*)$/} @ARGV;
45 @ARGV = grep {!/^\+/} @ARGV;
48 my %opts = map {$_=>1} map {/^--([\w\-]+)$/} @ARGV;
49 @ARGV = grep {!/^--([\w\-]+)$/} @ARGV;
50 my ($static,$dynamic) = ((exists $opts{static}?1:0),(exists $opts{dynamic}?1:0));
51 if ("$static,$dynamic" eq "0,0") {
52 ($static,$dynamic) = (1,1);
54 if ($opts{'list-static-libs'} || $opts{'create-perllibst-h'}) {
55 my @statics = split /\s+/, $Config{static_ext};
56 if ($opts{'create-perllibst-h'}) {
57 open my $fh, ">perllibst.h"
58 or die "Failed to write to perllibst.h:$!";
59 my @statics1 = map {local $_=$_;s/\//__/g;$_} @statics;
60 my @statics2 = map {local $_=$_;s/\//::/g;$_} @statics;
61 print $fh "/*DO NOT EDIT\n this file is included from perllib.c to init static extensions */\n";
62 print $fh "#ifdef STATIC1\n",(map {" \"$_\",\n"} @statics),"#undef STATIC1\n#endif\n";
63 print $fh "#ifdef STATIC2\n",(map {" EXTERN_C void boot_$_ (pTHX_ CV* cv);\n"} @statics1),"#undef STATIC2\n#endif\n";
64 print $fh "#ifdef STATIC3\n",(map {" newXS(\"$statics2[$_]::bootstrap\", boot_$statics1[$_], file);\n"} 0 .. $#statics),"#undef STATIC3\n#endif\n";
70 open my $fh, "<..\\lib\\auto\\$_\\extralibs.ld" or die "can't open <..\\lib\\auto\\$_\\extralibs.ld: $!";
71 $extralibs{$_}++ for grep {/\S/} split /\s+/, join '', <$fh>;
73 print map {s|/|\\|g;m|([^\\]+)$|;"..\\lib\\auto\\$_\\$1$Config{_a} "} @statics;
74 print map {"$_ "} sort keys %extralibs;
82 if ($perl =~ m#^\.\.#)
84 $perl = "$here\\$perl";
86 (my $topdir = $perl) =~ s/\\[^\\]+$//;
87 # miniperl needs to find perlglob and pl2bat
88 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
89 #print "PATH=$ENV{PATH}\n";
90 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
91 unless (-f "$pl2bat.bat") {
92 my @args = ($perl, ("$pl2bat.pl") x 2);
94 system(@args) unless defined $::Cross::platform;
97 $make .= " ".shift while $ARGV[0]=~/^-/;
101 chdir($dir) || die "Cannot cd to $dir\n";
103 (my $ext = getcwd()) =~ s,/,\\,g;
105 FindExt::scan_ext($ext);
106 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
109 push @ext, FindExt::static_ext() if $static;
110 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
113 foreach $dir (sort @ext)
115 if (%incl and !exists $incl{$dir}) {
116 #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
119 if (exists $excl{$dir}) {
120 warn "Skipping extension $ext\\$dir, not ported to current platform";
123 if (chdir("$ext\\$dir"))
125 my $mmod = -M 'Makefile';
126 if (!(-f 'Makefile') || $mmod > $dmod)
128 print "\nRunning Makefile.PL in $dir\n";
129 my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
130 'INSTALLDIRS=perl', 'PERL_CORE=1',
131 (FindExt::is_static($dir)
132 ? ('LINKTYPE=static') : ()), # if ext is static
134 if (defined $::Cross::platform) {
135 @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
137 print join(' ', @perl), "\n";
138 $code = system(@perl);
139 warn "$code from $dir\'s Makefile.PL" if $code;
140 $mmod = -M 'Makefile';
143 warn "Makefile $mmod > $dmod ($dep)\n";
148 print "Making $targ in $dir\n$make $targ\n";
149 $code = system("$make $targ");
150 die "Unsuccessful make($dir): code=$code" if $code!=0;
154 print "Making $dir\n$make\n";
155 $code = system($make);
156 die "Unsuccessful make($dir): code=$code" if $code!=0;
158 chdir($here) || die "Cannot cd to $here:$!";
162 warn "Cannot cd to $ext\\$dir:$!";