X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FMM_Unix.pm;h=4f348831f9009d5416b9a6095b2f62ef2ba344c0;hb=afa6035dfed8c8b76d51a5825dc9d138e642958c;hp=da6a03233cee56d8aad3c73b4113ce3a048529a8;hpb=f566a835390510a17d48e463c9c63df19f5ba200;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index da6a032..4f34883 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -5,12 +5,13 @@ use strict; use Exporter (); use Config; use File::Basename qw(basename dirname fileparse); +use File::Spec; use DirHandle; use strict; -our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos,$Is_PERL_OBJECT, +our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos, $Verbose,%pm,%static,$Xsubpp_Version); -our $VERSION = '1.12603'; +our $VERSION = '1.12606'; require ExtUtils::MakeMaker; ExtUtils::MakeMaker->import(qw($Verbose &neatvalue)); @@ -20,8 +21,6 @@ $Is_Mac = $^O eq 'MacOS'; $Is_Win32 = $^O eq 'MSWin32'; $Is_Dos = $^O eq 'dos'; -$Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/; - if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; import VMS::Filespec qw( &vmsify ); @@ -107,13 +106,8 @@ trailing slash :-) # '; sub catdir { - my $self = shift @_; - my @args = @_; - for (@args) { - # append a slash to each argument unless it has one there - $_ .= "/" if $_ eq '' or substr($_,-1) ne "/"; - } - $self->canonpath(join('', @args)); + shift; + return File::Spec->catdir(@_); } =item catfile @@ -124,14 +118,8 @@ complete path ending with a filename =cut sub catfile { - my $self = shift @_; - my $file = pop @_; - return $self->canonpath($file) unless @_; - my $dir = $self->catdir(@_); - for ($dir) { - $_ .= "/" unless substr($_,length($_)-1,1) eq "/"; - } - return $self->canonpath($dir.$file); + shift; + return File::Spec->catdir(@_); } =item curdir @@ -141,7 +129,7 @@ Returns a string representing of the current directory. "." on UNIX. =cut sub curdir { - return "." ; + return File::Spec->curdir(); } =item rootdir @@ -151,7 +139,7 @@ Returns a string representing of the root directory. "/" on UNIX. =cut sub rootdir { - return "/"; + return File::Spec->rootdir(); } =item updir @@ -161,88 +149,87 @@ Returns a string representing of the parent directory. ".." on UNIX. =cut sub updir { - return ".."; -} - -sub ExtUtils::MM_Unix::c_o ; -sub ExtUtils::MM_Unix::clean ; -sub ExtUtils::MM_Unix::const_cccmd ; -sub ExtUtils::MM_Unix::const_config ; -sub ExtUtils::MM_Unix::const_loadlibs ; -sub ExtUtils::MM_Unix::constants ; -sub ExtUtils::MM_Unix::depend ; -sub ExtUtils::MM_Unix::dir_target ; -sub ExtUtils::MM_Unix::dist ; -sub ExtUtils::MM_Unix::dist_basics ; -sub ExtUtils::MM_Unix::dist_ci ; -sub ExtUtils::MM_Unix::dist_core ; -sub ExtUtils::MM_Unix::dist_dir ; -sub ExtUtils::MM_Unix::dist_test ; -sub ExtUtils::MM_Unix::dlsyms ; -sub ExtUtils::MM_Unix::dynamic ; -sub ExtUtils::MM_Unix::dynamic_bs ; -sub ExtUtils::MM_Unix::dynamic_lib ; -sub ExtUtils::MM_Unix::exescan ; -sub ExtUtils::MM_Unix::export_list ; -sub ExtUtils::MM_Unix::extliblist ; -sub ExtUtils::MM_Unix::file_name_is_absolute ; -sub ExtUtils::MM_Unix::find_perl ; -sub ExtUtils::MM_Unix::fixin ; -sub ExtUtils::MM_Unix::force ; -sub ExtUtils::MM_Unix::guess_name ; -sub ExtUtils::MM_Unix::has_link_code ; -sub ExtUtils::MM_Unix::htmlifypods ; -sub ExtUtils::MM_Unix::init_dirscan ; -sub ExtUtils::MM_Unix::init_main ; -sub ExtUtils::MM_Unix::init_others ; -sub ExtUtils::MM_Unix::install ; -sub ExtUtils::MM_Unix::installbin ; -sub ExtUtils::MM_Unix::libscan ; -sub ExtUtils::MM_Unix::linkext ; -sub ExtUtils::MM_Unix::lsdir ; -sub ExtUtils::MM_Unix::macro ; -sub ExtUtils::MM_Unix::makeaperl ; -sub ExtUtils::MM_Unix::makefile ; -sub ExtUtils::MM_Unix::manifypods ; -sub ExtUtils::MM_Unix::maybe_command ; -sub ExtUtils::MM_Unix::maybe_command_in_dirs ; -sub ExtUtils::MM_Unix::needs_linking ; -sub ExtUtils::MM_Unix::nicetext ; -sub ExtUtils::MM_Unix::parse_version ; -sub ExtUtils::MM_Unix::pasthru ; -sub ExtUtils::MM_Unix::path ; -sub ExtUtils::MM_Unix::perl_archive; -sub ExtUtils::MM_Unix::perl_archive_after; -sub ExtUtils::MM_Unix::perl_script ; -sub ExtUtils::MM_Unix::perldepend ; -sub ExtUtils::MM_Unix::pm_to_blib ; -sub ExtUtils::MM_Unix::post_constants ; -sub ExtUtils::MM_Unix::post_initialize ; -sub ExtUtils::MM_Unix::postamble ; -sub ExtUtils::MM_Unix::ppd ; -sub ExtUtils::MM_Unix::prefixify ; -sub ExtUtils::MM_Unix::processPL ; -sub ExtUtils::MM_Unix::realclean ; -sub ExtUtils::MM_Unix::replace_manpage_separator ; -sub ExtUtils::MM_Unix::static ; -sub ExtUtils::MM_Unix::static_lib ; -sub ExtUtils::MM_Unix::staticmake ; -sub ExtUtils::MM_Unix::subdir_x ; -sub ExtUtils::MM_Unix::subdirs ; -sub ExtUtils::MM_Unix::test ; -sub ExtUtils::MM_Unix::test_via_harness ; -sub ExtUtils::MM_Unix::test_via_script ; -sub ExtUtils::MM_Unix::tool_autosplit ; -sub ExtUtils::MM_Unix::tool_xsubpp ; -sub ExtUtils::MM_Unix::tools_other ; -sub ExtUtils::MM_Unix::top_targets ; -sub ExtUtils::MM_Unix::writedoc ; -sub ExtUtils::MM_Unix::xs_c ; -sub ExtUtils::MM_Unix::xs_cpp ; -sub ExtUtils::MM_Unix::xs_o ; -sub ExtUtils::MM_Unix::xsubpp_version ; - -package ExtUtils::MM_Unix; + return File::Spec->updir(); +} + +sub c_o; +sub clean; +sub const_cccmd; +sub const_config; +sub const_loadlibs; +sub constants; +sub depend; +sub dir_target; +sub dist; +sub dist_basics; +sub dist_ci; +sub dist_core; +sub dist_dir; +sub dist_test; +sub dlsyms; +sub dynamic; +sub dynamic_bs; +sub dynamic_lib; +sub exescan; +sub export_list; +sub extliblist; +sub file_name_is_absolute; +sub find_perl; +sub fixin; +sub force; +sub guess_name; +sub has_link_code; +sub htmlifypods; +sub init_dirscan; +sub init_main; +sub init_others; +sub install; +sub installbin; +sub libscan; +sub linkext; +sub lsdir; +sub macro; +sub makeaperl; +sub makefile; +sub manifypods; +sub maybe_command; +sub maybe_command_in_dirs; +sub needs_linking; +sub nicetext; +sub parse_version; +sub pasthru; +sub path; +sub perl_archive; +sub perl_archive_after; +sub perl_script; +sub perldepend; +sub pm_to_blib; +sub post_constants; +sub post_initialize; +sub postamble; +sub ppd; +sub prefixify; +sub processPL; +sub quote_paren; +sub realclean; +sub replace_manpage_separator; +sub static; +sub static_lib; +sub staticmake; +sub subdir_x; +sub subdirs; +sub test; +sub test_via_harness; +sub test_via_script; +sub tool_autosplit; +sub tool_xsubpp; +sub tools_other; +sub top_targets; +sub writedoc; +sub xs_c; +sub xs_cpp; +sub xs_o; +sub xsubpp_version; use SelfLoader; @@ -274,30 +261,30 @@ sub c_o { $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/; push @m, ' .c.i: - '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c > $*.i + '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i '; } push @m, ' .c.s: - $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c + $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c '; push @m, ' .c$(OBJ_EXT): - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c '; push @m, ' .C$(OBJ_EXT): - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.C ' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific push @m, ' .cpp$(OBJ_EXT): - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cpp .cxx$(OBJ_EXT): - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cxx .cc$(OBJ_EXT): - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cc '; join "", @m; } @@ -388,27 +375,6 @@ sub cflags { $self->{uc $_} ||= $cflags{$_} } - if ($Is_PERL_OBJECT) { - $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\b|$)/-DPERL_CAPI/g; - if ($Is_Win32) { - if ($Config{'cc'} =~ /^cl/i) { - # Turn off C++ mode of the MSC compiler - $self->{CCFLAGS} =~ s/-TP(\s|$)//g; - $self->{OPTIMIZE} =~ s/-TP(\s|$)//g; - } - elsif ($Config{'cc'} =~ /^bcc32/i) { - # Turn off C++ mode of the Borland compiler - $self->{CCFLAGS} =~ s/-P(\s|$)//g; - $self->{OPTIMIZE} =~ s/-P(\s|$)//g; - } - elsif ($Config{'cc'} =~ /^gcc/i) { - # Turn off C++ mode of the GCC compiler - $self->{CCFLAGS} =~ s/-xc\+\+(\s|$)//g; - $self->{OPTIMIZE} =~ s/-xc\+\+(\s|$)//g; - } - } - } - if ($self->{POLLUTE}) { $self->{CCFLAGS} .= ' -DPERL_POLLUTE '; } @@ -420,6 +386,9 @@ sub cflags { $pollute = '$(PERL_MALLOC_DEF)'; } + $self->{CCFLAGS} = quote_paren($self->{CCFLAGS}); + $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE}); + return $self->{CFLAGS} = qq{ CCFLAGS = $self->{CCFLAGS} OPTIMIZE = $self->{OPTIMIZE} @@ -478,7 +447,7 @@ EOT *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def - $(BASEEXT).exp + $(BASEEXT).exp $(BASEEXT).x ]); push @m, "\t-$self->{RM_RF} @otherfiles\n"; # See realclean and ext/utils/make_ext for usage of Makefile.old @@ -501,7 +470,8 @@ sub const_cccmd { return $self->{CONST_CCCMD} if $self->{CONST_CCCMD}; return '' unless $self->needs_linking(); return $self->{CONST_CCCMD} = - q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\ + q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\ + $(CCFLAGS) $(OPTIMIZE) \\ $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\ $(XS_DEFINE_VERSION)}; } @@ -524,7 +494,8 @@ sub const_config { foreach $m (@{$self->{CONFIG}}){ # SITE*EXP macros are defined in &constants; avoid duplicates here next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp'; - push @m, "\U$m\E = ".$self->{uc $m}."\n"; + $self->{uc $m} = quote_paren($self->{uc $m}); + push @m, uc($m) , ' = ' , $self->{uc $m}, "\n"; $once_only{$m} = 1; } join('', @m); @@ -671,11 +642,11 @@ CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h my @parentdir = split(/::/, $self->{PARENT_NAME}); push @m, q{ # Where to put things: -INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{ -INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{ +INST_LIBDIR = }. File::Spec->catdir('$(INST_LIB)',@parentdir) .q{ +INST_ARCHLIBDIR = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir) .q{ -INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{ -INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{ +INST_AUTODIR = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{ +INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{ }; if ($self->has_link_code()) { @@ -758,8 +729,8 @@ sub dir_target { my($self,@dirs) = @_; my(@m,$dir,$targdir); foreach $dir (@dirs) { - my($src) = $self->catfile($self->{PERL_INC},'perl.h'); - my($targ) = $self->catfile($dir,'.exists'); + my($src) = File::Spec->catfile($self->{PERL_INC},'perl.h'); + my($targ) = File::Spec->catfile($dir,'.exists'); # catfile may have adapted syntax of $dir to target OS, so... if ($Is_VMS) { # Just remove file name; dirspec is often in macro ($targdir = $targ) =~ s:/?\.exists\z::; @@ -1113,8 +1084,25 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists push(@m,' $(RM_F) $@ '); - push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom. - ' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)'); + my $libs = $self->{LDLOADLIBS}; + + if ($^O eq 'netbsd') { + # Use nothing on static perl platforms, and to the flags needed + # to link against the shared libperl library on shared perl + # platforms. We peek at lddlflags to see if we need -Wl,-R + # or -R to add paths to the run-time library search path. + if ($Config{'useshrplib'}) { + if ($Config{'lddlflags'} =~ /-Wl,-R/) { + $libs = '-L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl'; + } elsif ($Config{'lddlflags'} =~ /-R/) { + $libs = '-L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl'; + } + } + } + + push(@m, +' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom. +' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)'); push @m, ' $(CHMOD) $(PERM_RWX) $@ '; @@ -1154,13 +1142,8 @@ Takes as argument a path and returns true, if it is an absolute path. =cut sub file_name_is_absolute { - my($self,$file) = @_; - if ($Is_Dos){ - $file =~ m{^([a-z]:)?[\\/]}is ; - } - else { - $file =~ m:^/:s ; - } + shift; + return File::Spec->file_name_is_absolute(@_); } =item find_perl @@ -1183,12 +1166,12 @@ in these dirs: foreach $dir (@$dirs){ next unless defined $dir; # $self->{PERL_SRC} may be undefined my ($abs, $val); - if ($self->file_name_is_absolute($name)) { # /foo/bar + if (File::Spec->file_name_is_absolute($name)) { # /foo/bar $abs = $name; - } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo - $abs = $self->catfile($dir, $name); + } elsif (File::Spec->canonpath($name) eq File::Spec->canonpath(basename($name))) { # foo + $abs = File::Spec->catfile($dir, $name); } else { # foo/bar - $abs = $self->canonpath($self->catfile($self->curdir, $name)); + $abs = File::Spec->canonpath(File::Spec->catfile(File::Spec->curdir, $name)); } print "Checking $abs\n" if ($trace >= 2); next unless $self->maybe_command($abs); @@ -1245,13 +1228,13 @@ sub fixin { # stolen from the pink Camel book, more or less $interpreter = $Config{perlpath}; } } else { - my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path; + my(@absdirs) = reverse grep {File::Spec->file_name_is_absolute} File::Spec->path; $interpreter = ''; my($dir); foreach $dir (@absdirs) { if ($self->maybe_command($cmd)) { warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter; - $interpreter = $self->catfile($dir,$cmd); + $interpreter = File::Spec->catfile($dir,$cmd); } } } @@ -1386,9 +1369,9 @@ sub htmlifypods { my($dist); my($pod2html_exe); if (defined $self->{PERL_SRC}) { - $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html'); + $pod2html_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2html'); } else { - $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html'); + $pod2html_exe = File::Spec->catfile($Config{scriptdirexp},'pod2html'); } unless ($pod2html_exe = $self->perl_script($pod2html_exe)) { # No pod2html but some HTMLxxxPODS to be installed @@ -1434,13 +1417,13 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) local(%pm); #the sub in find() has to see this hash @ignore{qw(Makefile.PL test.pl)} = (1,1); $ignore{'makefile.pl'} = 1 if $Is_VMS; - foreach $name ($self->lsdir($self->curdir)){ + foreach $name ($self->lsdir(File::Spec->curdir)){ next if $name =~ /\#/; - next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name}; + next if $name eq File::Spec->curdir or $name eq File::Spec->updir or $ignore{$name}; next unless $self->libscan($name); if (-d $name){ next if -l $name; # We do not support symlinks at all - $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL")); + $dir{$name} = $name if (-f File::Spec->catfile($name,"Makefile.PL")); } elsif ($name =~ /\.xs\z/){ my($c); ($c = $name) =~ s/\.xs\z/.c/; $xs{$name} = $c; @@ -1459,9 +1442,9 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) if ($txt =~ /Extracting \S+ \(with variable substitutions/) { ($pl_files{$name} = $name) =~ s/[._]pl\z//i ; } - else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); } + else { $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name); } } elsif ($name =~ /\.(p[ml]|pod)\z/){ - $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); + $pm{$name} = File::Spec->catfile($self->{INST_LIBDIR},$name); } } @@ -1517,11 +1500,11 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) return; } return if /\#/; - my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)'); + my($path, $prefix) = ($File::Find::name, $self->{INST_LIBDIR}); my($striplibpath,$striplibname); - $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i); + $prefix = $self->{INST_LIB} if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i); ($striplibname,$striplibpath) = fileparse($striplibpath); - my($inst) = $self->catfile($prefix,$striplibpath,$striplibname); + my($inst) = File::Spec->catfile($prefix,$striplibpath,$striplibname); local($_) = $inst; # for backwards compatibility $inst = $self->libscan($inst); print "libscan($path) => '$inst'\n" if ($Verbose >= 2); @@ -1568,11 +1551,11 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) next unless $ispod; if ($pods{HTMLSCRIPT}) { $self->{HTMLSCRIPTPODS}->{$name} = - $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)"); + File::Spec->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)"); } if ($pods{MAN1}) { $self->{MAN1PODS}->{$name} = - $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)"); + File::Spec->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)"); } } } @@ -1606,7 +1589,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) # Remove "Configure.pm" and similar, if it's not the only pod listed # To force inclusion, just name it "Configure.pod", or override MAN3PODS foreach $name (keys %manifypods) { - if ($name =~ /(config|setup).*\.pm/is) { + if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) { delete $manifypods{$name}; next; } @@ -1614,15 +1597,15 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) $manpagename =~ s/\.p(od|m|l)\z//; if ($pods{HTMLLIB}) { $self->{HTMLLIBPODS}->{$name} = - $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)"); + File::Spec->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)"); } unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok - $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename); + $manpagename = File::Spec->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename); } if ($pods{MAN3}) { $manpagename = $self->replace_manpage_separator($manpagename); $self->{MAN3PODS}->{$name} = - $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)"); + File::Spec->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)"); } } } @@ -1630,10 +1613,11 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) =item init_main -Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC, -PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*, -PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET, -LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM. +Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE, +EXE_EXT, FULLEXT, FULLPERL, INST_*, INSTALL*, INSTALLDIRS, LD, +LIB_EXT, LIBPERL_A, MAP_TARGET, NAME, OBJ_EXT, PARENT_NAME, PERL, +PERL_ARCHLIB, PERL_INC, PERL_LIB, PERL_SRC, PERLRUN, PERLRUNINST, +PREFIX, TEST_LIBS, VERSION, VERSION_FROM, VERSION_SYM, XS_VERSION. =cut @@ -1650,7 +1634,7 @@ sub init_main { ### Only UNIX: ### ($self->{FULLEXT} = ### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket - $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME}); + $self->{FULLEXT} = File::Spec->catdir(split /::/, $self->{NAME}); # Copied from DynaLoader: @@ -1689,13 +1673,13 @@ sub init_main { unless ($self->{PERL_SRC}){ my($dir); - foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir(),$self->updir())){ + foreach $dir (File::Spec->updir(),File::Spec->catdir(File::Spec->updir(),File::Spec->updir()),File::Spec->catdir(File::Spec->updir(),File::Spec->updir(),File::Spec->updir()),File::Spec->catdir(File::Spec->updir(),File::Spec->updir(),File::Spec->updir(),File::Spec->updir())){ if ( - -f $self->catfile($dir,"config.sh") + -f File::Spec->catfile($dir,"config.sh") && - -f $self->catfile($dir,"perl.h") + -f File::Spec->catfile($dir,"perl.h") && - -f $self->catfile($dir,"lib","Exporter.pm") + -f File::Spec->catfile($dir,"lib","Exporter.pm") ) { $self->{PERL_SRC}=$dir ; last; @@ -1703,17 +1687,17 @@ sub init_main { } } if ($self->{PERL_SRC}){ - $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib"); + $self->{PERL_LIB} ||= File::Spec->catdir("$self->{PERL_SRC}","lib"); $self->{PERL_ARCHLIB} = $self->{PERL_LIB}; - $self->{PERL_INC} = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC}; + $self->{PERL_INC} = ($Is_Win32) ? File::Spec->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC}; # catch a situation that has occurred a few times in the past: unless ( - -s $self->catfile($self->{PERL_SRC},'cflags') + -s File::Spec->catfile($self->{PERL_SRC},'cflags') or $Is_VMS && - -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt') + -s File::Spec->catfile($self->{PERL_SRC},'perlshr_attr.opt') or $Is_Mac or @@ -1738,21 +1722,21 @@ from the perl source tree. my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC}; $self->{PERL_LIB} ||= $Config::Config{privlibexp}; $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp}; - $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now + $self->{PERL_INC} = File::Spec->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now my $perl_h; no warnings 'uninitialized' ; - if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")) + if (not -f ($perl_h = File::Spec->catfile($self->{PERL_INC},"perl.h")) and not $old){ # Maybe somebody tries to build an extension with an # uninstalled Perl outside of Perl build tree my $found; for my $dir (@INC) { - $found = $dir, last if -e $self->catdir($dir, "Config.pm"); + $found = $dir, last if -e File::Spec->catdir($dir, "Config.pm"); } if ($found) { my $inc = dirname $found; - if (-e $self->catdir($inc, "perl.h")) { + if (-e File::Spec->catdir($inc, "perl.h")) { $self->{PERL_LIB} = $found; $self->{PERL_ARCHLIB} = $found; $self->{PERL_INC} = $inc; @@ -1800,25 +1784,25 @@ usually solves this kind of problem. if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") { $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB}; } else { - $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib"); + $self->{INST_LIB} = File::Spec->catdir(File::Spec->curdir,"blib","lib"); } } - $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch"); - $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin'); + $self->{INST_ARCHLIB} ||= File::Spec->catdir(File::Spec->curdir,"blib","arch"); + $self->{INST_BIN} ||= File::Spec->catdir(File::Spec->curdir,'blib','bin'); # We need to set up INST_LIBDIR before init_libscan() for VMS my @parentdir = split(/::/, $self->{PARENT_NAME}); - $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir); - $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir); - $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)'); - $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)'); + $self->{INST_LIBDIR} = File::Spec->catdir($self->{INST_LIB},@parentdir); + $self->{INST_ARCHLIBDIR} = File::Spec->catdir($self->{INST_ARCHLIB},@parentdir); + $self->{INST_AUTODIR} = File::Spec->catdir($self->{INST_LIB},'auto',$self->{FULLEXT}); + $self->{INST_ARCHAUTODIR} = File::Spec->catdir($self->{INST_ARCHLIB},'auto',$self->{FULLEXT}); # INST_EXE is deprecated, should go away March '97 - $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script'); - $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script'); + $self->{INST_EXE} ||= File::Spec->catdir(File::Spec->curdir,'blib','script'); + $self->{INST_SCRIPT} ||= File::Spec->catdir(File::Spec->curdir,'blib','script'); # The user who requests an installation directory explicitly - # should not have to tell us a architecture installation directory + # should not have to tell us an architecture installation directory # as well. We look if a directory exists that is named after the # architecture. If not we take it as a sign that it should be the # same as the requested installation directory. Otherwise we take @@ -1904,14 +1888,14 @@ usually solves this kind of problem. $self->prefixify($install_variable,$search_prefix,$replace_prefix); } } - my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man"); + my $funkymandir = File::Spec->catdir($configure_prefix,"lib","perl5","man"); $funkymandir = '' unless -d $funkymandir; - $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man"); - if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) { - $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man"); + $search_prefix = $funkymandir || File::Spec->catdir($configure_prefix,"man"); + if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5", "man")) { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man"); } else { - $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man"); + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"man"); } for $install_variable (qw/ INSTALLMAN1DIR @@ -1929,7 +1913,7 @@ usually solves this kind of problem. if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){ $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR}; } else { - $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1'); + $self->{INST_MAN1DIR} = File::Spec->catdir(File::Spec->curdir,'blib','man1'); } } $self->{MAN1EXT} ||= $Config::Config{man1ext}; @@ -1940,7 +1924,7 @@ usually solves this kind of problem. if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){ $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR}; } else { - $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3'); + $self->{INST_MAN3DIR} = File::Spec->catdir(File::Spec->curdir,'blib','man3'); } } $self->{MAN3EXT} ||= $Config::Config{man3ext}; @@ -1954,7 +1938,7 @@ usually solves this kind of problem. if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){ $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR}; } else { - $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib'); + $self->{INST_HTMLLIBDIR} = File::Spec->catdir(File::Spec->curdir,'blib','html','lib'); } } @@ -1964,7 +1948,7 @@ usually solves this kind of problem. if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){ $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR}; } else { - $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin'); + $self->{INST_HTMLSCRIPTDIR} = File::Spec->catdir(File::Spec->curdir,'blib','html','bin'); } } $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html'; @@ -2006,7 +1990,7 @@ usually solves this kind of problem. # make a simple check if we find Exporter warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory (Exporter.pm not found)" - unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") || + unless -f File::Spec->catfile("$self->{PERL_LIB}","Exporter.pm") || $self->{NAME} eq "ExtUtils::MakeMaker"; # Determine VERSION and VERSION_FROM @@ -2035,16 +2019,32 @@ usually solves this kind of problem. # --- Initialize Perl Binary Locations # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL' - # will be working versions of perl 5. miniperl has priority over perl - # for PERL to ensure that $(PERL) is usable while building ./ext/* + # will be working versions of perl 5. my ($component,@defpath); - foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) { + foreach $component ($self->{PERL_SRC}, $self->path(), + $Config::Config{binexp}) + { push @defpath, $component if defined $component; } + + my @perls = ($self->canonpath($^X), 'perl', 'perl5', "perl$Config{version}"); + + # miniperl has priority over all but the cannonical perl when in the + # core. Otherwise its a last resort. + if( $self->{PERL_CORE} ) { + splice @perls, 1, 0, 'miniperl'; + } + else { + push @perls, 'miniperl'; + } + + # Build up a set of file names (not command names). + foreach $element (@perls) { + $element .= "$Config{exe_ext}"; + } + $self->{PERL} ||= - $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl', - 'perl','perl5',"perl$Config{version}" ], - \@defpath, $Verbose ); + $self->find_perl(5.0, \@perls, \@defpath, $Verbose ); # don't check if perl is executable, maybe they have decided to # supply switches with perl @@ -2055,19 +2055,22 @@ usually solves this kind of problem. # Are we building the core? $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE}; + my $aq = ($^O eq 'VMS' ? '"' : ''); # command-line argument quoter + # How do we run perl? $self->{PERLRUN} = $self->{PERL}; + $self->{PERLRUN} .= " -${aq}I\$(PERL_LIB)$aq" if $self->{UNINSTALLED_PERL}; # How do we run perl when installing libraries? - $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)'; + $self->{PERLRUNINST} .= $self->{PERLRUN}. " -${aq}I\$(INST_ARCHLIB)$aq -${aq}I\$(INST_LIB)$aq"; # What extra library dirs do we need when running the tests? - $self->{TEST_LIBS} .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)'; + $self->{TEST_LIBS} .= " -${aq}I\$(INST_ARCHLIB)$aq -${aq}I\$(INST_LIB)$aq"; # When building the core, we need to add some helper libs since # perl's @INC won't work (we're not installed yet). foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) { - $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)' + $self->{$targ} .= " -${aq}I\$(PERL_ARCHLIB)$aq -${aq}I\$(PERL_LIB)$aq" if $self->{PERL_CORE}; } } @@ -2175,8 +2178,8 @@ doc__install : doc_site_install pure_perl_install :: }.$self->{NOECHO}.q{$(MOD_INSTALL) \ - read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \ - write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \ + read }.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \ + write }.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \ $(INST_LIB) $(INSTALLPRIVLIB) \ $(INST_ARCHLIB) $(INSTALLARCHLIB) \ $(INST_BIN) $(INSTALLBIN) \ @@ -2186,13 +2189,13 @@ pure_perl_install :: $(INST_MAN1DIR) $(INSTALLMAN1DIR) \ $(INST_MAN3DIR) $(INSTALLMAN3DIR) }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \ - }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{ + }.File::Spec->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{ pure_site_install :: }.$self->{NOECHO}.q{$(MOD_INSTALL) \ - read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \ - write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \ + read }.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \ + write }.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \ $(INST_LIB) $(INSTALLSITELIB) \ $(INST_ARCHLIB) $(INSTALLSITEARCH) \ $(INST_BIN) $(INSTALLBIN) \ @@ -2202,7 +2205,7 @@ pure_site_install :: $(INST_MAN1DIR) $(INSTALLMAN1DIR) \ $(INST_MAN3DIR) $(INSTALLMAN3DIR) }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \ - }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{ + }.File::Spec->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{ doc_perl_install :: -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB) @@ -2212,7 +2215,7 @@ doc_perl_install :: LINKTYPE "$(LINKTYPE)" \ VERSION "$(VERSION)" \ EXE_FILES "$(EXE_FILES)" \ - >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ + >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ doc_site_install :: -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB) @@ -2222,7 +2225,7 @@ doc_site_install :: LINKTYPE "$(LINKTYPE)" \ VERSION "$(VERSION)" \ EXE_FILES "$(EXE_FILES)" \ - >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ + >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ }; @@ -2231,11 +2234,11 @@ uninstall :: uninstall_from_$(INSTALLDIRS)dirs uninstall_from_perldirs :: }.$self->{NOECHO}. - q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ + q{$(UNINSTALL) }.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ uninstall_from_sitedirs :: }.$self->{NOECHO}. - q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ + q{$(UNINSTALL) }.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ }; join("",@m); @@ -2254,7 +2257,7 @@ sub installbin { my(@m, $from, $to, %fromto, @to); push @m, $self->dir_target(qw[$(INST_SCRIPT)]); for $from (@{$self->{EXE_FILES}}) { - my($path)= $self->catfile('$(INST_SCRIPT)', basename($from)); + my($path)= File::Spec->catfile('$(INST_SCRIPT)', basename($from)); local($_) = $path; # for backwards compatibility $to = $self->libscan($path); print "libscan($from) => '$to'\n" if ($Verbose >=2); @@ -2281,7 +2284,7 @@ realclean :: last unless defined $from; my $todir = dirname($to); push @m, " -$to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . " +$to: $from $self->{MAKEFILE} " . File::Spec->catdir($todir,'.exists') . " $self->{NOECHO}$self->{RM_F} $to $self->{CP} $from $to \$(FIXIN) $to @@ -2584,7 +2587,7 @@ doc_inst_perl: MAP_STATIC "$(MAP_STATIC)" \ MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \ MAP_LIBPERL "$(MAP_LIBPERL)" \ - >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ + >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{ }; @@ -2592,7 +2595,7 @@ doc_inst_perl: inst_perl: pure_inst_perl doc_inst_perl pure_inst_perl: $(MAP_TARGET) - }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{ + }.$self->{CP}.q{ $(MAP_TARGET) }.File::Spec->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{ clean :: map_clean @@ -2656,13 +2659,13 @@ sub manifypods { my($dist); my($pod2man_exe); if (defined $self->{PERL_SRC}) { - $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man'); + $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man'); } else { - $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man'); + $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man'); } unless ($pod2man_exe = $self->perl_script($pod2man_exe)) { # Maybe a build by uninstalled Perl? - $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man"); + $pod2man_exe = File::Spec->catfile($self->{PERL_INC}, "pod", "pod2man"); } unless ($pod2man_exe = $self->perl_script($pod2man_exe)) { # No pod2man but some MAN3PODS to be installed @@ -2721,12 +2724,12 @@ sub maybe_command_in_dirs { # $ver is optional argument if looking for perl next unless defined $dir; # $self->{PERL_SRC} may be undefined foreach $name (@$names){ my($abs,$tryabs); - if ($self->file_name_is_absolute($name)) { # /foo/bar + if (File::Spec->file_name_is_absolute($name)) { # /foo/bar $abs = $name; - } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar - $abs = $self->catfile($dir, $name); + } elsif (File::Spec->canonpath($name) eq File::Spec->canonpath(basename($name))) { # bar + $abs = File::Spec->catfile($dir, $name); } else { # foo/bar - $abs = $self->catfile($self->curdir, $name); + $abs = File::Spec->catfile(File::Spec->curdir, $name); } print "Checking $abs for $name\n" if ($trace >= 2); next unless $tryabs = $self->maybe_command($abs); @@ -2793,7 +2796,8 @@ sub nicetext { parse a file and return what you think is $VERSION in this file set to. It will return the string "undef" if it can't figure out what $VERSION -is. +is. $VERSION should be for all to see, so our $VERSION or plain $VERSION +are okay, but my $VERSION is not. =cut @@ -2806,7 +2810,7 @@ sub parse_version { my $inpod = 0; while () { $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; - next if $inpod; + next if $inpod || /^\s*#/; chop; # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/; next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/; @@ -2871,10 +2875,14 @@ sub pasthru { my($sep) = $Is_VMS ? ',' : ''; $sep .= "\\\n\t"; - foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){ + foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) { push @pasthru, "$key=\"\$($key)\""; } + foreach $key (qw(DEFINE INC)) { + push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\""; + } + push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n"; join "", @m; } @@ -2886,13 +2894,7 @@ Takes no argument, returns the environment variable PATH as an array. =cut sub path { - my($self) = @_; - my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":"; - my $path = $ENV{PATH}; - $path =~ s:\\:/:g if $Is_OS2; - my @path = split $path_sep, $path; - foreach(@path) { $_ = '.' if $_ eq '' } - @path; + return File::Spec->path(); } =item perl_script @@ -2956,7 +2958,6 @@ PERL_HDRS = \ $(PERL_INC)/keywords.h \ $(PERL_INC)/mg.h \ $(PERL_INC)/nostdio.h \ - $(PERL_INC)/objXSUB.h \ $(PERL_INC)/op.h \ $(PERL_INC)/opcode.h \ $(PERL_INC)/opnames.h \ @@ -3083,15 +3084,36 @@ destination and autosplits them. See L =cut +sub _pm_to_blib_flush { + my ($self, $autodir, $rr, $ra, $rl) = @_; + $$rr .= +q{ }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \ + -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')" +}; + @$ra = (); + $$rl = 0; +} + sub pm_to_blib { my $self = shift; - my($autodir) = $self->catdir('$(INST_LIB)','auto'); - return q{ + my($autodir) = File::Spec->catdir('$(INST_LIB)','auto'); + my $r = q{ pm_to_blib: $(TO_INST_PM) - }.$self->{NOECHO}.q{$(PERLRUNINST) -MExtUtils::Install \ - -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{','$(PM_FILTER)')" - }.$self->{NOECHO}.q{$(TOUCH) $@ }; + my %pm_to_blib = %{$self->{PM}}; + my @a; + my $l; + while (my ($pm, $blib) = each %pm_to_blib) { + my $la = length $pm; + my $lb = length $blib; + if ($l + $la + $lb + @a / 2 > 200) { # limit line length + _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l); + } + push @a, $pm, $blib; + $l += $la + $lb; + } + _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l); + return $r.q{ }.$self->{NOECHO}.q{$(TOUCH) $@}; } =item post_constants (o) @@ -3175,6 +3197,22 @@ $target :: $plfile join "", @m; } +=item quote_paren + +Backslashes parentheses C<()> in command line arguments. +Doesn't handle recursive Makefile C<$(...)> constructs, +but handles simple ones. + +=cut + +sub quote_paren { + local $_ = shift; + s/\$\((.+?)\)/\$\\\\($1\\\\)/g; # protect $(...) + s/(?{C}}) { - @static = $self->catfile($self->{INST_ARCHLIB}, + @static = File::Spec->catfile($self->{INST_ARCHLIB}, "auto", $self->{FULLEXT}, "$self->{BASEEXT}$self->{LIB_EXT}" @@ -3367,7 +3408,7 @@ sub subdir_x { subdirs :: @[ cd $subdir - \$(MAKE) all \$(PASTHRU) + \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU) cd .. ] EOT @@ -3376,7 +3417,7 @@ EOT return <{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU) - + $self->{NOECHO}cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU) EOT } } @@ -3453,12 +3493,12 @@ test :: \$(TEST_TYPE) push(@m, "\n"); push(@m, "test_dynamic :: pure_all\n"); - push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests; - push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl"; + push(@m, $self->test_via_harness('$(PERLRUN)', '$(TEST_FILES)')) if $tests; + push(@m, $self->test_via_script('$(PERLRUN)', '$(TEST_FILE)')) if -f "test.pl"; push(@m, "\n"); push(@m, "testdb_dynamic :: pure_all\n"); - push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)')); + push(@m, $self->test_via_script('$(PERLRUN) $(TESTDB_SW)', '$(TEST_FILE)')); push(@m, "\n"); # Occasionally we may face this degenerate target: @@ -3596,8 +3636,8 @@ Determines typemaps, xsubpp version, prototype behaviour. sub tool_xsubpp { my($self) = shift; return "" unless $self->needs_linking; - my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils"); - my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap'); + my($xsdir) = File::Spec->catdir($self->{PERL_LIB},"ExtUtils"); + my(@tmdeps) = File::Spec->catdir('$(XSUBPPDIR)','typemap'); if( $self->{TYPEMAPS} ){ my $typemap; foreach $typemap (@{$self->{TYPEMAPS}}){ @@ -3616,7 +3656,7 @@ sub tool_xsubpp { } - my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp")); + my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,"xsubpp")); # What are the correct thresholds for version 1 && 2 Paul? if ( $xsubpp_version > 1.923 ){ @@ -3851,7 +3891,7 @@ sub xs_o { # many makes are too dumb to use xs_c then c_o ' .xs$(OBJ_EXT): $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c + $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c '; }