Add an explicit --all option to buildext.pl, rather than defaulting to it if
[perl.git] / win32 / buildext.pl
1 =head1 NAME
2
3 buildext.pl - build extensions
4
5 =head1 SYNOPSIS
6
7     buildext.pl make [-make_opts] dep directory [target] [--static|--dynamic|--all] +ext2 !ext1
8
9 E.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
19 Will skip building extensions which are marked with an '!' char.
20 Mostly because they still not ported to specified platform.
21
22 If any extensions are listed with a '+' char then only those
23 extensions will be built, but only if they arent countermanded
24 by an '!ext' and are appropriate to the type of building being done.
25
26 If '--static' specified, only static extensions will be built.
27 If '--dynamic' specified, only dynamic extensions will be built.
28
29 =cut
30
31 use strict;
32 use Cwd;
33 use FindExt;
34 use Config;
35
36 # @ARGV with '!' at first position are exclusions
37 # @ARGV with '+' at first position are inclusions
38 # -- are long options.
39
40 my (%excl, %incl, %opts, @argv);
41
42 foreach (@ARGV) {
43     if (/^!(.*)$/) {
44         $excl{$1} = 1;
45     } elsif (/^\+(.*)$/) {
46         $incl{$1} = 1;
47     } elsif (/^--([\w\-]+)$/) {
48         $opts{$1} = 1;
49     } else {
50         push @argv, $_;
51     }
52 }
53
54 my $static = $opts{static} || $opts{all};
55 my $dynamic = $opts{dynamic} || $opts{all};
56
57 my $makecmd = shift @argv;
58 my $dep  = shift @argv;
59 my $dir  = shift @argv;
60 my $targ = shift @argv;
61
62 my $make;
63 if (defined($makecmd) and $makecmd =~ /^MAKE=(.*)$/) {
64         $make = $1;
65 }
66 else {
67         print "ext/util/make_ext:  WARNING:  Please include MAKE=\$(MAKE)\n";
68         print "\tin your call to make_ext.  See ext/util/make_ext for details.\n";
69         exit(1);
70 }
71
72
73 (my $here = getcwd()) =~ s{/}{\\}g;
74 my $perl = $^X;
75 if ($perl =~ m#^\.\.#) {
76     $perl = "$here\\$perl";
77 }
78 (my $topdir = $perl) =~ s/\\[^\\]+$//;
79 # miniperl needs to find perlglob and pl2bat
80 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
81 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
82 unless (-f "$pl2bat.bat") {
83     my @args = ($perl, ("$pl2bat.pl") x 2);
84     print "@args\n";
85     system(@args) unless defined $::Cross::platform;
86 }
87
88 my $dmod = -M $dep;
89 chdir($dir) || die "Cannot cd to $dir\n";
90 (my $ext = getcwd()) =~ s{/}{\\}g;
91 my $code;
92 FindExt::scan_ext($ext);
93 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
94
95 my @ext;
96 push @ext, FindExt::static_ext() if $static;
97 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
98
99
100 foreach $dir (sort @ext)
101  {
102   if (%incl and !exists $incl{$dir}) {
103     #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
104     next;
105   }
106   if (exists $excl{$dir}) {
107     warn "Skipping extension $ext\\$dir, not ported to current platform";
108     next;
109   }
110   if (chdir("$ext\\$dir"))
111    {
112     my $mmod = -M 'Makefile';
113     if (!(-f 'Makefile') || $mmod > $dmod)
114      {
115       print "\nRunning Makefile.PL in $dir\n";
116       my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
117                   'INSTALLDIRS=perl', 'PERL_CORE=1',
118                   (FindExt::is_static($dir)
119                    ? ('LINKTYPE=static') : ()), # if ext is static
120                 );
121       if (defined $::Cross::platform) {
122         @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
123       }
124       print join(' ', @perl), "\n";
125       $code = system(@perl);
126       warn "$code from $dir\'s Makefile.PL" if $code;
127       $mmod = -M 'Makefile';
128       if ($mmod > $dmod)
129        {
130         warn "Makefile $mmod > $dmod ($dep)\n";
131        }
132      }  
133     if ($targ)
134      {
135       print "Making $targ in $dir\n$make $targ\n";
136       $code = system("$make $targ");
137       die "Unsuccessful make($dir): code=$code" if $code!=0;
138      }
139     else
140      {
141       print "Making $dir\n$make\n";
142       $code = system($make);
143       die "Unsuccessful make($dir): code=$code" if $code!=0;
144      }
145     chdir($here) || die "Cannot cd to $here:$!";
146    }
147   else
148    {
149     warn "Cannot cd to $ext\\$dir:$!";
150    }
151  }
152