This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Rename "perl59" to "perl510"
[perl5.git] / win32 / buildext.pl
CommitLineData
7e050124
PK
1=head1 NAME
2
3buildext.pl - build extensions
4
5=head1 SYNOPSIS
6
a24cc0c0 7 buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic] +ext2 !ext1
7e050124
PK
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
VK
19Will skip building extensions which are marked with an '!' char.
20Mostly because they still not ported to specified platform.
21
a24cc0c0
YO
22If any extensions are listed with a '+' char then only those
23extensions will be built, but only if they arent countermanded
24by an '!ext' and are appropriate to the type of building being done.
25
d2b25974
VK
26If '--static' specified, only static extensions will be built.
27If '--dynamic' specified, only dynamic extensions will be built.
28
29--create-perllibst-h
30 creates perllibst.h file for inclusion from perllib.c
31--list-static-libs:
32 prints libraries for static linking and exits
33
7e050124
PK
34=cut
35
17af6fb0 36use Cwd;
8e232993 37use FindExt;
d2b25974 38use Config;
fefd7080
VK
39
40# @ARGV with '!' at first position are exclusions
41my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
42@ARGV = grep {!/^!/} @ARGV;
a24cc0c0
YO
43# @ARGV with '+' at first position are inclusions
44my %incl = map {$_=>1} map {/^\+(.*)$/} @ARGV;
45@ARGV = grep {!/^\+/} @ARGV;
fefd7080 46
d2b25974
VK
47# --static/--dynamic
48my %opts = map {$_=>1} map {/^--([\w\-]+)$/} @ARGV;
49@ARGV = grep {!/^--([\w\-]+)$/} @ARGV;
50my ($static,$dynamic) = ((exists $opts{static}?1:0),(exists $opts{dynamic}?1:0));
51if ("$static,$dynamic" eq "0,0") {
52 ($static,$dynamic) = (1,1);
53}
54if ($opts{'list-static-libs'} || $opts{'create-perllibst-h'}) {
3fd041e4 55 my @statics = split /\s+/, $Config{static_ext};
d2b25974 56 if ($opts{'create-perllibst-h'}) {
a24cc0c0
YO
57 open my $fh, ">perllibst.h"
58 or die "Failed to write to perllibst.h:$!";
d2b25974
VK
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";
a24cc0c0 65 close $fh;
a1f2e719 66 } else {
8bcd5811
VK
67 my %extralibs;
68 for (@statics) {
69 open my $fh, "<..\\lib\\auto\\$_\\extralibs.ld" or die "can't open <..\\lib\\auto\\$_\\extralibs.ld: $!";
70 $extralibs{$_}++ for grep {/\S/} split /\s+/, join '', <$fh>;
71 }
9506093e 72 print map {s|/|\\|g;m|([^\\]+)$|;"..\\lib\\auto\\$_\\$1$Config{_a} "} @statics;
8bcd5811 73 print map {"$_ "} sort keys %extralibs;
d2b25974 74 }
a24cc0c0 75 exit(0);
d2b25974
VK
76}
77
a1f2e719 78(my $here = getcwd()) =~ s{/}{\\}g;
17af6fb0 79my $perl = $^X;
a1f2e719
VK
80if ($perl =~ m#^\.\.#) {
81 $perl = "$here\\$perl";
82}
200dcf2d 83(my $topdir = $perl) =~ s/\\[^\\]+$//;
3a7016a8
GS
84# miniperl needs to find perlglob and pl2bat
85$ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
3a7016a8
GS
86my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
87unless (-f "$pl2bat.bat") {
88 my @args = ($perl, ("$pl2bat.pl") x 2);
89 print "@args\n";
fefd7080 90 system(@args) unless defined $::Cross::platform;
3a7016a8 91}
17af6fb0 92my $make = shift;
f76dcffd 93$make .= " ".shift while $ARGV[0]=~/^-/;
17af6fb0
NIS
94my $dep = shift;
95my $dmod = -M $dep;
96my $dir = shift;
97chdir($dir) || die "Cannot cd to $dir\n";
7e050124 98my $targ = shift;
a1f2e719 99(my $ext = getcwd()) =~ s{/}{\\}g;
fefd7080 100my $code;
8e232993 101FindExt::scan_ext($ext);
3fd041e4 102FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
17af6fb0 103
3fd041e4
YST
104my @ext;
105push @ext, FindExt::static_ext() if $static;
106push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
8e232993 107
a24cc0c0 108
d2b25974 109foreach $dir (sort @ext)
17af6fb0 110 {
a24cc0c0
YO
111 if (%incl and !exists $incl{$dir}) {
112 #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
113 next;
114 }
fefd7080
VK
115 if (exists $excl{$dir}) {
116 warn "Skipping extension $ext\\$dir, not ported to current platform";
117 next;
118 }
17af6fb0
NIS
119 if (chdir("$ext\\$dir"))
120 {
121 my $mmod = -M 'Makefile';
122 if (!(-f 'Makefile') || $mmod > $dmod)
123 {
0026721a 124 print "\nRunning Makefile.PL in $dir\n";
e7d8b26b 125 my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
d2b25974 126 'INSTALLDIRS=perl', 'PERL_CORE=1',
3fd041e4
YST
127 (FindExt::is_static($dir)
128 ? ('LINKTYPE=static') : ()), # if ext is static
d2b25974 129 );
fefd7080
VK
130 if (defined $::Cross::platform) {
131 @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
132 }
e7d8b26b 133 print join(' ', @perl), "\n";
fefd7080 134 $code = system(@perl);
d2b25974 135 warn "$code from $dir\'s Makefile.PL" if $code;
17af6fb0
NIS
136 $mmod = -M 'Makefile';
137 if ($mmod > $dmod)
138 {
139 warn "Makefile $mmod > $dmod ($dep)\n";
140 }
141 }
7e050124
PK
142 if ($targ)
143 {
144 print "Making $targ in $dir\n$make $targ\n";
fefd7080
VK
145 $code = system("$make $targ");
146 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124
PK
147 }
148 else
149 {
150 print "Making $dir\n$make\n";
fefd7080
VK
151 $code = system($make);
152 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124 153 }
17af6fb0
NIS
154 chdir($here) || die "Cannot cd to $here:$!";
155 }
156 else
157 {
158 warn "Cannot cd to $ext\\$dir:$!";
159 }
160 }
161