This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / win32 / buildext.pl
CommitLineData
7e050124
PK
1=head1 NAME
2
3buildext.pl - build extensions
4
5=head1 SYNOPSIS
6
5991d125 7 buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic] !ext1 !ext2
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
5991d125
NC
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
PK
30=cut
31
17af6fb0
NIS
32use File::Basename;
33use Cwd;
8e232993 34use FindExt;
5991d125 35use Config;
fefd7080
VK
36
37# @ARGV with '!' at first position are exclusions
38my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
39@ARGV = grep {!/^!/} @ARGV;
40
5991d125
NC
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 {
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;
70 }
71 exit;
72}
73
17af6fb0
NIS
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
GS
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
GS
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
NIS
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();
5991d125
NC
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
5991d125 108foreach $dir (sort @ext)
17af6fb0 109 {
fefd7080
VK
110 if (exists $excl{$dir}) {
111 warn "Skipping extension $ext\\$dir, not ported to current platform";
112 next;
113 }
17af6fb0
NIS
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',
5991d125
NC
121 'INSTALLDIRS=perl', 'PERL_CORE=1',
122 ($static_exts{$dir}?('LINKTYPE=static'):()), # if ext is static
123 );
fefd7080
VK
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);
5991d125 129 warn "$code from $dir\'s Makefile.PL" if $code;
17af6fb0
NIS
130 $mmod = -M 'Makefile';
131 if ($mmod > $dmod)
132 {
133 warn "Makefile $mmod > $dmod ($dep)\n";
134 }
135 }
7e050124
PK
136 if ($targ)
137 {
138 print "Making $targ in $dir\n$make $targ\n";
fefd7080
VK
139 $code = system("$make $targ");
140 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124
PK
141 }
142 else
143 {
144 print "Making $dir\n$make\n";
fefd7080
VK
145 $code = system($make);
146 die "Unsuccessful make($dir): code=$code" if $code!=0;
7e050124 147 }
17af6fb0
NIS
148 chdir($here) || die "Cannot cd to $here:$!";
149 }
150 else
151 {
152 warn "Cannot cd to $ext\\$dir:$!";
153 }
154 }
155