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.12607';
require ExtUtils::MakeMaker;
ExtUtils::MakeMaker->import(qw($Verbose &neatvalue));
$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 );
sub canonpath {
my($self,$path) = @_;
+
+ # Handle POSIX-style node names beginning with double slash
my $node = '';
- if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/|s ) {
+ if ( $^O =~ m/^(?:qnx|nto)$/ && $path =~ s:^(//[^/]+)(/|\z):/: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";
+ return "$node$path";
}
=item catdir
# ';
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
=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
=cut
sub curdir {
- return "." ;
+ return File::Spec->curdir();
}
=item rootdir
=cut
sub rootdir {
- return "/";
+ return File::Spec->rootdir();
}
=item updir
=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;
$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;
}
$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 ';
}
$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}
}
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 tmon.out 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
+ *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
+ $(BOOTSTRAP) $(BASEEXT).bso
+ $(BASEEXT).def lib$(BASEEXT).def
+ $(BASEEXT).exp $(BASEEXT).x
]);
push @m, "\t-$self->{RM_RF} @otherfiles\n";
# See realclean and ext/utils/make_ext for usage of Makefile.old
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)};
}
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);
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
/ ) {
next unless defined $self->{$tmp};
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()) {
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::;
push @m, q{
distcheck :
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=fullcheck \\
+ $(PERLRUN) -MExtUtils::Manifest=fullcheck \\
-e fullcheck
};
push @m, q{
skipcheck :
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=skipcheck \\
+ $(PERLRUN) -MExtUtils::Manifest=skipcheck \\
-e skipcheck
};
push @m, q{
manifest :
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\
+ $(PERLRUN) -MExtUtils::Manifest=mkmanifest \\
-e mkmanifest
};
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");'
push @m, q{
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;
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
};
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), ');\'
# 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)" \
+ '.$self->{NOECHO}.'$(PERLRUN) \
-MExtUtils::Mkbootstrap \
-e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
'.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
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) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
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) $@
';
=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
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);
$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);
}
}
}
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
$self->{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 'system(q[$(PERLRUN) $(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 ";
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;
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);
}
}
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);
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)");
}
}
}
# 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;
}
$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)");
}
}
}
=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
### 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:
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;
}
}
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
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;
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
$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
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};
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};
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');
}
}
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';
# 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
# --- 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 = $self->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};
+
+ 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->{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} .= " -${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} .= " -${aq}I\$(PERL_ARCHLIB)$aq -${aq}I\$(PERL_LIB)$aq"
+ if $self->{PERL_CORE};
+ }
}
=item init_others
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_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_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)
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)
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
- >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
+ >> }.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
};
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);
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);
EXE_FILES = @{$self->{EXE_FILES}}
} . ($Is_Win32
- ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+ ? q{FIXIN = $(PERLRUN) \
-e "system qq[pl2bat.bat ].shift"
-} : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
+} : q{FIXIN = $(PERLRUN) -MExtUtils::MakeMaker \
-e "MY->fixin(shift)"
}).qq{
pure_all :: @to
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
$(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=};
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{
};
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
-}.$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
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
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 ";
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);
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
my $inpod = 0;
while (<FH>) {
$inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
- next if $inpod;
+ next if $inpod || /^\s*#/;
chop;
# next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
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;
}
=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
$(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 \
=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{','$(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)
$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/(?<!\\)([()])/\\$1/g; # quote unprotected
+ s/\$\\\\\((.+?)\\\\\)/\$($1)/g; # unprotect $(...)
+ return $_;
+}
+
=item realclean (o)
Defines the realclean target.
sub realclean {
my($self, %attribs) = @_;
my(@m);
+
+ push(@m,'LLIBPERL = '.$llibperl."\n");
+
push(@m,'
# Delete temporary files (via clean) and also delete installed files
realclean purge :: clean
$(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};
# 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}"
subdirs ::
@[
cd $subdir
- \$(MAKE) all \$(PASTHRU)
+ \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
cd ..
]
EOT
return <<EOT;
subdirs ::
cd $subdir
- \$(MAKE) all \$(PASTHRU)
+ \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
cd ..
EOT
}
return <<EOT;
subdirs ::
- $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
-
+ $self->{NOECHO}cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
EOT
}
}
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:
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";
+ "\t$perl".q! $(TEST_LIBS) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
}
=item test_via_script (o)
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
+ qq{\t$perl}.q{ $(TEST_LIBS) }.qq{$script
};
}
$asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
q{
# 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;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
};
}
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
};
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}}){
}
- 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 ){
XSPROTOARG = $self->{XSPROTOARG}
XSUBPPDEPS = @tmdeps \$(XSUBPP)
XSUBPPARGS = @tmargs
+XSUBPP_EXTRA_ARGS =
};
};
push @m, q{
Version_check:
- }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
+ }.$self->{NOECHO}.q{$(PERLRUN) \
-MExtUtils::MakeMaker=Version_check \
-e "Version_check('$(MM_VERSION)')"
};
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
';
}
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
';
}
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 "";
}