X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/1179df5f52411bc16f719e9134d4978bc0c05cd9..00590f3b684a70c4f598065f608a169c71e2f207:/make_ext.pl diff --git a/make_ext.pl b/make_ext.pl index d6561b1..799ab8b 100644 --- a/make_ext.pl +++ b/make_ext.pl @@ -2,15 +2,6 @@ use strict; use warnings; use Config; -BEGIN { - if ($^O eq 'MSWin32') { - unshift @INC, '../dist/Cwd'; - require FindExt; - } else { - unshift @INC, 'dist/Cwd'; - } -} -use Cwd; my $is_Win32 = $^O eq 'MSWin32'; my $is_VMS = $^O eq 'VMS'; @@ -52,7 +43,7 @@ my $ext_dirs_re = '(?:' . join('|', @ext_dirs) . ')'; # Mostly because they still not ported to specified platform. # # If any extensions are listed with a '+' char then only those -# extensions will be built, but only if they arent countermanded +# extensions will be built, but only if they aren't countermanded # by an '!ext' and are appropriate to the type of building being done. # It may be deleted in a later release of perl so try to @@ -147,7 +138,9 @@ my $perl; my %extra_passthrough; if ($is_Win32) { - my $build = getcwd(); + require Cwd; + require FindExt; + my $build = Cwd::getcwd(); $perl = $^X; if ($perl =~ m#^\.\.#) { my $here = $build; @@ -167,7 +160,7 @@ if ($is_Win32) { print "In $build"; foreach my $dir (@dirs) { chdir($dir) or die "Cannot cd to $dir: $!\n"; - (my $ext = getcwd()) =~ s{/}{\\}g; + (my $ext = Cwd::getcwd()) =~ s{/}{\\}g; FindExt::scan_ext($ext); FindExt::set_static_extensions(split ' ', $Config{static_ext}); chdir $build @@ -288,6 +281,28 @@ sub build_extension { $makefile = 'Makefile'; } + if (-f $makefile) { + open my $mfh, $makefile or die "Cannot open $makefile: $!"; + while (<$mfh>) { + # Plagiarised from CPAN::Distribution + last if /MakeMaker post_initialize section/; + next unless /^#\s+VERSION_FROM\s+=>\s+(.+)/; + my $vmod = eval $1; + my $oldv; + while (<$mfh>) { + next unless /^XS_VERSION = (\S+)/; + $oldv = $1; + last; + } + last unless defined $oldv; + require ExtUtils::MM_Unix; + defined (my $newv = parse_version MM $vmod) or last; + if ($newv ne $oldv) { + 1 while unlink $makefile + } + } + } + if (!-f $makefile) { if (!-f 'Makefile.PL') { print "\nCreating Makefile.PL in $ext_dir for $mname\n"; @@ -377,11 +392,17 @@ WriteMakefile( # ex: set ro: EOM close $fh or die "Can't close Makefile.PL: $!"; + # As described in commit 23525070d6c0e51f: + # Push the atime and mtime of generated Makefile.PLs back 4 + # seconds. In certain circumstances ( on virtual machines ) the + # generated Makefile.PL can produce a Makefile that is older than + # 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'; + }; } - eval { - my $ftime = time - 4; - utime $ftime, $ftime, 'Makefile.PL'; - }; print "\nRunning Makefile.PL in $ext_dir\n"; # Presumably this can be simplified @@ -450,8 +471,11 @@ EOS } if ($is_VMS) { - _macroify_passthrough($pass_through); - unshift @$pass_through, "/DESCRIPTION=$makefile"; + _quote_args($pass_through); + @$pass_through = ( + "/DESCRIPTION=$makefile", + '/MACRO=(' . join(',',@$pass_through) . ')' + ); } if (!$target or $target !~ /clean$/) { @@ -479,11 +503,3 @@ sub _quote_args { } @{$args} ; } - -sub _macroify_passthrough { - my $passthrough = shift; - _quote_args($passthrough); - my $macro = '/MACRO=(' . join(',',@$passthrough) . ')'; - @$passthrough = (); - @$passthrough[0] = $macro; -}