This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
amigaos4: flock unimplemented
[perl5.git] / make_ext.pl
index 09d0ab4..20c3bb0 100644 (file)
@@ -2,11 +2,11 @@
 use strict;
 use warnings;
 use Config;
-use constant IS_CROSS => defined $Config::Config{usecrosscompile} ? 1 : 0;
-
-my $is_Win32 = $^O eq 'MSWin32';
-my $is_VMS = $^O eq 'VMS';
-my $is_Unix = !$is_Win32 && !$is_VMS;
+use constant{IS_CROSS => defined $Config::Config{usecrosscompile} ? 1 : 0,
+             IS_WIN32 => $^O eq 'MSWin32',
+             IS_VMS   => $^O eq 'VMS',
+             IS_UNIX  => $^O ne 'MSWin32' && $^O ne 'VMS',
+};
 
 my @ext_dirs = qw(cpan dist ext);
 my $ext_dirs_re = '(?:' . join('|', @ext_dirs) . ')';
@@ -139,7 +139,7 @@ if (!@extspec and !$static and !$dynamic and !$nonxs and !$dynaloader)  {
 my $perl;
 my %extra_passthrough;
 
-if ($is_Win32) {
+if (IS_WIN32) {
     require Cwd;
     require FindExt;
     my $build = Cwd::getcwd();
@@ -185,10 +185,7 @@ if ($is_Win32) {
            next;
        }
        push @extspec, $_;
-       if($_ eq 'DynaLoader' and $target !~ /clean$/) {
-           # No, we don't know why nmake can't work out the dependency chain
-           push @{$extra_passthrough{$_}}, 'DynaLoader.c';
-       } elsif(FindExt::is_static($_)) {
+       if($_ ne 'DynaLoader' && FindExt::is_static($_)) {
            push @{$extra_passthrough{$_}}, 'LINKTYPE=static';
        }
     }
@@ -196,7 +193,7 @@ if ($is_Win32) {
     chdir '..'
        or die "Couldn't chdir to build directory: $!"; # now in the Perl build
 }
-elsif ($is_VMS) {
+elsif (IS_VMS) {
     $perl = $^X;
     push @extspec, (split ' ', $Config{static_ext}) if $static;
     push @extspec, (split ' ', $Config{dynamic_ext}) if $dynamic;
@@ -223,6 +220,7 @@ if ($Config{osname} eq 'catamount' and @extspec) {
     # Snowball's chance of building extensions.
     die "This is $Config{osname}, not building $extspec[0], sorry.\n";
 }
+$ENV{PERL_CORE} = 1;
 
 foreach my $spec (@extspec)  {
     my $mname = $spec;
@@ -274,10 +272,9 @@ sub build_extension {
     $perl ||= "$up/miniperl";
     my $return_dir = $up;
     my $lib_dir = "$up/lib";
-    $ENV{PERL_CORE} = 1;
 
-    my $makefile;
-    if ($is_VMS) {
+    my ($makefile, $makefile_no_minus_f);
+    if (IS_VMS) {
        $makefile = 'descrip.mms';
        if ($target =~ /clean$/
            && !-f $makefile
@@ -289,6 +286,7 @@ sub build_extension {
     }
     
     if (-f $makefile) {
+       $makefile_no_minus_f = 0;
        open my $mfh, $makefile or die "Cannot open $makefile: $!";
        while (<$mfh>) {
            # Plagiarised from CPAN::Distribution
@@ -339,9 +337,11 @@ sub build_extension {
                 _unlink($makefile);
             }
         }
+    } else {
+       $makefile_no_minus_f = 1;
     }
 
-    if (!-f $makefile) {
+    if ($makefile_no_minus_f || !-f $makefile) {
        NO_MAKEFILE:
        if (!-f 'Makefile.PL') {
             unless (just_pm_to_blib($target, $ext_dir, $mname, $return_dir)) {
@@ -368,7 +368,6 @@ sub build_extension {
                my $leafname = "$leaf.pm";
                my $pathname = join '/', @dirs, $leafname;
                my @locations = ($leafname, $pathname, "lib/$pathname");
-               unshift @locations, 'lib/IO/Compress/Base.pm' if $mname eq 'IO::Compress';
                foreach (@locations) {
                    if (-f $_) {
                        $fromname = $_;
@@ -377,11 +376,22 @@ sub build_extension {
                }
 
                unless ($fromname) {
-                   die "For $mname tried @locations in in $ext_dir but can't find source";
+                   die "For $mname tried @locations in $ext_dir but can't find source";
                }
                ($value = $fromname) =~ s/\.pm\z/.pod/;
                $value = $fromname unless -e $value;
            }
+
+            if ($mname eq 'Pod::Checker') {
+                # the abstract in the .pm file is unparseable by MM,
+                # so special-case it. We can't use the package's own
+                # Makefile.PL, as it doesn't handle the executable scripts
+                # right.
+                $key = 'ABSTRACT';
+                # this is copied from the CPAN Makefile.PL v 1.171
+                $value = 'Pod::Checker verifies POD documentation contents for compliance with the POD format specifications';
+            }
+
            open my $fh, '>', 'Makefile.PL'
                or die "Can't open Makefile.PL for writing: $!";
            printf $fh <<'EOM', $0, $mname, $fromname, $key, $value;
@@ -445,8 +455,8 @@ EOM
            # the Makefile.PL. Altering the atime and mtime backwards by 4
            # seconds seems to resolve the issue.
            eval {
-               my $ftime = time - 4;
-               utime $ftime, $ftime, 'Makefile.PL';
+        my $ftime = (stat('Makefile.PL'))[9] - 4;
+        utime $ftime, $ftime, 'Makefile.PL';
            };
         } elsif ($mname =~ /\A(?:Carp
                             |ExtUtils::CBuilder
@@ -496,7 +506,7 @@ EOM
        print "\nRunning Makefile.PL in $ext_dir\n" if $verbose;
 
        my @args = ("-I$lib_dir", 'Makefile.PL');
-       if ($is_VMS) {
+       if (IS_VMS) {
            my $libd = VMS::Filespec::vmspath($lib_dir);
            push @args, "INST_LIB=$libd", "INST_ARCHLIB=$libd";
        } else {
@@ -504,9 +514,12 @@ EOM
                'INSTALLMAN3DIR=none';
        }
        push @args, @$pass_through;
-       _quote_args(\@args) if $is_VMS;
+       _quote_args(\@args) if IS_VMS;
        print join(' ', $perl, @args), "\n" if $verbose;
-       my $code = system $perl, @args;
+       my $code = do {
+          local $ENV{PERL_MM_USE_DEFAULT} = 1;
+           system $perl, @args;
+       };
        warn "$code from $ext_dir\'s Makefile.PL" if $code;
 
        # Right. The reason for this little hack is that we're sitting inside
@@ -520,7 +533,7 @@ EOM
        # some of them rely on a $(PERL) for their own distclean targets.
        # But this always used to be a problem with the old /bin/sh version of
        # this.
-       if ($is_Unix) {
+       if (IS_UNIX) {
            foreach my $clean_target ('realclean', 'veryclean') {
                 fallback_cleanup($return_dir, $clean_target, <<"EOS");
 cd $ext_dir
@@ -531,7 +544,7 @@ else
     if test ! -f Makefile ; then
        echo "Warning: No Makefile!"
     fi
-    make -s $clean_target MAKE='@make' @pass_through
+    @make $clean_target MAKE='@make' @pass_through
 fi
 cd $return_dir
 EOS
@@ -543,7 +556,7 @@ EOS
        print "Warning: No Makefile!\n";
     }
 
-    if ($is_VMS) {
+    if (IS_VMS) {
        _quote_args($pass_through);
        @$pass_through = (
                          "/DESCRIPTION=$makefile",
@@ -551,16 +564,13 @@ EOS
                         );
     }
 
-    if (!$target or $target !~ /clean$/) {
-       # Give makefile an opportunity to rewrite itself.
-       # reassure users that life goes on...
-       my @args = ('config', @$pass_through);
-       system(@make, @args) and print "@make @args failed, continuing anyway...\n";
-    }
     my @targ = ($target, @$pass_through);
     print "Making $target in $ext_dir\n@make @targ\n" if $verbose;
     local $ENV{PERL_INSTALL_QUIET} = 1;
     my $code = system(@make, @targ);
+    if($code >> 8 != 0){ # probably cleaned itself, try again once more time
+        $code = system(@make, @targ);
+    }
     die "Unsuccessful make($ext_dir): code=$code" if $code != 0;
 
     chdir $return_dir || die "Cannot cd to $return_dir: $!";
@@ -601,12 +611,12 @@ sub just_pm_to_blib {
     my ($last) = $mname =~ /([^:]+)$/;
     my ($first) = $mname =~ /^([^:]+)/;
 
-    my $pm_to_blib = $is_VMS ? 'pm_to_blib.ts' : 'pm_to_blib';
+    my $pm_to_blib = IS_VMS ? 'pm_to_blib.ts' : 'pm_to_blib';
 
     foreach my $leaf (<*>) {
         if (-d $leaf) {
             $leaf =~ s/\.DIR\z//i
-                if $is_VMS;
+                if IS_VMS;
             next if $leaf =~ /\A(?:\.|\.\.|t|demo)\z/;
             if ($leaf eq 'lib') {
                 ++$has_lib;
@@ -620,7 +630,7 @@ sub just_pm_to_blib {
         return $leaf
             unless -f _;
         $leaf =~ s/\.\z//
-            if $is_VMS;
+            if IS_VMS;
         # Makefile.PL is "safe" to ignore because we will only be called for
         # directories that hold a Makefile.PL if they are in the exception list.
         next
@@ -700,7 +710,7 @@ sub just_pm_to_blib {
         print $fh "$0 has handled pm_to_blib directly\n";
         close $fh
             or die "Can't close '$pm_to_blib': $!";
-       if ($is_Unix) {
+       if (IS_UNIX) {
             # Fake the fallback cleanup
             my $fallback
                 = join '', map {s!^\.\./\.\./!!; "rm -f $_\n"} sort values %pm;
@@ -719,7 +729,7 @@ sub just_pm_to_blib {
             # (which it has to deal with, as cpan/foo/bar creates
             # lib/auto/foo/bar, but the EU::MM rule will only
             # rmdir lib/auto/foo/bar, leaving lib/auto/foo
-            _unlink("../../$_")
+            _unlink($_)
                 foreach sort values %pm;
         }
     }
@@ -732,7 +742,9 @@ sub fallback_cleanup {
     open my $fh, '>>', $file or die "open $file: $!";
     # Quite possible that we're being run in parallel here.
     # Can't use Fcntl this early to get the LOCK_EX
-    flock $fh, 2 or warn "flock $file: $!";
+    if ($^O ne "amigaos") {
+        flock $fh, 2 or warn "flock $file: $!";
+    }
     print $fh $contents or die "print $file: $!";
     close $fh or die "close $file: $!";
 }