This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Break the --create-perllibst-h and --list-static-libs options out of buildext.pl
[perl5.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] +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 Cwd;
32 use FindExt;
33 use Config;
34
35 # @ARGV with '!' at first position are exclusions
36 my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
37 @ARGV = grep {!/^!/} @ARGV;
38 # @ARGV with '+' at first position are inclusions
39 my %incl = map {$_=>1} map {/^\+(.*)$/} @ARGV;
40 @ARGV = grep {!/^\+/} @ARGV;
41
42 # --static/--dynamic
43 my %opts = map {$_=>1} map {/^--([\w\-]+)$/} @ARGV;
44 @ARGV = grep {!/^--([\w\-]+)$/} @ARGV;
45 my ($static,$dynamic) = ((exists $opts{static}?1:0),(exists $opts{dynamic}?1:0));
46 if ("$static,$dynamic" eq "0,0") {
47   ($static,$dynamic) = (1,1);
48 }
49
50 (my $here = getcwd()) =~ s{/}{\\}g;
51 my $perl = $^X;
52 if ($perl =~ m#^\.\.#) {
53     $perl = "$here\\$perl";
54 }
55 (my $topdir = $perl) =~ s/\\[^\\]+$//;
56 # miniperl needs to find perlglob and pl2bat
57 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
58 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
59 unless (-f "$pl2bat.bat") {
60     my @args = ($perl, ("$pl2bat.pl") x 2);
61     print "@args\n";
62     system(@args) unless defined $::Cross::platform;
63 }
64 my $make = shift;
65 $make .= " ".shift while $ARGV[0]=~/^-/;
66 my $dep  = shift;
67 my $dmod = -M $dep;
68 my $dir  = shift;
69 chdir($dir) || die "Cannot cd to $dir\n";
70 my $targ  = shift;
71 (my $ext = getcwd()) =~ s{/}{\\}g;
72 my $code;
73 FindExt::scan_ext($ext);
74 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
75
76 my @ext;
77 push @ext, FindExt::static_ext() if $static;
78 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
79
80
81 foreach $dir (sort @ext)
82  {
83   if (%incl and !exists $incl{$dir}) {
84     #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
85     next;
86   }
87   if (exists $excl{$dir}) {
88     warn "Skipping extension $ext\\$dir, not ported to current platform";
89     next;
90   }
91   if (chdir("$ext\\$dir"))
92    {
93     my $mmod = -M 'Makefile';
94     if (!(-f 'Makefile') || $mmod > $dmod)
95      {
96       print "\nRunning Makefile.PL in $dir\n";
97       my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
98                   'INSTALLDIRS=perl', 'PERL_CORE=1',
99                   (FindExt::is_static($dir)
100                    ? ('LINKTYPE=static') : ()), # if ext is static
101                 );
102       if (defined $::Cross::platform) {
103         @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
104       }
105       print join(' ', @perl), "\n";
106       $code = system(@perl);
107       warn "$code from $dir\'s Makefile.PL" if $code;
108       $mmod = -M 'Makefile';
109       if ($mmod > $dmod)
110        {
111         warn "Makefile $mmod > $dmod ($dep)\n";
112        }
113      }  
114     if ($targ)
115      {
116       print "Making $targ in $dir\n$make $targ\n";
117       $code = system("$make $targ");
118       die "Unsuccessful make($dir): code=$code" if $code!=0;
119      }
120     else
121      {
122       print "Making $dir\n$make\n";
123       $code = system($make);
124       die "Unsuccessful make($dir): code=$code" if $code!=0;
125      }
126     chdir($here) || die "Cannot cd to $here:$!";
127    }
128   else
129    {
130     warn "Cannot cd to $ext\\$dir:$!";
131    }
132  }
133