X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FMM_Unix.pm;h=ecfe83150fd999fc3adb638db1411a80aa46e7a0;hb=f6d6199cd6711f5e8a8e6c1a57445fa6f848c822;hp=0721dc9133ca75ea69223906b00a4d753320eb46;hpb=aceaef4055ec4350cbe0b8f6f5bed078dd6c460e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index 0721dc9..ecfe831 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -1,24 +1,31 @@ package ExtUtils::MM_Unix; +require 5.005_03; # Maybe further back, dunno + +use strict; + use Exporter (); use Config; use File::Basename qw(basename dirname fileparse); +use File::Spec; use DirHandle; use strict; -use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT - $Verbose %pm %static $Xsubpp_Version); +use vars qw($VERSION @ISA + $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_VOS + $Verbose %pm %static $Xsubpp_Version); -$VERSION = substr q$Revision: 1.12603 $, 10; -# $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $ +use ExtUtils::MakeMaker qw($Verbose neatvalue); -Exporter::import('ExtUtils::MakeMaker', qw($Verbose &neatvalue)); +$VERSION = '1.17_01'; -$Is_OS2 = $^O eq 'os2'; -$Is_Mac = $^O eq 'MacOS'; -$Is_Win32 = $^O eq 'MSWin32'; -$Is_Dos = $^O eq 'dos'; +require ExtUtils::MM_Any; +@ISA = qw(ExtUtils::MM_Any); -$Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/; +$Is_OS2 = $^O eq 'os2'; +$Is_Mac = $^O eq 'MacOS'; +$Is_Win32 = $^O eq 'MSWin32'; +$Is_Dos = $^O eq 'dos'; +$Is_VOS = $^O eq 'vos'; if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; @@ -66,187 +73,101 @@ Makefile.PL. Overridable methods are marked as (o). All methods are overridable by a platform specific MM_*.pm file (See L) and L). -=head2 Preloaded methods - -=over 2 - -=item canonpath - -No physical check on the filesystem, but a logical cleanup of a -path. On UNIX eliminated successive slashes and successive "/.". - -=cut - -sub canonpath { - my($self,$path) = @_; - my $node = ''; - if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/|s ) { - $node = $1; - } - $path =~ s|(?<=[^/])/+|/|g ; # xx////xx -> xx/xx - $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx - $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx - $path =~ s|(?<=[^/])/\z|| ; # xx/ -> xx - "$node$path"; -} - -=item catdir - -Concatenate two or more directory names to form a complete path ending -with a directory. But remove the trailing slash from the resulting -string, because it doesn't look good, isn't necessary and confuses -OS2. Of course, if this is the root directory, don't cut off the -trailing slash :-) - =cut -# '; - -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)); -} - -=item catfile - -Concatenate one or more directory names and a filename to form a -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); -} - -=item curdir - -Returns a string representing of the current directory. "." on UNIX. - -=cut - -sub curdir { - return "." ; -} - -=item rootdir - -Returns a string representing of the root directory. "/" on UNIX. - -=cut - -sub rootdir { - return "/"; -} - -=item updir - -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_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; +# So we don't have to keep calling the methods over and over again, +# we have these globals to cache the values. They have to be global +# else the SelfLoaded methods can't see them. +use vars qw($Curdir $Rootdir $Updir); +$Curdir = File::Spec->curdir; +$Rootdir = File::Spec->rootdir; +$Updir = 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 find_perl; +sub fixin; +sub force; +sub guess_name; +sub has_link_code; +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 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; +# SelfLoader not smart enough to avoid autoloading DESTROY +sub DESTROY { } + 1; __DATA__ -=back - =head2 SelfLoaded methods =over 2 @@ -264,23 +185,35 @@ sub c_o { my($self) = shift; return '' unless $self->needs_linking(); my(@m); + if (my $cpp = $Config{cpprun}) { + my $cpp_cmd = $self->const_cccmd; + $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/; + push @m, ' +.c.i: + '. $cpp_cmd . ' $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i +'; + } + push @m, ' +.c.s: + $(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 -' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.C +' if !$Is_OS2 and !$Is_Win32 and !$Is_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; } @@ -305,8 +238,8 @@ sub cflags { $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ; $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/; - @cflags{qw(cc ccflags optimize large split shellflags)} - = @Config{qw(cc ccflags optimize large split shellflags)}; + @cflags{qw(cc ccflags optimize shellflags)} + = @Config{qw(cc ccflags optimize shellflags)}; my($optdebug) = ""; $cflags{shellflags} ||= ''; @@ -341,16 +274,12 @@ sub cflags { optimize=\"$cflags{optimize}\" perltype=\"$cflags{perltype}\" optdebug=\"$cflags{optdebug}\" - large=\"$cflags{large}\" - split=\"$cflags{'split'}\" eval '$prog' echo cc=\$cc echo ccflags=\$ccflags echo optimize=\$optimize echo perltype=\$perltype echo optdebug=\$optdebug - echo large=\$large - echo split=\$split `; my($line); foreach $line (@o){ @@ -368,34 +297,13 @@ sub cflags { $cflags{optimize} = $optdebug; } - for (qw(ccflags optimize perltype large split)) { + for (qw(ccflags optimize perltype)) { $cflags{$_} =~ s/^\s+//; $cflags{$_} =~ s/\s+/ /g; $cflags{$_} =~ s/\s+$//; $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 '; } @@ -407,12 +315,13 @@ 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} PERLTYPE = $self->{PERLTYPE} -LARGE = $self->{LARGE} -SPLIT = $self->{SPLIT} MPOLLUTE = $pollute }; @@ -453,14 +362,29 @@ EOT } my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files + if ( $^O eq 'qnx' ) { + my @errfiles = @{$self->{C}}; + for ( @errfiles ) { + s/.c$/.err/; + } + push( @otherfiles, @errfiles, 'perlmain.err' ); + } push(@otherfiles, $attribs{FILES}) if $attribs{FILES}; - push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all - perlmain.c mon.out core core.*perl.*.? - *perl.core so_locations pm_to_blib - *$(OBJ_EXT) *$(LIB_EXT) perl.exe - $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def - $(BASEEXT).exp + push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) + $(INST_ARCHAUTODIR)/extralibs.all + perlmain.c tmon.out mon.out so_locations pm_to_blib + *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) + $(BOOTSTRAP) $(BASEEXT).bso + $(BASEEXT).def lib$(BASEEXT).def + $(BASEEXT).exp $(BASEEXT).x ]); + if( $Is_VOS ) { + push(@otherfiles, qw[*.kp]); + } + else { + push(@otherfiles, qw[core core.*perl.*.? *perl.core]); + } + push @m, "\t-$self->{RM_RF} @otherfiles\n"; # See realclean and ext/utils/make_ext for usage of Makefile.old push(@m, @@ -482,8 +406,9 @@ 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) \\ - $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\ + q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\ + $(CCFLAGS) $(OPTIMIZE) \\ + $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\ $(XS_DEFINE_VERSION)}; } @@ -505,7 +430,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); @@ -556,7 +482,8 @@ sub constants { INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC - PERL_INC PERL FULLPERL FULL_AR + PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS + FULL_AR PERL_CORE NOOP NOECHO / ) { next unless defined $self->{$tmp}; @@ -579,14 +506,13 @@ MM_VERSION = $ExtUtils::MakeMaker::VERSION push @m, q{ # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) -# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!! # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) # DLBASE = Basename part of dynamic library. May be just equal BASEEXT. }; for $tmp (qw/ FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT - LDFROM LINKTYPE + LDFROM LINKTYPE PM_FILTER / ) { next unless defined $self->{$tmp}; push @m, "$tmp = $self->{$tmp}\n"; @@ -598,17 +524,11 @@ XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})." C_FILES = ".join(" \\\n\t", @{$self->{C}})." O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})." H_FILES = ".join(" \\\n\t", @{$self->{H}})." -HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})." -HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})." MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})." MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})." "; for $tmp (qw/ - INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR - INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR - INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR - INST_HTMLLIBDIR HTMLEXT INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT /) { @@ -634,7 +554,7 @@ MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})." # work around a famous dec-osf make(1) feature(?): makemakerdflt: all -.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT) +.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc \$(OBJ_EXT) # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that # some make implementations will delete the Makefile when we rebuild it. Because @@ -651,11 +571,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()) { @@ -680,12 +600,10 @@ EXPORT_LIST = $tmp push @m, " PERL_ARCHIVE = $tmp "; - -# push @m, q{ -#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{ -# -#PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{ -#}; + $tmp = $self->perl_archive_after; + push @m, " +PERL_ARCHIVE_AFTER = $tmp +"; push @m, q{ TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{ @@ -734,8 +652,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::; @@ -765,49 +683,37 @@ Defines a lot of macros for distribution support. sub dist { my($self, %attribs) = @_; - my(@m); # VERSION should be sanitised before use as a file name - my($version) = $attribs{VERSION} || '$(VERSION)'; - my($name) = $attribs{NAME} || '$(DISTNAME)'; - my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar - my($tarflags) = $attribs{TARFLAGS} || 'cvf'; - my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck! - my($zipflags) = $attribs{ZIPFLAGS} || '-r'; - my($compress) = $attribs{COMPRESS} || 'gzip --best'; - my($suffix) = $attribs{SUFFIX} || '.gz'; # eg .gz - my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip" - my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST - my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir - - my($to_unix) = $attribs{TO_UNIX} || ($Is_OS2 - ? "$self->{NOECHO}" - . '$(TEST_F) tmp.zip && $(RM) tmp.zip;' - . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip' - : "$self->{NOECHO}\$(NOOP)"); - - my($ci) = $attribs{CI} || 'ci -u'; - my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q'; - my($dist_cp) = $attribs{DIST_CP} || 'best'; - my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist'; + $attribs{VERSION} ||= '$(VERSION)'; + $attribs{NAME} ||= '$(DISTNAME)'; + $attribs{TAR} ||= 'tar'; + $attribs{TARFLAGS} ||= 'cvf'; + $attribs{ZIP} ||= 'zip'; + $attribs{ZIPFLAGS} ||= '-r'; + $attribs{COMPRESS} ||= 'gzip --best'; + $attribs{SUFFIX} ||= '.gz'; + $attribs{SHAR} ||= 'shar'; + $attribs{PREOP} ||= "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST + $attribs{POSTOP} ||= "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir + $attribs{TO_UNIX} ||= "$self->{NOECHO}\$(NOOP)"; - push @m, " -DISTVNAME = ${name}-$version -TAR = $tar -TARFLAGS = $tarflags -ZIP = $zip -ZIPFLAGS = $zipflags -COMPRESS = $compress -SUFFIX = $suffix -SHAR = $shar -PREOP = $preop -POSTOP = $postop -TO_UNIX = $to_unix -CI = $ci -RCS_LABEL = $rcs_label -DIST_CP = $dist_cp -DIST_DEFAULT = $dist_default -"; - join "", @m; + $attribs{CI} ||= 'ci -u'; + $attribs{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q'; + $attribs{DIST_CP} ||= 'best'; + $attribs{DIST_DEFAULT} ||= 'tardist'; + + $attribs{DISTVNAME} ||= "$attribs{NAME}-$attribs{VERSION}"; + + # We've already printed out VERSION and NAME variables. + delete $attribs{VERSION}; + delete $attribs{NAME}; + + my $make = ''; + while(my($var, $value) = each %attribs) { + $make .= "$var = $value\n"; + } + + return $make; } =item dist_basics (o) @@ -818,34 +724,25 @@ Defines the targets distclean, distcheck, skipcheck, manifest, veryclean. sub dist_basics { my($self) = shift; - my @m; - push @m, q{ + + return <<'MAKE_FRAG'; distclean :: realclean distcheck -}; + $(NOECHO) $(NOOP) - push @m, q{ distcheck : - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=fullcheck \\ - -e fullcheck -}; + $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck - push @m, q{ skipcheck : - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=skipcheck \\ - -e skipcheck -}; + $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck - push @m, q{ manifest : - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\ - -e mkmanifest -}; + $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest - push @m, q{ veryclean : realclean $(RM_F) *~ *.orig */*~ */*.orig -}; - join "", @m; + +MAKE_FRAG + } =item dist_ci (o) @@ -859,7 +756,7 @@ sub dist_ci { my @m; push @m, q{ ci : - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\ + $(PERLRUN) "-MExtUtils::Manifest=maniread" \\ -e "@all = keys %{ maniread() };" \\ -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\ -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");' @@ -913,7 +810,7 @@ shdist : distdir join "", @m; } -=item dist_dir (o) +=item dist_dir Defines the scratch directory target that will hold the distribution before tar-ing (or shar-ing). @@ -922,17 +819,18 @@ before tar-ing (or shar-ing). sub dist_dir { my($self) = shift; - my @m; - push @m, q{ + + return <<'MAKE_FRAG'; distdir : $(RM_RF) $(DISTVNAME) - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\ + $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" -}; - join "", @m; + +MAKE_FRAG + } -=item dist_test (o) +=item dist_test Defines a target that produces the distribution in the scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that @@ -945,7 +843,7 @@ sub dist_test { my @m; push @m, q{ disttest : distdir - cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL + cd $(DISTVNAME) && $(PERLRUN) Makefile.PL cd $(DISTVNAME) && $(MAKE) cd $(DISTVNAME) && $(MAKE) test }; @@ -981,7 +879,7 @@ static :: $self->{BASEEXT}.exp push(@m," $self->{BASEEXT}.exp: Makefile.PL -",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\ +",' $(PERLRUN) -e \'use ExtUtils::Mksymlists; \\ Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ', neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist), ', "DL_VARS" => ', neatvalue($vars), ');\' @@ -1029,8 +927,8 @@ BOOTSTRAP = '."$self->{BASEEXT}.bs".' # The DynaLoader only reads a non-empty file. $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))" - '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \ - -MExtUtils::Mkbootstrap \ + '.$self->{NOECHO}.'$(PERLRUN) \ + "-MExtUtils::Mkbootstrap" \ -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');" '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP) $(CHMOD) $(PERM_RW) $@ @@ -1060,14 +958,15 @@ sub dynamic_lib { my($ldfrom) = '$(LDFROM)'; $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':'); my(@m); + my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : ''; # Useful on other systems too? push(@m,' # This section creates the dynamically loadable $(INST_DYNAMIC) # from $(OBJECT) and possibly $(MYEXTLIB). ARMAYBE = '.$armaybe.' -OTHERLDFLAGS = '.$otherldflags.' +OTHERLDFLAGS = '.$ld_opt.$otherldflags.' INST_DYNAMIC_DEP = '.$inst_dynamic_dep.' -$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) +$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) '); if ($armaybe ne ':'){ $ldfrom = 'tmp$(LIB_EXT)'; @@ -1076,18 +975,37 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists } $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf'); - # Brain dead solaris linker does not use LD_RUN_PATH? - # This fixes dynamic extensions which need shared libs - my $ldrun = ''; - $ldrun = join ' ', map "-R$_", split /:/, $self->{LD_RUN_PATH} - if ($^O eq 'solaris'); - - # The IRIX linker also doesn't use LD_RUN_PATH - $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"} + # The IRIX linker doesn't use LD_RUN_PATH + my $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"} if ($^O eq 'irix' && $self->{LD_RUN_PATH}); - push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom. - ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)'); + # For example in AIX the shared objects/libraries from previous builds + # linger quite a while in the shared dynalinker cache even when nobody + # is using them. This is painful if one for instance tries to restart + # a failed build because the link command will fail unnecessarily 'cos + # the shared object/library is 'busy'. + push(@m,' $(RM_F) $@ +'); + + 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) $@ '; @@ -1120,22 +1038,6 @@ sub extliblist { $self->ext($libs, $Verbose); } -=item file_name_is_absolute - -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 ; - } -} - =item find_perl Finds the executables PERL and FULLPERL @@ -1152,16 +1054,16 @@ in these dirs: @$dirs "; } - foreach $dir (@$dirs){ - next unless defined $dir; # $self->{PERL_SRC} may be undefined - foreach $name (@$names){ + foreach $name (@$names){ + 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($Curdir, $name)); } print "Checking $abs\n" if ($trace >= 2); next unless $self->maybe_command($abs); @@ -1218,13 +1120,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); } } } @@ -1344,60 +1246,10 @@ sub has_link_code { return $self->{HAS_LINK_CODE} = 0; } -=item htmlifypods (o) - -Defines targets and routines to translate the pods into HTML manpages -and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR -directories. - -=cut - -sub htmlifypods { - my($self, %attribs) = @_; - return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless - %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}; - my($dist); - my($pod2html_exe); - if (defined $self->{PERL_SRC}) { - $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html'); - } else { - $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html'); - } - unless ($pod2html_exe = $self->perl_script($pod2html_exe)) { - # No pod2html but some HTMLxxxPODS to be installed - print <{MAKEFILE}, q[";' \\ --e 'print "Htmlifying $$m{$$_}\n";' \\ --e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\ --e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\ --e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}' -]; - push @m, "\nhtmlifypods : pure_all "; - push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}}; - - push(@m,"\n"); - if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) { - push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t"; - push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}}; - } - join('', @m); -} =item init_dirscan -Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES. +Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES. =cut @@ -1407,13 +1259,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($Curdir)){ next if $name =~ /\#/; - next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name}; + next if $name eq $Curdir or $name eq $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; @@ -1432,9 +1284,11 @@ 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); } } @@ -1490,11 +1344,16 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) return; } return if /\#/; - my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)'); - my($striplibpath,$striplibname); - $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i); - ($striplibname,$striplibpath) = fileparse($striplibpath); - my($inst) = $self->catfile($prefix,$striplibpath,$striplibname); + return if /~$/; # emacs temp files + + my $path = $File::Find::name; + my $prefix = $self->{INST_LIBDIR}; + my $striplibpath; + + $prefix = $self->{INST_LIB} + if ($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i; + + my($inst) = File::Spec->catfile($prefix,$striplibpath); local($_) = $inst; # for backwards compatibility $inst = $self->libscan($inst); print "libscan($path) => '$inst'\n" if ($Verbose >= 2); @@ -1514,14 +1373,14 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) # Set up names of manual pages to generate from pods my %pods; - foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) { + foreach my $man (qw(MAN1 MAN3)) { unless ($self->{"${man}PODS"}) { $self->{"${man}PODS"} = {}; $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/; } } - if ($pods{MAN1} || $pods{HTMLSCRIPT}) { + if ($pods{MAN1}) { if ( exists $self->{EXE_FILES} ) { foreach $name (@{$self->{EXE_FILES}}) { local *FH; @@ -1539,18 +1398,14 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) $ispod = 1; } next unless $ispod; - if ($pods{HTMLSCRIPT}) { - $self->{HTMLSCRIPTPODS}->{$name} = - $self->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)"); } } } } - if ($pods{MAN3} || $pods{HTMLLIB}) { + if ($pods{MAN3}) { my %manifypods = (); # we collect the keys first, i.e. the files # we have to convert to pod foreach $name (keys %{$self->{PM}}) { @@ -1579,23 +1434,19 @@ 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; } my($manpagename) = $name; $manpagename =~ s/\.p(od|m|l)\z//; - if ($pods{HTMLLIB}) { - $self->{HTMLLIBPODS}->{$name} = - $self->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)"); } } } @@ -1603,10 +1454,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 @@ -1618,12 +1470,11 @@ sub init_main { # NAME = Foo::Bar::Oracle # FULLEXT = Foo/Bar/Oracle # BASEEXT = Oracle - # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!! # PARENT_NAME = Foo::Bar ### 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: @@ -1648,12 +1499,6 @@ sub init_main { } - ### ROOTEXT deprecated from MM 5.32 -### ($self->{ROOTEXT} = -### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo -### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT}; - - # --- Initialize PERL_LIB, INST_LIB, PERL_SRC # *Real* information: where did we get these two from? ... @@ -1662,13 +1507,17 @@ 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())){ + foreach $dir ($Updir, + File::Spec->catdir($Updir,$Updir), + File::Spec->catdir($Updir,$Updir,$Updir), + File::Spec->catdir($Updir,$Updir,$Updir,$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; @@ -1676,17 +1525,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 @@ -1711,20 +1560,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; - if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")) + no warnings 'uninitialized' ; + 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; @@ -1736,7 +1586,8 @@ EOP } } - unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){ + unless(-f ($perl_h = File::Spec->catfile($self->{PERL_INC},"perl.h"))) + { die qq{ Error: Unable to locate installed Perl libraries or Perl source code. @@ -1772,25 +1623,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($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($Curdir,"blib","arch"); + $self->{INST_BIN} ||= File::Spec->catdir($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($Curdir,'blib','script'); + $self->{INST_SCRIPT} ||= File::Spec->catdir($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 @@ -1851,20 +1702,23 @@ usually solves this kind of problem. /) { $self->prefixify($install_variable,$configure_prefix,$replace_prefix); } - my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5"); + my $funkylibdir = File::Spec->catdir($configure_prefix,"lib","perl5"); $funkylibdir = '' unless -d $funkylibdir; - $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib"); + $search_prefix = $funkylibdir || + File::Spec->catdir($configure_prefix,"lib"); + if ($self->{LIB}) { $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB}; $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = - $self->catdir($self->{LIB},$Config{'archname'}); + File::Spec->catdir($self->{LIB},$Config{'archname'}); } else { - if (-d $self->catdir($self->{PREFIX},"lib","perl5")) { - $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5"); + if (-d File::Spec->catdir($self->{PREFIX},"lib","perl5")) { + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib", + "perl5"); } else { - $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib"); + $replace_prefix = File::Spec->catdir(qq[\$\(PREFIX\)],"lib"); } for $install_variable (qw/ INSTALLPRIVLIB @@ -1876,14 +1730,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 @@ -1901,7 +1755,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($Curdir,'blib','man1'); } } $self->{MAN1EXT} ||= $Config::Config{man1ext}; @@ -1912,36 +1766,11 @@ 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($Curdir,'blib','man3'); } } $self->{MAN3EXT} ||= $Config::Config{man3ext}; - $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir} - unless defined $self->{INSTALLHTMLPRIVLIBDIR}; - $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir} - unless defined $self->{INSTALLHTMLSITELIBDIR}; - - unless (defined $self->{INST_HTMLLIBDIR}){ - if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){ - $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR}; - } else { - $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib'); - } - } - - $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir} - unless defined $self->{INSTALLHTMLSCRIPTDIR}; - unless (defined $self->{INST_HTMLSCRIPTDIR}){ - if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){ - $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR}; - } else { - $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin'); - } - } - $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html'; - - # Get some stuff out of %Config if we haven't yet done so print STDOUT "CONFIG must be an array ref\n" if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY'); @@ -1978,7 +1807,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 @@ -2007,22 +1836,61 @@ 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; } + + # Build up a set of file names (not command names). + my $thisperl = File::Spec->canonpath($^X); + $thisperl .= $Config{exe_ext} unless $thisperl =~ m/$Config{exe_ext}$/i; + my @perls = ('perl', 'perl5', "perl$Config{version}"); + @perls = ($thisperl, (map $_.=$Config{exe_ext}, @perls)); + + # miniperl has priority over all but the cannonical perl when in the + # core. Otherwise its a last resort. + my $miniperl = "miniperl$Config{exe_ext}"; + if( $self->{PERL_CORE} ) { + splice @perls, 1, 0, $miniperl; + } + else { + push @perls, $miniperl; + } + $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 # Define 'FULLPERL' to be a non-miniperl (used in test: target) ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i unless ($self->{FULLPERL}); + + # Are we building the core? + $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE}; + + # How do we run perl? + $self->{PERLRUN} = $self->{PERL_CORE} ? $self->{PERL} : $self->{FULLPERL}; + $self->{PERLRUN} .= qq{ "-I\$(PERL_LIB)"} if $self->{UNINSTALLED_PERL}; + + # How do we run perl when installing libraries? + $self->{PERLRUNINST} = qq{$self->{PERLRUN} "-I\$(INST_ARCHLIB)" "-I\$(INST_LIB)"}; + + # What extra library dirs do we need when running the tests? + # Make sure these are absolute paths in case the test chdirs. + $self->{TEST_LIBS} .= join '', + map { ' "-I'.File::Spec->rel2abs($_).'"' } + $self->{INST_ARCHLIB}, $self->{INST_LIB}; + + # 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)"' + if $self->{PERL_CORE}; + } } =item init_others @@ -2128,34 +1996,30 @@ 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) \ $(INST_SCRIPT) $(INSTALLSCRIPT) \ - $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \ - $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ $(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) \ $(INST_SCRIPT) $(INSTALLSCRIPT) \ - $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \ - $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ $(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) @@ -2165,7 +2029,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) @@ -2175,7 +2039,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{ }; @@ -2184,11 +2048,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); @@ -2207,7 +2071,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); @@ -2218,9 +2082,8 @@ sub installbin { EXE_FILES = @{$self->{EXE_FILES}} } . ($Is_Win32 - ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \ - -e "system qq[pl2bat.bat ].shift" -} : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \ + ? q{FIXIN = pl2bat.bat +} : q{FIXIN = $(PERLRUN) "-MExtUtils::MY" \ -e "MY->fixin(shift)" }).qq{ pure_all :: @to @@ -2234,7 +2097,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 @@ -2345,7 +2208,7 @@ $(MAP_TARGET) :: static $(MAKE_APERL_FILE) $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) - }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \ + }.$self->{NOECHO}.q{$(PERLRUNINST) \ Makefile.PL DIR=}, $dir, q{ \ MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=}; @@ -2369,14 +2232,14 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) $cccmd = $self->const_cccmd($libperl); $cccmd =~ s/^CCCMD\s*=\s*//; - $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /; + $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /; $cccmd .= " $Config::Config{cccdlflags}" if ($Config::Config{useshrplib} eq 'true'); $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/; # The front matter of the linkcommand... $linkcmd = join ' ', "\$(CC)", - grep($_, @Config{qw(large split ldflags ccdlflags)}); + grep($_, @Config{qw(ldflags ccdlflags)}); $linkcmd =~ s/\s+/ /g; $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,; @@ -2445,10 +2308,10 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) push @$extra, $_; } - grep(s/^/-I/, @{$perlinc || []}); + grep(s/^(.*)/"-I$1"/, @{$perlinc || []}); - $target = "perl" unless $target; - $tmp = "." unless $tmp; + $target ||= "perl"; + $tmp ||= "."; # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we # regenerate the Makefiles, MAP_STATIC and the dependencies for @@ -2459,7 +2322,7 @@ MAP_PERLINC = @{$perlinc || []} MAP_STATIC = ", join(" \\\n\t", reverse sort keys %static), " -MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} +MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} "; if (defined $libperl) { @@ -2467,6 +2330,7 @@ MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} } unless ($libperl && -f $lperl) { # Ilya's code... my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE"; + $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL}; $libperl ||= "libperl$self->{LIB_EXT}"; $libperl = "$dir/$libperl"; $lperl ||= "libperl$self->{LIB_EXT}"; @@ -2502,16 +2366,11 @@ MAP_LIBPERL = $libperl push @m, "\tcat $catfile >> \$\@\n"; } # SUNOS ld does not take the full path to a shared library - my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl'; - - # Brain dead solaris linker does not use LD_RUN_PATH? - # This fixes dynamic extensions which need shared libs - my $ldfrom = ($^O eq 'solaris')? - join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):''; + $self->{LLIBPERL} = ($libperl)?'$(MAP_LIBPERL)':'-lperl'; push @m, " \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all - \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) + \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $self->{LLIBPERL} `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call' $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)' $self->{NOECHO}echo 'To remove the intermediate files say' @@ -2519,12 +2378,12 @@ push @m, " $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c "; - push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n"; + push @m, qq{\tcd $tmp && $cccmd "-I\$(PERL_INC)" perlmain.c\n}; push @m, qq{ $tmp/perlmain.c: $makefilename}, q{ }.$self->{NOECHO}.q{echo Writing $@ - }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\ + }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\ -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@ }; @@ -2541,7 +2400,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{ }; @@ -2549,7 +2408,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 @@ -2585,7 +2444,7 @@ $(OBJECT) : $(FIRST_MAKEFILE) -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{ -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{ -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP) - $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{ + $(PERLRUN) Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{ }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <==" }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <==" false @@ -2613,13 +2472,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 @@ -2638,7 +2497,7 @@ qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n], q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "], $self->{MAKEFILE}, q[";' \\ -e 'print "Manifying $$m{$$_}\n";' \\ --e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\ +-e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\ -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}' ]; push @m, "\nmanifypods : pure_all "; @@ -2678,12 +2537,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($Curdir, $name); } print "Checking $abs for $name\n" if ($trace >= 2); next unless $tryabs = $self->maybe_command($abs); @@ -2750,7 +2609,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 @@ -2763,7 +2623,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.*\=/; @@ -2828,30 +2688,18 @@ 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; } -=item path - -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; -} - =item perl_script Takes one argument, a file name, and returns the file name, if the @@ -2913,7 +2761,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 \ @@ -3040,16 +2887,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{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \ - "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \ - -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')" - }.$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) @@ -3090,6 +2957,8 @@ sub postamble { =item prefixify + my $prefixed = $MM->prefixify($var, $search, $replace); + Check a path variable in $self from %Config, if it contains a prefix, and replace it with another one. @@ -3102,9 +2971,10 @@ sub prefixify { my($self,$var,$sprefix,$rprefix) = @_; $self->{uc $var} ||= $Config{lc $var}; $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS; - $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/s; + $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s; } + =item processPL (o) Defines targets to run *.PL files. @@ -3119,19 +2989,36 @@ sub processPL { my $list = ref($self->{PL_FILES}->{$plfile}) ? $self->{PL_FILES}->{$plfile} : [$self->{PL_FILES}->{$plfile}]; + my $target; foreach $target (@$list) { push @m, " all :: $target $self->{NOECHO}\$(NOOP) $target :: $plfile - \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target + \$(PERLRUNINST) $plfile $target "; } } 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/(?{LLIBPERL}."\n"); + push(@m,' # Delete temporary files (via clean) and also delete installed files realclean purge :: clean @@ -3154,12 +3044,27 @@ realclean purge :: clean push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",'')); } push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n"); + push(@m, " $self->{RM_RF} \$(DISTVNAME)\n"); if( $self->has_link_code ){ push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n"); push(@m, " $self->{RM_F} \$(INST_STATIC)\n"); } - push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n") - if keys %{$self->{PM}}; + # Issue a several little RM_F commands rather than risk creating a + # very long command line (useful for extensions such as Encode + # that have many files). + if (keys %{$self->{PM}}) { + my $line = ""; + foreach (values %{$self->{PM}}) { + if (length($line) + length($_) > 80) { + push @m, "\t$self->{RM_F} $line\n"; + $line = $_; + } + else { + $line .= " $_"; + } + } + push @m, "\t$self->{RM_F} $line\n" if $line; + } my(@otherfiles) = ($self->{MAKEFILE}, "$self->{MAKEFILE}.old"); # Makefiles last push(@otherfiles, $attribs{FILES}) if $attribs{FILES}; @@ -3170,19 +3075,19 @@ realclean purge :: clean =item replace_manpage_separator + my $man_name = $MM->replace_manpage_separator($file_path); + Takes the name of a package, which may be a nested package, in the -form Foo/Bar and replaces the slash with C<::>. Returns the replacement. +form 'Foo/Bar.pm' and replaces the slash with C<::> or something else +safe for a man page file name. Returns the replacement. =cut sub replace_manpage_separator { my($self,$man) = @_; - if ($^O eq 'uwin') { - $man =~ s,/+,.,g; - } else { - $man =~ s,/+,::,g; - } - $man; + + $man =~ s,/+,::,g; + return $man; } =item static (o) @@ -3222,7 +3127,7 @@ sub static_lib { $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists $(RM_RF) $@ END - # If this extension has it's own library (eg SDBM_File) + # If this extension has its own library (eg SDBM_File) # then copy that to $(INST_STATIC) and add $(OBJECT) into it. push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB}; @@ -3265,7 +3170,7 @@ sub staticmake { # And as it's not yet built, we add the current extension # but only if it has some C code (or XS code, which implies C code) if (@{$self->{C}}) { - @static = $self->catfile($self->{INST_ARCHLIB}, + @static = File::Spec->catfile($self->{INST_ARCHLIB}, "auto", $self->{FULLEXT}, "$self->{BASEEXT}$self->{LIB_EXT}" @@ -3302,22 +3207,30 @@ sub subdir_x { my($self, $subdir) = @_; my(@m); if ($Is_Win32 && Win32::IsWin95()) { - # XXX: dmake-specific, like rest of Win95 port - return <{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU) - + $self->{NOECHO}cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU) EOT } } @@ -3385,12 +3298,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: @@ -3411,29 +3324,27 @@ test :: \$(TEST_TYPE) join("", @m); } -=item test_via_harness (o) +=item test_via_harness (override) -Helper method to write the test targets +For some reason which I forget, Unix machines like to have +PERL_DL_NONLAZY set for tests. =cut sub test_via_harness { my($self, $perl, $tests) = @_; - $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32; - "\t$perl".q! -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n"; + return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests); } -=item test_via_script (o) +=item test_via_script (override) -Other helper method for test. +Again, the PERL_DL_NONLAZY thing. =cut sub test_via_script { my($self, $perl, $script) = @_; - $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32; - qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script -}; + return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script); } =item tool_autosplit (o) @@ -3444,15 +3355,16 @@ pm_to_blib soon. =cut sub tool_autosplit { -# --- Tool Sections --- - my($self, %attribs) = @_; my($asl) = ""; - $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN}; - q{ + $asl = "\$\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN}; + + return sprintf <<'MAKE_FRAG', $asl; # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto -AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;' -}; +AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;' + +MAKE_FRAG + } =item tools_other (o) @@ -3478,13 +3390,13 @@ SHELL = $bin_sh push @m, q{ # The following is a portable way to say mkdir -p # To see which directories are created, change the if 0 to if 1 -MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath +MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath # This helps us to minimize the effect of the .exists files A yet # better solution would be to have a stable file in the perl # distribution with a timestamp of zero. But this solution doesn't # need any changes to the core distribution and works with older perls -EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime +EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime }; @@ -3501,7 +3413,7 @@ WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\ UNINST=0 VERBINST=0 -MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \ +MOD_INSTALL = $(PERL) "-I$(INST_LIB)" "-I$(PERL_LIB)" "-MExtUtils::Install" \ -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');" DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \ @@ -3510,7 +3422,7 @@ DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \ -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \ -e 'print "=back";' -UNINSTALL = $(PERL) -MExtUtils::Install \ +UNINSTALL = $(PERLRUN) "-MExtUtils::Install" \ -e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \ -e 'print " packlist above carefully.\n There may be errors. Remove the";' \ -e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"' @@ -3528,8 +3440,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}}){ @@ -3548,7 +3460,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 ){ @@ -3572,6 +3484,7 @@ XSUBPP = \$(XSUBPPDIR)/$xsubpp XSPROTOARG = $self->{XSPROTOARG} XSUBPPDEPS = @tmdeps \$(XSUBPP) XSUBPPARGS = @tmargs +XSUBPP_EXTRA_ARGS = }; }; @@ -3588,7 +3501,7 @@ sub xsubpp_version return "" unless $self->needs_linking; - my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1"; + my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v 2>&1}; print "Running $command\n" if $Verbose >= 2; $version = `$command` ; warn "Running '$command' exits with status " . ($?>>8) if $?; @@ -3641,12 +3554,9 @@ sub top_targets { my($self) = shift; my(@m); - push @m, ' -#all :: config $(INST_PM) subdirs linkext manifypods -'; push @m, ' -all :: pure_all htmlifypods manifypods +all :: pure_all manifypods '.$self->{NOECHO}.'$(NOOP) ' unless $self->{SKIPHASH}{'all'}; @@ -3670,24 +3580,6 @@ config :: $(INST_AUTODIR)/.exists push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]); - if (%{$self->{HTMLLIBPODS}}) { - push @m, qq[ -config :: \$(INST_HTMLLIBDIR)/.exists - $self->{NOECHO}\$(NOOP) - -]; - push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]); - } - - if (%{$self->{HTMLSCRIPTPODS}}) { - push @m, qq[ -config :: \$(INST_HTMLSCRIPTDIR)/.exists - $self->{NOECHO}\$(NOOP) - -]; - push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]); - } - if (%{$self->{MAN1PODS}}) { push @m, qq[ config :: \$(INST_MAN1DIR)/.exists @@ -3714,13 +3606,6 @@ help: perldoc ExtUtils::MakeMaker }; - push @m, q{ -Version_check: - }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \ - -MExtUtils::MakeMaker=Version_check \ - -e "Version_check('$(MM_VERSION)')" -}; - join('',@m); } @@ -3750,7 +3635,7 @@ sub xs_c { return '' unless $self->needs_linking(); ' .xs.c: - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c + $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c '; } @@ -3765,7 +3650,7 @@ sub xs_cpp { return '' unless $self->needs_linking(); ' .xs.cpp: - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp + $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp '; } @@ -3781,22 +3666,36 @@ sub xs_o { # many makes are too dumb to use xs_c then c_o return '' unless $self->needs_linking(); ' .xs$(OBJ_EXT): - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c - $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c + $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c '; } =item perl_archive This is internal method that returns path to libperl.a equivalent -to be linked to dynamic extensions. UNIX does not have one but OS2 -and Win32 do. +to be linked to dynamic extensions. UNIX does not have one but other +OSs might have one. =cut sub perl_archive { - return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos"; + return ""; +} + +=item perl_archive_after + +This is an internal method that returns path to a library which +should be put on the linker command line I the external libraries +to be linked to dynamic extensions. This may be needed if the linker +is one-pass, and Perl includes some overrides for C RTL functions, +such as malloc(). + +=cut + +sub perl_archive_after +{ return ""; }