Correctly escape $ in debug statement
[p5sagit/p5-mst-13.2.git] / win32 / buildext.pl
CommitLineData
7e050124 1=head1 NAME
2
3buildext.pl - build extensions
4
5=head1 SYNOPSIS
6
1a76ca1a 7 buildext.pl "MAKE=make [-make_opts]" --dir=directory [--target=target] [--static|--dynamic|--all] +ext2 !ext1
7e050124 8
9E.g.
10
1a76ca1a 11 buildext.pl "MAKE=nmake -nologo" --dir=..\ext
7e050124 12
1a76ca1a 13 buildext.pl "MAKE=nmake -nologo" --dir=..\ext --target=clean
7e050124 14
1a76ca1a 15 buildext.pl MAKE=dmake --dir=..\ext
7e050124 16
1a76ca1a 17 buildext.pl MAKE=dmake --dir=..\ext --target=clean
7e050124 18
fefd7080 19Will skip building extensions which are marked with an '!' char.
20Mostly because they still not ported to specified platform.
21
a24cc0c0 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 26If '--static' specified, only static extensions will be built.
27If '--dynamic' specified, only dynamic extensions will be built.
28
7e050124 29=cut
30
aaaf44d7 31use strict;
17af6fb0 32use Cwd;
484c6321 33require FindExt;
d2b25974 34use Config;
fefd7080 35
36# @ARGV with '!' at first position are exclusions
a24cc0c0 37# @ARGV with '+' at first position are inclusions
4feb7f09 38# -- are long options.
39
484c6321 40my (%excl, %incl, %opts, @extspec, @pass_through);
4feb7f09 41
42foreach (@ARGV) {
43 if (/^!(.*)$/) {
44 $excl{$1} = 1;
45 } elsif (/^\+(.*)$/) {
46 $incl{$1} = 1;
47 } elsif (/^--([\w\-]+)$/) {
48 $opts{$1} = 1;
1a76ca1a 49 } elsif (/^--([\w\-]+)=(.*)$/) {
50 $opts{$1} = $2;
484c6321 51 } elsif (/=/) {
52 push @pass_through, $_;
4feb7f09 53 } else {
484c6321 54 push @extspec, $_;
4feb7f09 55 }
d2b25974 56}
d2b25974 57
aaaf44d7 58my $static = $opts{static} || $opts{all};
59my $dynamic = $opts{dynamic} || $opts{all};
4feb7f09 60
484c6321 61my $makecmd = shift @pass_through;
62unshift @pass_through, 'PERL_CORE=1';
63
1a76ca1a 64my $dir = $opts{dir} || 'ext';
484c6321 65my $target = $opts{target};
66$target = 'all' unless defined $target;
4feb7f09 67
8ed969f8 68my $make;
69if (defined($makecmd) and $makecmd =~ /^MAKE=(.*)$/) {
70 $make = $1;
71}
72else {
1a76ca1a 73 print "$0: WARNING: Please include MAKE=\$(MAKE)\n";
74 print "\tin your call to buildext.pl. See buildext.pl for details.\n";
8ed969f8 75 exit(1);
76}
77
484c6321 78# Strip whitespace at end of $make to ease passing of (potentially empty) parameters
79$make =~ s/\s+$//;
80
81# fallback to config.sh's MAKE
82$make ||= $Config{make} || $ENV{MAKE};
83my @run = $Config{run};
84@run = () if not defined $run[0] or $run[0] eq '';
8ed969f8 85
a1f2e719 86(my $here = getcwd()) =~ s{/}{\\}g;
17af6fb0 87my $perl = $^X;
a1f2e719 88if ($perl =~ m#^\.\.#) {
89 $perl = "$here\\$perl";
90}
200dcf2d 91(my $topdir = $perl) =~ s/\\[^\\]+$//;
3a7016a8 92# miniperl needs to find perlglob and pl2bat
93$ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
3a7016a8 94my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
95unless (-f "$pl2bat.bat") {
96 my @args = ($perl, ("$pl2bat.pl") x 2);
97 print "@args\n";
fefd7080 98 system(@args) unless defined $::Cross::platform;
3a7016a8 99}
4feb7f09 100
1a76ca1a 101print "In ", getcwd();
17af6fb0 102chdir($dir) || die "Cannot cd to $dir\n";
a1f2e719 103(my $ext = getcwd()) =~ s{/}{\\}g;
8e232993 104FindExt::scan_ext($ext);
1a76ca1a 105FindExt::set_static_extensions(split ' ', $Config{static_ext});
17af6fb0 106
3fd041e4 107my @ext;
108push @ext, FindExt::static_ext() if $static;
109push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
8e232993 110
a24cc0c0 111
d2b25974 112foreach $dir (sort @ext)
17af6fb0 113 {
a24cc0c0 114 if (%incl and !exists $incl{$dir}) {
115 #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
116 next;
117 }
fefd7080 118 if (exists $excl{$dir}) {
119 warn "Skipping extension $ext\\$dir, not ported to current platform";
120 next;
121 }
484c6321 122
123 build_extension($ext, "$ext\\$dir", $here, "$here\\..\\lib",
124 [@pass_through,
125 FindExt::is_static($dir) ? ('LINKTYPE=static') : ()]);
126 }
127
128sub build_extension {
129 my ($ext, $ext_dir, $return_dir, $lib_dir, $pass_through) = @_;
130 unless (chdir "$ext_dir") {
131 warn "Cannot cd to $ext_dir: $!";
132 return;
133 }
134
135 if (!-f 'Makefile') {
136 print "\nRunning Makefile.PL in $ext_dir\n";
137
138 # Presumably this can be simplified
139 my @cross;
140 if (defined $::Cross::platform) {
141 # Inherited from win32/buildext.pl
142 @cross = "-MCross=$::Cross::platform";
143 } elsif ($opts{cross}) {
144 # Inherited from make_ext.pl
145 @cross = '-MCross';
146 }
147
148 my @perl = (@run, $perl, "-I$lib_dir", @cross, 'Makefile.PL',
149 'INSTALLDIRS=perl', 'INSTALLMAN3DIR=none', 'PERL_CORE=1',
150 @$pass_through);
151 print join(' ', @perl), "\n";
152 my $code = system @perl;
153 warn "$code from $ext_dir\'s Makefile.PL" if $code;
154 }
155 if (!$target or $target !~ /clean$/) {
42fe6305 156 # Give makefile an opportunity to rewrite itself.
157 # reassure users that life goes on...
484c6321 158 my @config = (@run, $make, 'config', @$pass_through);
159 system @config and print "@config failed, continuing anyway...\n";
42fe6305 160 }
484c6321 161 my @targ = (@run, $make, $target, @$pass_through);
162 print "Making $target in $ext_dir\n$@targ\n";
163 my $code = system @targ;
164 die "Unsuccessful make($ext_dir): code=$code" if $code != 0;
17af6fb0 165
484c6321 166 chdir $return_dir || die "Cannot cd to $return_dir: $!";
167}