RE: [PATCH-for-23358] enable statically linked exte nsions for Win32
[p5sagit/p5-mst-13.2.git] / win32 / buildext.pl
CommitLineData
7e050124 1=head1 NAME
2
3buildext.pl - build extensions
4
5=head1 SYNOPSIS
6
d2b25974 7 buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic] !ext1 !ext2
7e050124 8
9E.g.
10
11 buildext.pl nmake -nologo perldll.def ..\ext
12
13 buildext.pl nmake -nologo perldll.def ..\ext clean
14
15 buildext.pl dmake perldll.def ..\ext
16
17 buildext.pl dmake perldll.def ..\ext clean
18
fefd7080 19Will skip building extensions which are marked with an '!' char.
20Mostly because they still not ported to specified platform.
21
d2b25974 22If '--static' specified, only static extensions will be built.
23If '--dynamic' specified, only dynamic extensions will be built.
24
25--create-perllibst-h
26 creates perllibst.h file for inclusion from perllib.c
27--list-static-libs:
28 prints libraries for static linking and exits
29
7e050124 30=cut
31
17af6fb0 32use File::Basename;
33use Cwd;
8e232993 34use FindExt;
d2b25974 35use Config;
fefd7080 36
37# @ARGV with '!' at first position are exclusions
38my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
39@ARGV = grep {!/^!/} @ARGV;
40
d2b25974 41# --static/--dynamic
42my %opts = map {$_=>1} map {/^--([\w\-]+)$/} @ARGV;
43@ARGV = grep {!/^--([\w\-]+)$/} @ARGV;
44my ($static,$dynamic) = ((exists $opts{static}?1:0),(exists $opts{dynamic}?1:0));
45if ("$static,$dynamic" eq "0,0") {
46 ($static,$dynamic) = (1,1);
47}
48if ($opts{'list-static-libs'} || $opts{'create-perllibst-h'}) {
49 my @statics = grep{!/^DynaLoader$/} split /\s+/, $Config{static_ext};
50 if ($opts{'create-perllibst-h'}) {
51 # at moment of creation of perllibst.h no luck consulting Config.pm,
52 # so list of static extensions passed with @ARGV
53 @statics = grep{!/^DynaLoader$/} @ARGV;
54 open my $fh, ">perllibst.h";
55 my @statics1 = map {local $_=$_;s/\//__/g;$_} @statics;
56 my @statics2 = map {local $_=$_;s/\//::/g;$_} @statics;
57 print $fh "/*DO NOT EDIT\n this file is included from perllib.c to init static extensions */\n";
58 print $fh "#ifdef STATIC1\n",(map {" \"$_\",\n"} @statics),"#undef STATIC1\n#endif\n";
59 print $fh "#ifdef STATIC2\n",(map {" EXTERN_C void boot_$_ (pTHX_ CV* cv);\n"} @statics1),"#undef STATIC2\n#endif\n";
60 print $fh "#ifdef STATIC3\n",(map {" newXS(\"$statics2[$_]::bootstrap\", boot_$statics1[$_], file);\n"} 0 .. $#statics),"#undef STATIC3\n#endif\n";
61 }
62 else {
8bcd5811 63 my %extralibs;
64 for (@statics) {
65 open my $fh, "<..\\lib\\auto\\$_\\extralibs.ld" or die "can't open <..\\lib\\auto\\$_\\extralibs.ld: $!";
66 $extralibs{$_}++ for grep {/\S/} split /\s+/, join '', <$fh>;
67 }
68 print map {/([^\/]+)$/;"..\\lib\\auto\\$_/$1.lib "} @statics;
69 print map {"$_ "} sort keys %extralibs;
d2b25974 70 }
71 exit;
72}
73
17af6fb0 74my $here = getcwd();
75my $perl = $^X;
76$here =~ s,/,\\,g;
77if ($perl =~ m#^\.\.#)
78 {
79 $perl = "$here\\$perl";
80 }
200dcf2d 81(my $topdir = $perl) =~ s/\\[^\\]+$//;
3a7016a8 82# miniperl needs to find perlglob and pl2bat
83$ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
200dcf2d 84#print "PATH=$ENV{PATH}\n";
3a7016a8 85my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
86unless (-f "$pl2bat.bat") {
87 my @args = ($perl, ("$pl2bat.pl") x 2);
88 print "@args\n";
fefd7080 89 system(@args) unless defined $::Cross::platform;
3a7016a8 90}
17af6fb0 91my $make = shift;
f76dcffd 92$make .= " ".shift while $ARGV[0]=~/^-/;
17af6fb0 93my $dep = shift;
94my $dmod = -M $dep;
95my $dir = shift;
96chdir($dir) || die "Cannot cd to $dir\n";
7e050124 97my $targ = shift;
17af6fb0 98(my $ext = getcwd()) =~ s,/,\\,g;
fefd7080 99my $code;
8e232993 100FindExt::scan_ext($ext);
17af6fb0 101
8e232993 102my @ext = FindExt::extensions();
d2b25974 103my %static_exts = map {$_=>1} split /\s+/, $Config{static_ext};
104
105if ("$static$dynamic" eq "01") {@ext = grep {!exists $static_exts{$_}} @ext}
106elsif ("$static$dynamic" eq "10") {@ext = grep {exists $static_exts{$_}} @ext}
8e232993 107
d2b25974 108foreach $dir (sort @ext)
17af6fb0 109 {
fefd7080 110 if (exists $excl{$dir}) {
111 warn "Skipping extension $ext\\$dir, not ported to current platform";
112 next;
113 }
17af6fb0 114 if (chdir("$ext\\$dir"))
115 {
116 my $mmod = -M 'Makefile';
117 if (!(-f 'Makefile') || $mmod > $dmod)
118 {
0026721a 119 print "\nRunning Makefile.PL in $dir\n";
e7d8b26b 120 my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
d2b25974 121 'INSTALLDIRS=perl', 'PERL_CORE=1',
122 ($static_exts{$dir}?('LINKTYPE=static'):()), # if ext is static
123 );
fefd7080 124 if (defined $::Cross::platform) {
125 @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
126 }
e7d8b26b 127 print join(' ', @perl), "\n";
fefd7080 128 $code = system(@perl);
d2b25974 129 warn "$code from $dir\'s Makefile.PL" if $code;
17af6fb0 130 $mmod = -M 'Makefile';
131 if ($mmod > $dmod)
132 {
133 warn "Makefile $mmod > $dmod ($dep)\n";
134 }
135 }
7e050124 136 if ($targ)
137 {
138 print "Making $targ in $dir\n$make $targ\n";
fefd7080 139 $code = system("$make $targ");
140 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124 141 }
142 else
143 {
144 print "Making $dir\n$make\n";
fefd7080 145 $code = system($make);
146 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124 147 }
17af6fb0 148 chdir($here) || die "Cannot cd to $here:$!";
149 }
150 else
151 {
152 warn "Cannot cd to $ext\\$dir:$!";
153 }
154 }
155