e6a374d4221885b935c09a104d5da4b2194c3828
[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] +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 # @ARGV with '+' at first position are inclusions
37 # -- are long options.
38
39 my %excl, %incl,
40 my @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};
55 my $dynamic = $opts{dynamic};
56
57 $static = $dynamic = 1 unless $static or $dynamic;
58
59 my $makecmd = shift @argv;
60 my $dep  = shift @argv;
61 my $dir  = shift @argv;
62 my $targ = shift @argv;
63
64 my $make;
65 if (defined($makecmd) and $makecmd =~ /^MAKE=(.*)$/) {
66         $make = $1;
67 }
68 else {
69         print "ext/util/make_ext:  WARNING:  Please include MAKE=\$(MAKE)\n";
70         print "\tin your call to make_ext.  See ext/util/make_ext for details.\n";
71         exit(1);
72 }
73
74
75 (my $here = getcwd()) =~ s{/}{\\}g;
76 my $perl = $^X;
77 if ($perl =~ m#^\.\.#) {
78     $perl = "$here\\$perl";
79 }
80 (my $topdir = $perl) =~ s/\\[^\\]+$//;
81 # miniperl needs to find perlglob and pl2bat
82 $ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
83 my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
84 unless (-f "$pl2bat.bat") {
85     my @args = ($perl, ("$pl2bat.pl") x 2);
86     print "@args\n";
87     system(@args) unless defined $::Cross::platform;
88 }
89
90 my $dmod = -M $dep;
91 chdir($dir) || die "Cannot cd to $dir\n";
92 (my $ext = getcwd()) =~ s{/}{\\}g;
93 my $code;
94 FindExt::scan_ext($ext);
95 FindExt::set_static_extensions(split ' ', $Config{static_ext}) if $ext ne "ext";
96
97 my @ext;
98 push @ext, FindExt::static_ext() if $static;
99 push @ext, FindExt::dynamic_ext(), FindExt::nonxs_ext() if $dynamic;
100
101
102 foreach $dir (sort @ext)
103  {
104   if (%incl and !exists $incl{$dir}) {
105     #warn "Skipping extension $ext\\$dir, not in inclusion list\n";
106     next;
107   }
108   if (exists $excl{$dir}) {
109     warn "Skipping extension $ext\\$dir, not ported to current platform";
110     next;
111   }
112   if (chdir("$ext\\$dir"))
113    {
114     my $mmod = -M 'Makefile';
115     if (!(-f 'Makefile') || $mmod > $dmod)
116      {
117       print "\nRunning Makefile.PL in $dir\n";
118       my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
119                   'INSTALLDIRS=perl', 'PERL_CORE=1',
120                   (FindExt::is_static($dir)
121                    ? ('LINKTYPE=static') : ()), # if ext is static
122                 );
123       if (defined $::Cross::platform) {
124         @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
125       }
126       print join(' ', @perl), "\n";
127       $code = system(@perl);
128       warn "$code from $dir\'s Makefile.PL" if $code;
129       $mmod = -M 'Makefile';
130       if ($mmod > $dmod)
131        {
132         warn "Makefile $mmod > $dmod ($dep)\n";
133        }
134      }  
135     if ($targ)
136      {
137       print "Making $targ in $dir\n$make $targ\n";
138       $code = system("$make $targ");
139       die "Unsuccessful make($dir): code=$code" if $code!=0;
140      }
141     else
142      {
143       print "Making $dir\n$make\n";
144       $code = system($make);
145       die "Unsuccessful make($dir): code=$code" if $code!=0;
146      }
147     chdir($here) || die "Cannot cd to $here:$!";
148    }
149   else
150    {
151     warn "Cannot cd to $ext\\$dir:$!";
152    }
153  }
154