3 buildext.pl - build extensions
7 buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic] !ext1 !ext2
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 '--static' specified, only static extensions will be built.
23 If '--dynamic' specified, only dynamic extensions will be built.
26 creates perllibst.h file for inclusion from perllib.c
28 prints libraries for static linking and exits
36 # @ARGV with '!' at first position are exclusions
37 my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
38 @ARGV = grep {!/^!/} @ARGV;
41 my %opts = map {$_=>1} map {/^--([\w\-]+)$/} @ARGV;
42 @ARGV = grep {!/^--([\w\-]+)$/} @ARGV;
43 my ($static,$dynamic) = ((exists $opts{static}?1:0),(exists $opts{dynamic}?1:0));
44 if ("$static,$dynamic" eq "0,0") {
45 ($static,$dynamic) = (1,1);
47 if ($opts{'list-static-libs'} || $opts{'create-perllibst-h'}) {
48 my @statics = split /\s+/, $Config{static_ext};
49 if ($opts{'create-perllibst-h'}) {
50 open my $fh, ">perllibst.h";
51 my @statics1 = map {local $_=$_;s/\//__/g;$_} @statics;
52 my @statics2 = map {local $_=$_;s/\//::/g;$_} @statics;
53 print $fh "/*DO NOT EDIT\n this file is included from perllib.c to init static extensions */\n";
54 print $fh "#ifdef STATIC1\n",(map {" \"$_\",\n"} @statics),"#undef STATIC1\n#endif\n";
55 print $fh "#ifdef STATIC2\n",(map {" EXTERN_C void boot_$_ (pTHX_ CV* cv);\n"} @statics1),"#undef STATIC2\n#endif\n";
56 print $fh "#ifdef STATIC3\n",(map {" newXS(\"$statics2[$_]::bootstrap\", boot_$statics1[$_], file);\n"} 0 .. $#statics),"#undef STATIC3\n#endif\n";
61 open my $fh, "<..\\lib\\auto\\$_\\extralibs.ld" or die "can't open <..\\lib\\auto\\$_\\extralibs.ld: $!";
62 $extralibs{$_}++ for grep {/\S/} split /\s+/, join '', <$fh>;
64 print map {/([^\/]+)$/;"..\\lib\\auto\\$_/$1$Config{_a} "} @statics;
65 print map {"$_ "} sort keys %extralibs;
73 if ($perl =~ m#^\.\.#)
75 $perl = "$here\\$perl";
77 (my $topdir = $perl) =~ s/\\[^\\]+$//;
78 # miniperl needs to find perlglob and pl2bat
79 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
80 #print "PATH=$ENV{PATH}\n";
81 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
82 unless (-f "$pl2bat.bat") {
83 my @args = ($perl, ("$pl2bat.pl") x 2);
85 system(@args) unless defined $::Cross::platform;
88 $make .= " ".shift while $ARGV[0]=~/^-/;
92 chdir($dir) || die "Cannot cd to $dir\n";
94 (my $ext = getcwd()) =~ s,/,\\,g;
96 FindExt::scan_ext($ext);
97 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
100 push @ext, FindExt::static_ext() if $static;
101 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
103 foreach $dir (sort @ext)
105 if (exists $excl{$dir}) {
106 warn "Skipping extension $ext\\$dir, not ported to current platform";
109 if (chdir("$ext\\$dir"))
111 my $mmod = -M 'Makefile';
112 if (!(-f 'Makefile') || $mmod > $dmod)
114 print "\nRunning Makefile.PL in $dir\n";
115 my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
116 'INSTALLDIRS=perl', 'PERL_CORE=1',
117 (FindExt::is_static($dir)
118 ? ('LINKTYPE=static') : ()), # if ext is static
120 if (defined $::Cross::platform) {
121 @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
123 print join(' ', @perl), "\n";
124 $code = system(@perl);
125 warn "$code from $dir\'s Makefile.PL" if $code;
126 $mmod = -M 'Makefile';
129 warn "Makefile $mmod > $dmod ($dep)\n";
134 print "Making $targ in $dir\n$make $targ\n";
135 $code = system("$make $targ");
136 die "Unsuccessful make($dir): code=$code" if $code!=0;
140 print "Making $dir\n$make\n";
141 $code = system($make);
142 die "Unsuccessful make($dir): code=$code" if $code!=0;
144 chdir($here) || die "Cannot cd to $here:$!";
148 warn "Cannot cd to $ext\\$dir:$!";