This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make sure 'if' compiled before Pod::Simple
[perl5.git] / make_ext.pl
index 223f67e..0280a02 100644 (file)
@@ -48,6 +48,20 @@ my $ext_dirs_re = '(?:' . join('|', @ext_dirs) . ')';
 # by an '!ext' and are appropriate to the type of building being done.
 # An extensions follows the format of Foo/Bar, which would be extension Foo::Bar
 
+# To fix dependency ordering, on *nix systems, edit Makefile.SH to create a
+# rule.  That isn't sufficient for other systems; you also have to do
+# something in this file.  See the code at
+#       '# XXX hack for dependency # ordering'
+# below.
+#
+# The basic logic is:
+#   1) if there's a Makefile.PL in git for the module, use it. and call make
+#   2) If not, auto-generate one (normally)
+#   3) unless the auto-generation code figures out that the extension is
+#      *really* simple, in which case don't.  This will be for pure perl
+#      modules, and all that is needed to be done is to copy from the source
+#      to the dest directories.
+#
 # It may be deleted in a later release of perl so try to
 # avoid using it for other purposes.
 
@@ -201,19 +215,23 @@ elsif (IS_VMS) {
     push @extspec, 'DynaLoader' if $dynaloader;
 }
 
-{
+{ # XXX hack for dependency ordering
     # Cwd needs to be built before Encode recurses into subdirectories.
-    # Pod::Simple needs to be built before Pod::Functions
+    # Pod::Simple needs to be built before Pod::Functions, but after 'if'
+    # lib needs to be built before IO-Compress
     # This seems to be the simplest way to ensure this ordering:
-    my (@first, @other);
+    my (@first, @second, @other);
     foreach (@extspec) {
-       if ($_ eq 'Cwd' || $_ eq 'Pod/Simple') {
+       if ($_ eq 'Cwd' || $_ eq 'if' || $_ eq 'lib') {
            push @first, $_;
+        }
+       elsif ($_ eq 'Pod/Simple') {
+           push @second, $_;
        } else {
            push @other, $_;
        }
     }
-    @extspec = (@first, @other);
+    @extspec = (@first, @second, @other);
 }
 
 if ($Config{osname} eq 'catamount' and @extspec) {
@@ -287,7 +305,7 @@ sub build_extension {
     
     if (-f $makefile) {
        $makefile_no_minus_f = 0;
-       open my $mfh, $makefile or die "Cannot open $makefile: $!";
+       open my $mfh, '<', $makefile or die "Cannot open $makefile: $!";
        while (<$mfh>) {
            # Plagiarised from CPAN::Distribution
            last if /MakeMaker post_initialize section/;
@@ -302,7 +320,7 @@ sub build_extension {
            last unless defined $oldv;
            require ExtUtils::MM_Unix;
            defined (my $newv = parse_version MM $vmod) or last;
-           if ($newv ne $oldv) {
+           if (version->parse($newv) ne $oldv) {
                close $mfh or die "close $makefile: $!";
                _unlink($makefile);
                {
@@ -352,35 +370,26 @@ sub build_extension {
 
            print "\nCreating Makefile.PL in $ext_dir for $mname\n" if $verbose;
            my ($fromname, $key, $value);
-           if ($mname eq 'podlators') {
-               # We need to special case this somewhere, and this is fewer
-               # lines of code than a core-only Makefile.PL, and no more
-               # complex
-               $fromname = 'VERSION';
-               $key = 'DISTNAME';
-               $value = 'podlators';
-               $mname = 'Pod';
-           } else {
-               $key = 'ABSTRACT_FROM';
-               # We need to cope well with various possible layouts
-               my @dirs = split /::/, $mname;
-               my $leaf = pop @dirs;
-               my $leafname = "$leaf.pm";
-               my $pathname = join '/', @dirs, $leafname;
-               my @locations = ($leafname, $pathname, "lib/$pathname");
-               foreach (@locations) {
-                   if (-f $_) {
-                       $fromname = $_;
-                       last;
-                   }
-               }
 
-               unless ($fromname) {
-                   die "For $mname tried @locations in $ext_dir but can't find source";
+           $key = 'ABSTRACT_FROM';
+           # We need to cope well with various possible layouts
+           my @dirs = split /::/, $mname;
+           my $leaf = pop @dirs;
+           my $leafname = "$leaf.pm";
+           my $pathname = join '/', @dirs, $leafname;
+           my @locations = ($leafname, $pathname, "lib/$pathname");
+           foreach (@locations) {
+               if (-f $_) {
+                   $fromname = $_;
+                   last;
                }
-               ($value = $fromname) =~ s/\.pm\z/.pod/;
-               $value = $fromname unless -e $value;
-           }
+       }
+
+       unless ($fromname) {
+           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,
@@ -616,7 +625,7 @@ sub just_pm_to_blib {
     my ($first) = $mname =~ /^([^:]+)/;
 
     my $pm_to_blib = IS_VMS ? 'pm_to_blib.ts' : 'pm_to_blib';
-    my $silent = defined $ENV{MAKEFLAGS} and $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/;
+    my $silent = defined $ENV{MAKEFLAGS} && $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/;
 
     foreach my $leaf (<*>) {
         if (-d $leaf) {
@@ -661,7 +670,7 @@ sub just_pm_to_blib {
     die "Inconsistent module $mname has both lib/ and $first/"
         if $has_lib && $has_topdir;
 
-    print "\nRunning pm_to_blib for $ext_dir directly\n"
+    print "Running pm_to_blib for $ext_dir directly\n"
       unless $silent;
 
     my %pm;
@@ -708,20 +717,37 @@ sub just_pm_to_blib {
     }
     # This is running under miniperl, so no autodie
     if ($target eq 'all') {
-        local $ENV{PERL_INSTALL_QUIET} = 1;
-        require ExtUtils::Install;
-        ExtUtils::Install::pm_to_blib(\%pm, '../../lib/auto');
-        open my $fh, '>', $pm_to_blib
-            or die "Can't open '$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) {
-            # Fake the fallback cleanup
-            my $fallback
-                = join '', map {s!^\.\./\.\./!!; "rm -f $_\n"} sort values %pm;
-            foreach my $clean_target ('realclean', 'veryclean') {
-                fallback_cleanup($return_dir, $clean_target, $fallback);
+        my $need_update = 1;
+        if (-f $pm_to_blib) {
+            # avoid touching pm_to_blib unless there's something that
+            # needs updating, see #126710
+            $need_update = 0;
+            my $test_at = -M _;
+            while (my $from = each(%pm)) {
+                if (-M $from < $test_at) {
+                    ++$need_update;
+                    last;
+                }
+            }
+            keys %pm; # reset iterator
+        }
+
+        if ($need_update) {
+            local $ENV{PERL_INSTALL_QUIET} = 1;
+            require ExtUtils::Install;
+            ExtUtils::Install::pm_to_blib(\%pm, '../../lib/auto');
+            open my $fh, '>', $pm_to_blib
+                or die "Can't open '$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) {
+                # Fake the fallback cleanup
+                my $fallback
+                    = join '', map {s!^\.\./\.\./!!; "rm -f $_\n"} sort values %pm;
+                foreach my $clean_target ('realclean', 'veryclean') {
+                    fallback_cleanup($return_dir, $clean_target, $fallback);
+                }
             }
         }
     } else {