X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/d42e1eb74e834d1cf3ac4b5c9bd3527c3d5da67b..0917d9b3f21cfc484566f779a5f2a24849293fd2:/make_ext.pl diff --git a/make_ext.pl b/make_ext.pl index 6594458..87f8bf3 100644 --- a/make_ext.pl +++ b/make_ext.pl @@ -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); { @@ -505,6 +523,7 @@ EOM 'INSTALLMAN3DIR=none'; } push @args, @$pass_through; + push @args, 'PERL=' . $perl if $perl; # use miniperl to run the Makefile later _quote_args(\@args) if IS_VMS; print join(' ', $perl, @args), "\n" if $verbose; my $code = do { @@ -652,7 +671,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; @@ -699,20 +718,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 {