This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
nmake distclean cleans too much from lib/Digest on Win32
[perl5.git] / win32 / buildext.pl
index 5800750..65b79be 100644 (file)
@@ -1,6 +1,34 @@
+=head1 NAME
+
+buildext.pl - build extensions
+
+=head1 SYNOPSIS
+
+    buildext.pl make [-make_opts] dep directory [target] !ext1 !ext2
+
+E.g.
+
+    buildext.pl nmake -nologo perldll.def ..\ext
+
+    buildext.pl nmake -nologo perldll.def ..\ext clean
+
+    buildext.pl dmake perldll.def ..\ext
+
+    buildext.pl dmake perldll.def ..\ext clean
+
+Will skip building extensions which are marked with an '!' char.
+Mostly because they still not ported to specified platform.
+
+=cut
+
 use File::Basename;
 use Cwd;
 use FindExt;
+
+# @ARGV with '!' at first position are exclusions
+my %excl = map {$_=>1} map {/^!(.*)$/} @ARGV;
+@ARGV = grep {!/^!/} @ARGV;
+
 my $here = getcwd();
 my $perl = $^X;
 $here =~ s,/,\\,g;
@@ -8,26 +36,48 @@ if ($perl =~ m#^\.\.#)
  {
   $perl = "$here\\$perl";
  }
+(my $topdir = $perl) =~ s/\\[^\\]+$//;
+# miniperl needs to find perlglob and pl2bat
+$ENV{PATH} = "$topdir;$topdir\\win32\\bin;$ENV{PATH}";
+#print "PATH=$ENV{PATH}\n";
+my $pl2bat = "$topdir\\win32\\bin\\pl2bat";
+unless (-f "$pl2bat.bat") {
+    my @args = ($perl, ("$pl2bat.pl") x 2);
+    print "@args\n";
+    system(@args) unless defined $::Cross::platform;
+}
 my $make = shift;
 $make .= " ".shift while $ARGV[0]=~/^-/;
 my $dep  = shift;
 my $dmod = -M $dep;
 my $dir  = shift;
 chdir($dir) || die "Cannot cd to $dir\n";
+my $targ  = shift;
 (my $ext = getcwd()) =~ s,/,\\,g;
+my $code;
 FindExt::scan_ext($ext);
 
 my @ext = FindExt::extensions();
 
 foreach my $dir (sort @ext)
  {
+  if (exists $excl{$dir}) {
+    warn "Skipping extension $ext\\$dir, not ported to current platform";
+    next;
+  }
   if (chdir("$ext\\$dir"))
    {
     my $mmod = -M 'Makefile';
     if (!(-f 'Makefile') || $mmod > $dmod)
      {
       print "\nRunning Makefile.PL in $dir\n";
-      my $code = system($perl,"-I$here\\..\lib",'Makefile.PL','INSTALLDIRS=perl');
+      my @perl = ($perl, "-I$here\\..\\lib", 'Makefile.PL',
+                  'INSTALLDIRS=perl', 'PERL_CORE=1');
+      if (defined $::Cross::platform) {
+       @perl = (@perl[0,1],"-MCross=$::Cross::platform",@perl[2..$#perl]);
+      }
+      print join(' ', @perl), "\n";
+      $code = system(@perl);
       warn "$code from $dir's Makefile.PL" if $code;
       $mmod = -M 'Makefile';
       if ($mmod > $dmod)
@@ -35,8 +85,18 @@ foreach my $dir (sort @ext)
         warn "Makefile $mmod > $dmod ($dep)\n";
        }
      }  
-    print "\nMaking $dir\n";
-    system($make);
+    if ($targ)
+     {
+      print "Making $targ in $dir\n$make $targ\n";
+      $code = system("$make $targ");
+      die "Unsuccessful make($dir): code=$code" if $code!=0;
+     }
+    else
+     {
+      print "Making $dir\n$make\n";
+      $code = system($make);
+      die "Unsuccessful make($dir): code=$code" if $code!=0;
+     }
     chdir($here) || die "Cannot cd to $here:$!";
    }
   else