diff options
author | Michael G. Schwern <schwern@pobox.com> | 2003-03-30 18:42:58 -0800 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2003-03-31 09:54:52 +0000 |
commit | 479d2113ccb2226821ef75027b9186d1d0e367e9 (patch) | |
tree | a9b0815b35ca20eb8b0e60c5a7881b0ed3033e7e /lib/ExtUtils/MM_VMS.pm | |
parent | f18b2318c1a1ea8f33016f2bf34abc4ac137b8e3 (diff) | |
download | perl-479d2113ccb2226821ef75027b9186d1d0e367e9.tar.gz |
ExtUtils::MakeMaker 6.03 -> 6.06_05ish
Message-ID: <20030331104257.GB15327@windhund.schwern.org>
p4raw-id: //depot/perl@19099
Diffstat (limited to 'lib/ExtUtils/MM_VMS.pm')
-rw-r--r-- | lib/ExtUtils/MM_VMS.pm | 1284 |
1 files changed, 672 insertions, 612 deletions
diff --git a/lib/ExtUtils/MM_VMS.pm b/lib/ExtUtils/MM_VMS.pm index 3fedae852f..cd68c5ee46 100644 --- a/lib/ExtUtils/MM_VMS.pm +++ b/lib/ExtUtils/MM_VMS.pm @@ -7,18 +7,25 @@ package ExtUtils::MM_VMS; use strict; -use Carp qw( &carp ); use Config; require Exporter; -use VMS::Filespec; + +BEGIN { + # so we can compile the thing on non-VMS platforms. + if( $^O eq 'VMS' ) { + require VMS::Filespec; + VMS::Filespec->import; + } +} + use File::Basename; -use File::Spec; use vars qw($Revision @ISA $VERSION); -($VERSION) = $Revision = '5.65'; +($VERSION) = '5.66'; +($Revision = substr(q$Revision: 1.82 $, 10)) =~ s/\s+$//; require ExtUtils::MM_Any; require ExtUtils::MM_Unix; -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix File::Spec ); +@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); use ExtUtils::MakeMaker qw($Verbose neatvalue); @@ -52,9 +59,8 @@ Converts a list into a string wrapped at approximately 80 columns. sub wraplist { my($self) = shift; my($line,$hlen) = ('',0); - my($word); - foreach $word (@_) { + foreach my $word (@_) { # Perl bug -- seems to occasionally insert extra elements when # traversing array (scalar(@array) doesn't show them, but # foreach(@array) does) (5.00307) @@ -160,8 +166,8 @@ sub find_perl { local *TCF; # Check in relative directories first, so we pick up the current # version of Perl if we're running MakeMaker as part of the main build. - @sdirs = sort { my($absa) = File::Spec->file_name_is_absolute($a); - my($absb) = File::Spec->file_name_is_absolute($b); + @sdirs = sort { my($absa) = $self->file_name_is_absolute($a); + my($absb) = $self->file_name_is_absolute($b); if ($absa && $absb) { return $a cmp $b } else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); } } @$dirs; @@ -187,7 +193,7 @@ sub find_perl { } foreach $dir (@sdirs){ next unless defined $dir; # $self->{PERL_SRC} may be undefined - $inabs++ if File::Spec->file_name_is_absolute($dir); + $inabs++ if $self->file_name_is_absolute($dir); if ($inabs == 1) { # We've covered relative dirs; everything else is an absolute # dir (probably an installed location). First, we'll try potential @@ -196,7 +202,7 @@ sub find_perl { $inabs++; # Should happen above in next $dir, but just in case . . . } foreach $name (@snames){ - if ($name !~ m![/:>\]]!) { push(@cand,File::Spec->catfile($dir,$name)); } + if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); } else { push(@cand,$self->fixpath($name,0)); } } } @@ -211,9 +217,9 @@ sub find_perl { $rslt = `\@temp_mmvms.com` ; unlink('temp_mmvms.com'); if ($rslt =~ /VER_OK/) { - print "Using PERL=$name\n" if $trace; - return $name; - } + print "Using PERL=$name\n" if $trace; + return $name; + } } next unless $vmsfile = $self->maybe_command($name); $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well @@ -267,42 +273,6 @@ sub maybe_command { return 0; } -=item maybe_command_in_dirs (override) - -Uses DCL argument quoting on test command line. - -=cut - -sub maybe_command_in_dirs { # $ver is optional argument if looking for perl - my($self, $names, $dirs, $trace, $ver) = @_; - my($name, $dir); - foreach $dir (@$dirs){ - next unless defined $dir; # $self->{PERL_SRC} may be undefined - foreach $name (@$names){ - my($abs,$tryabs); - if (File::Spec->file_name_is_absolute($name)) { - $abs = $name; - } else { - $abs = File::Spec->catfile($dir, $name); - } - print "Checking $abs for $name\n" if ($trace >= 2); - next unless $tryabs = $self->maybe_command($abs); - print "Substituting $tryabs instead of $abs\n" - if ($trace >= 2 and $tryabs ne $abs); - $abs = $tryabs; - if (defined $ver) { - print "Executing $abs\n" if ($trace >= 2); - if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) { - print "Using $abs\n" if $trace; - return $abs; - } - } else { # Do not look for perl - return $abs; - } - } - } -} - =item perl_script (override) If name passed in doesn't specify a readable file, appends F<.com> or @@ -332,10 +302,22 @@ sub replace_manpage_separator { $man; } +=item init_DIRFILESEP + +No seperator between a directory path and a filename on VMS. + +=cut + +sub init_DIRFILESEP { + my($self) = shift; + + $self->{DIRFILESEP} = ''; + return 1; +} + + =item init_main (override) -Override DISTVNAME so it uses VERSION_SYM to avoid getting too many -dots in the name. =cut @@ -343,7 +325,34 @@ sub init_main { my($self) = shift; $self->SUPER::init_main; - $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}"; + + $self->{DEFINE} ||= ''; + if ($self->{DEFINE} ne '') { + my(@terms) = split(/\s+/,$self->{DEFINE}); + my(@defs,@udefs); + foreach my $def (@terms) { + next unless $def; + my $targ = \@defs; + if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition + $targ = \@udefs if $1 eq 'U'; + $def =~ s/='(.*)'$/=$1/; # then remove shell-protection '' + $def =~ s/^'(.*)'$/$1/; # from entire term or argument + } + if ($def =~ /=/) { + $def =~ s/"/""/g; # Protect existing " from DCL + $def = qq["$def"]; # and quote to prevent parsing of = + } + push @$targ, $def; + } + + $self->{DEFINE} = ''; + if (@defs) { + $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; + } + if (@udefs) { + $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; + } + } } =item init_others (override) @@ -351,238 +360,203 @@ sub init_main { Provide VMS-specific forms of various utility commands, then hand off to the default MM_Unix method. +DEV_NULL should probably be overriden with something. + +Also changes EQUALIZE_TIMESTAMP to set revision date of target file to +one second later than source file, since MMK interprets precisely +equal revision dates for a source and target file as a sign that the +target needs to be updated. + =cut sub init_others { my($self) = @_; - $self->{NOOP} = 'Continue'; - $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS'; - $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS'; - $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE}; - $self->{NOECHO} ||= '@ '; - $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"'; - $self->{RM_RF} = '$(PERLRUN) -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"'; - $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"'; - $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker + $self->{NOOP} = 'Continue'; + $self->{NOECHO} ||= '@ '; + + $self->{MAKEFILE} ||= 'Descrip.MMS'; + $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE}; + $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS'; + $self->{MAKEFILE_OLD} ||= '$(FIRST_MAKEFILE)_old'; + + $self->{ECHO} ||= '$(PERLRUN) -le "print qq{@ARGV}"'; + $self->{TOUCH} ||= '$(PERLRUN) "-MExtUtils::Command" -e touch'; + $self->{CHMOD} ||= '$(PERLRUN) "-MExtUtils::Command" -e chmod'; + $self->{RM_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_f'; + $self->{RM_RF} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_rf'; + $self->{TEST_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e test_f'; + $self->{EQUALIZE_TIMESTAMP} ||= '$(PERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"'; + + $self->{MOD_INSTALL} ||= + $self->oneliner(<<'CODE', ['-MExtUtils::Install']); +install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)'); +CODE + + $self->{SHELL} ||= 'Posix'; + $self->{CP} = 'Copy/NoConfirm'; $self->{MV} = 'Rename/NoConfirm'; $self->{UMASK_NULL} = '! '; - + $self->SUPER::init_others; + + if ($self->{OBJECT} =~ /\s/) { + $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g; + $self->{OBJECT} = $self->wraplist( + map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT} + ); + } + + $self->{LDFROM} = $self->wraplist( + map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM} + ); +} + + +=item init_platform (override) + +Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION. + +MM_VMS_REVISION is for backwards compatibility before MM_VMS had a +$VERSION. + +=cut + +sub init_platform { + my($self) = shift; + + $self->{MM_VMS_REVISION} = $Revision; + $self->{MM_VMS_VERSION} = $VERSION; + $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS') + if $self->{PERL_SRC}; } + +=item platform_constants + +=cut + +sub platform_constants { + my($self) = shift; + my $make_frag = ''; + + foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION)) + { + next unless defined $self->{$macro}; + $make_frag .= "$macro = $self->{$macro}\n"; + } + + return $make_frag; +} + + +=item init_VERSION (override) + +Override the *DEFINE_VERSION macros with VMS semantics. Translate the +MAKEMAKER filepath to VMS style. + +=cut + +sub init_VERSION { + my $self = shift; + + $self->SUPER::init_VERSION; + + $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""'; + $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""'; + $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'}); +} + + =item constants (override) Fixes up numerous file and directory macros to insure VMS syntax -regardless of input syntax. Also adds a few VMS-specific macros -and makes lists of files comma-separated. +regardless of input syntax. Also makes lists of files +comma-separated. =cut sub constants { my($self) = @_; - my(@m,$def,$macro); # Be kind about case for pollution for (@ARGV) { $_ = uc($_) if /POLLUTE/i; } - $self->{DEFINE} ||= ''; - if ($self->{DEFINE} ne '') { - my(@terms) = split(/\s+/,$self->{DEFINE}); - my(@defs,@udefs); - foreach $def (@terms) { - next unless $def; - my $targ = \@defs; - if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition - if ($1 eq 'U') { $targ = \@udefs; } - $def =~ s/='(.*)'$/=$1/; # then remove shell-protection '' - $def =~ s/^'(.*)'$/$1/; # from entire term or argument - } - if ($def =~ /=/) { - $def =~ s/"/""/g; # Protect existing " from DCL - $def = qq["$def"]; # and quote to prevent parsing of = - } - push @$targ, $def; - } - $self->{DEFINE} = ''; - if (@defs) { - $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; - } - if (@udefs) { - $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; - } - } - - if ($self->{OBJECT} =~ /\s/) { - $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g; - $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT}))); - } - $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM}))); - - - foreach $macro ( qw [ + # Cleanup paths for directories in MMS macros. + foreach my $macro ( qw [ INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB - INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH + INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR PERL_LIB PERL_ARCHLIB - PERL_INC PERL_SRC FULLEXT ] ) { - next unless defined $self->{$macro}; + PERL_INC PERL_SRC ] ) + { + next unless defined $self->{$macro}; next if $macro =~ /MAN/ && $self->{$macro} eq 'none'; - $self->{$macro} = $self->fixpath($self->{$macro},1); - } - $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS)) - if ($self->{PERL_SRC}); - - - - # Fix up file specs - foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) { - next unless defined $self->{$macro}; - $self->{$macro} = $self->fixpath($self->{$macro},0); - } - - foreach $macro (qw/ - AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM - XS_VERSION - INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT - INSTALLDIRS - PREFIX SITEPREFIX VENDORPREFIX - INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB - INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH - INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT - PERL_LIB PERL_ARCHLIB - SITELIBEXP SITEARCHEXP - LIBPERL_A MYEXTLIB - FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS - PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST - FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST - PERL_CORE NOECHO NOOP - / ) { - next unless defined $self->{$macro}; - push @m, "$macro = $self->{$macro}\n"; + $self->{$macro} = $self->fixpath($self->{$macro},1); } - - push @m, q[ -VERSION_MACRO = VERSION -DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)""" -XS_VERSION_MACRO = XS_VERSION -XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)""" - -MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[ -MM_VERSION = $ExtUtils::MakeMaker::VERSION -MM_REVISION = $ExtUtils::MakeMaker::Revision -MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision - -# FULLEXT = Pathname for extension directory (eg DBD/Oracle). -# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. -# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) -# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. -]; - - for my $tmp (qw/ - FULLEXT VERSION_FROM OBJECT LDFROM - / ) { - next unless defined $self->{$tmp}; - push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n"; + # Cleanup paths for files in MMS macros. + foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD + MAKE_APERL_FILE MYEXTLIB] ) + { + next unless defined $self->{$macro}; + $self->{$macro} = $self->fixpath($self->{$macro},0); } - for my $tmp (qw/ - BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE + # Fixup files for MMS macros + # XXX is this list complete? + for my $macro (qw/ + FULLEXT VERSION_FROM OBJECT LDFROM / ) { - next unless defined $self->{$tmp}; - push @m, "$tmp = $self->{$tmp}\n"; + next unless defined $self->{$macro}; + $self->{$macro} = $self->fixpath($self->{$macro},0); } - for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) { - # Where is the space coming from? --jhi - next unless $self ne " " && defined $self->{$tmp}; - my(%tmp,$key); - for $key (keys %{$self->{$tmp}}) { - $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0); - } - $self->{$tmp} = \%tmp; - } - for my $tmp (qw/ C O_FILES H /) { - next unless defined $self->{$tmp}; - my(@tmp,$val); - for $val (@{$self->{$tmp}}) { - push(@tmp,$self->fixpath($val,0)); - } - $self->{$tmp} = \@tmp; + for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) { + # Where is the space coming from? --jhi + next unless $self ne " " && defined $self->{$macro}; + my %tmp = (); + for my $key (keys %{$self->{$macro}}) { + $tmp{$self->fixpath($key,0)} = + $self->fixpath($self->{$macro}{$key},0); + } + $self->{$macro} = \%tmp; } - push @m,' - -# Handy lists of source code files: -XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),' -C_FILES = ',$self->wraplist(@{$self->{C}}),' -O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),' -H_FILES = ',$self->wraplist(@{$self->{H}}),' -MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),' -MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),' - -'; - - for my $tmp (qw/ - INST_MAN1DIR MAN1EXT - INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR - INST_MAN3DIR MAN3EXT - INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR - /) { - next unless defined $self->{$tmp}; - push @m, "$tmp = $self->{$tmp}\n"; + for my $macro (qw/ C O_FILES H /) { + next unless defined $self->{$macro}; + my @tmp = (); + for my $val (@{$self->{$macro}}) { + push(@tmp,$self->fixpath($val,0)); + } + $self->{$macro} = \@tmp; } -push @m," -makemakerdflt : all - \$(NOECHO) \$(NOOP) + return $self->SUPER::constants; +} -.SUFFIXES : -.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs -# Here is the Config.pm that we are using/depend on -CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM) +=item special_targets -# Where to put things: -INST_LIBDIR = $self->{INST_LIBDIR} -INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR} +Clear the default .SUFFIXES and put in our own list. -INST_AUTODIR = $self->{INST_AUTODIR} -INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR} -"; +=cut - if ($self->has_link_code()) { - push @m,' -INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT) -INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT) -INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs -'; - } else { - my $shr = $Config{'dbgprefix'} . 'PERLSHR'; - push @m,' -INST_STATIC = -INST_DYNAMIC = -INST_BOOT = -EXPORT_LIST = $(BASEEXT).opt -PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),' -'; - } +sub special_targets { + my $self = shift; - $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ]; - $self->{PM_TO_BLIB} = [ %{$self->{PM}} ]; - push @m,' -TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),' + my $make_frag .= <<'MAKE_FRAG'; +.SUFFIXES : +.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs -PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),' -'; +MAKE_FRAG - join('',@m); + return $make_frag; } =item cflags (override) @@ -723,78 +697,6 @@ sub const_cccmd { $self->{CONST_CCCMD} = join('',@m); } -=item pm_to_blib (override) - -DCL I<still> accepts a maximum of 255 characters on a command -line, so we write the (potentially) long list of file names -to a temp file, then persuade Perl to read it instead of the -command line to find args. - -=cut - -sub pm_to_blib { - my($self) = @_; - my($autodir) = File::Spec->catdir($self->{INST_LIB},'auto'); - my(%files) = @{$self->{PM_TO_BLIB}}; - - my $m = <<'MAKE_FRAG'; - -# Dummy target to match Unix target name; we use pm_to_blib.ts as -# timestamp file to avoid repeated invocations under VMS -pm_to_blib : pm_to_blib.ts - $(NOECHO) $(NOOP) - -# As always, keep under DCL's 255-char limit -pm_to_blib.ts : $(TO_INST_PM) -MAKE_FRAG - - if( keys %files ) { - $m .= <<'MAKE_FRAG'; - $(NOECHO) $(RM_F) .MM_tmp -MAKE_FRAG - - my $line = ''; - while (my($from, $to) = each %files) { - $line .= " $from $to"; - if (length($line) > 128) { - $m .= sprintf <<'MAKE_FRAG', $line; - $(NOECHO) $(PERL) -e "print '%s'" >>.MM_tmp -MAKE_FRAG - $line = ''; - } - } - $m .= sprintf <<'MAKE_FRAG', $line if $line; - $(NOECHO) $(PERL) -e "print '%s'" >>.MM_tmp -MAKE_FRAG - - $m .= sprintf <<'MAKE_FRAG', $autodir; - $(PERLRUN) "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'%s','$(PM_FILTER)')" <.MM_tmp - $(NOECHO) $(RM_F) .MM_tmp -MAKE_FRAG - - } - $m .= <<'MAKE_FRAG'; - $(NOECHO) $(TOUCH) pm_to_blib.ts -MAKE_FRAG - - return $m; -} - -=item tool_autosplit (override) - -Use VMS-style quoting on command line. - -=cut - -sub tool_autosplit { - my($self, %attribs) = @_; - my($asl) = ""; - $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN}; - q{ -# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto -AUTOSPLITFILE = $(PERLRUN) -e "use AutoSplit;}.$asl.q{autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;" -}; -} =item tool_sxubpp (override) @@ -805,9 +707,10 @@ Use VMS-style quoting on xsubpp command line. sub tool_xsubpp { my($self) = @_; return '' unless $self->needs_linking; - my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils'); + my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils'); # drop back to old location if xsubpp is not in new location yet - $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp')); + $xsdir = $self->catdir($self->{PERL_SRC},'ext') + unless (-f $self->catfile($xsdir,'xsubpp')); my(@tmdeps) = '$(XSUBPPDIR)typemap'; if( $self->{TYPEMAPS} ){ my $typemap; @@ -831,7 +734,7 @@ sub tool_xsubpp { (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) { unshift(@tmargs,'-nolinenumbers'); } - my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp')); + my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp')); # What are the correct thresholds for version 1 && 2 Paul? if ( $xsubpp_version > 1.923 ){ @@ -877,7 +780,7 @@ sub xsubpp_version print "Running: $command\n" if $Verbose; $version = `$command` ; if ($?) { - use vmsish 'status'; + use ExtUtils::MakeMaker::vmsish 'status'; warn "Running '$command' exits with status $?"; } chop $version ; @@ -907,7 +810,7 @@ EOM print "Running: $command\n" if $Verbose; my $text = `$command` ; if ($?) { - use vmsish 'status'; + use ExtUtils::MakeMaker::vmsish 'status'; warn "Running '$command' exits with status $?"; } unlink $file ; @@ -924,68 +827,68 @@ EOM =item tools_other (override) -Adds a few MM[SK] macros, and shortens some the installatin commands, -in order to stay under DCL's 255-character limit. Also changes -EQUALIZE_TIMESTAMP to set revision date of target file to one second -later than source file, since MMK interprets precisely equal revision -dates for a source and target file as a sign that the target needs -to be updated. +Throw in some dubious extra macros for Makefile args. + +Also keep around the old $(SAY) macro in case somebody's using it. =cut sub tools_other { my($self) = @_; - qq! + + # XXX Are these necessary? Does anyone override them? They're longer + # than just typing the literal string. + my $extra_tools = <<'EXTRA_TOOLS'; + # Assumes \$(MMS) invokes MMS or MMK # (It is assumed in some cases later that the default makefile name # (Descrip.MMS for MM[SK]) is used.) USEMAKEFILE = /Descrip= USEMACROS = /Macro=( MACROEND = ) -MAKEFILE = Descrip.MMS -SHELL = Posix -TOUCH = $self->{TOUCH} -CHMOD = $self->{CHMOD} -CP = $self->{CP} -MV = $self->{MV} -RM_F = $self->{RM_F} -RM_RF = $self->{RM_RF} -SAY = Write Sys\$Output -UMASK_NULL = $self->{UMASK_NULL} -MKPATH = Create/Directory -EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])" -!. ($self->{PARENT} ? '' : -qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}" -MOD_INSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);" -DOC_INSTALL = \$(PERL) -e "\@ARGV=split(/\\|/,<STDIN>);print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]" -UNINSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);" -!); + +# Just in case anyone is using the old macro. +SAY = $ECHO + +EXTRA_TOOLS + + return $self->SUPER::tools_other . $extra_tools; } -=item dist (override) +=item init_dist (override) -Provide VMSish defaults for some values, then hand off to -default MM_Unix method. +VMSish defaults for some values. -=cut + macro description default -sub dist { - my($self, %attribs) = @_; - $attribs{VERSION} ||= $self->{VERSION_SYM}; - $attribs{NAME} ||= $self->{DISTNAME}; - $attribs{ZIPFLAGS} ||= '-Vu'; - $attribs{COMPRESS} ||= 'gzip'; - $attribs{SUFFIX} ||= '-gz'; - $attribs{SHAR} ||= 'vms_share'; - $attribs{DIST_DEFAULT} ||= 'zipdist'; + ZIPFLAGS flags to pass to ZIP -Vu - # Sanitize these for use in $(DISTVNAME) filespec - $attribs{VERSION} =~ s/[^\w\$]/_/g; - $attribs{NAME} =~ s/[^\w\$]/-/g; + COMPRESS compression command to gzip + use for tarfiles + SUFFIX suffix to put on -gz + compressed files - $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)'; + SHAR shar command to use vms_share - return $self->SUPER::dist(%attribs); + DIST_DEFAULT default target to use to tardist + create a distribution + + DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM) + VERSION for the name + +=cut + +sub init_dist { + my($self) = @_; + $self->{ZIPFLAGS} ||= '-Vu'; + $self->{COMPRESS} ||= 'gzip'; + $self->{SUFFIX} ||= '-gz'; + $self->{SHAR} ||= 'vms_share'; + $self->{DIST_DEFAULT} ||= 'zipdist'; + + $self->SUPER::init_dist; + + $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}"; } =item c_o (override) @@ -1042,62 +945,6 @@ sub xs_o { # many makes are too dumb to use xs_c then c_o '; } -=item top_targets (override) - -Path seperator differences. - -=cut - -sub top_targets { - my($self) = shift; - my(@m); - push @m, ' -all :: pure_all manifypods - $(NOECHO) $(NOOP) - -pure_all :: config pm_to_blib subdirs linkext - $(NOECHO) $(NOOP) - -subdirs :: $(MYEXTLIB) - $(NOECHO) $(NOOP) - -config :: $(MAKEFILE) $(INST_LIBDIR).exists - $(NOECHO) $(NOOP) - -config :: $(INST_ARCHAUTODIR).exists - $(NOECHO) $(NOOP) - -config :: $(INST_AUTODIR).exists - $(NOECHO) $(NOOP) -'; - - push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]); - if (%{$self->{MAN1PODS}}) { - push @m, q[ -config :: $(INST_MAN1DIR).exists - $(NOECHO) $(NOOP) -]; - push @m, $self->dir_target(qw[$(INST_MAN1DIR)]); - } - if (%{$self->{MAN3PODS}}) { - push @m, q[ -config :: $(INST_MAN3DIR).exists - $(NOECHO) $(NOOP) -]; - push @m, $self->dir_target(qw[$(INST_MAN3DIR)]); - } - - push @m, ' -$(O_FILES) : $(H_FILES) -' if @{$self->{O_FILES} || []} && @{$self->{H} || []}; - - push @m, q{ -help : - perldoc ExtUtils::MakeMaker -}; - - join('',@m); -} =item dlsyms (override) @@ -1204,7 +1051,7 @@ INST_DYNAMIC_DEP = $inst_dynamic_dep "; push @m, ' -$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) +$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",' Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option @@ -1231,13 +1078,13 @@ BOOTSTRAP = '."$self->{BASEEXT}.bs".' # As MakeMaker mkbootstrap might not write a file (if none is required) # we use touch to prevent make continually trying to remake it. # The DynaLoader only reads a non-empty file. -$(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists - $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))" +$(BOOTSTRAP) : $(FIRST_MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR)$(DIRFILESEP).exists + $(NOECHO) $(ECHO) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))" $(NOECHO) $(PERLRUN) - -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');" $(NOECHO) $(TOUCH) $(MMS$TARGET) -$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists +$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(NOECHO) $(RM_RF) $(INST_BOOT) - $(CP) $(BOOTSTRAP) $(INST_BOOT) '; @@ -1261,7 +1108,7 @@ $(INST_STATIC) : my(@m,$lib); push @m,' # Rely on suffix rule for update action -$(OBJECT) : $(INST_ARCHAUTODIR).exists +$(OBJECT) : $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(INST_STATIC) : $(OBJECT) $(MYEXTLIB) '; @@ -1289,56 +1136,6 @@ $(INST_STATIC) : $(OBJECT) $(MYEXTLIB) } -=item manifypods (override) - -Use VMS-style quoting on command line, and VMS logical name -to specify fallback location at build time if we can't find pod2man. - -=cut - - -sub manifypods { - my($self, %attribs) = @_; - return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}}; - my($dist); - my($pod2man_exe); - if (defined $self->{PERL_SRC}) { - $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man'); - } else { - $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man'); - } - if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) { - # No pod2man but some MAN3PODS to be installed - print <<END; - -Warning: I could not locate your pod2man program. As a last choice, - I will look for the file to which the logical name POD2MAN - points when MMK is invoked. - -END - $pod2man_exe = "pod2man"; - } - my(@m); - push @m, -qq[POD2MAN_EXE = $pod2man_exe\n], -q[POD2MAN = $(PERLRUN) "-MPod::Man" -we "%m=@ARGV;for(keys %m){" - --e "Pod::Man->new->parse_from_file($_,$m{$_}) }" -]; - push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n"; - if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) { - my($pod); - foreach $pod (sort keys %{$self->{MAN1PODS}}) { - push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ]; - push @m, "$pod $self->{MAN1PODS}{$pod}\n"; - } - foreach $pod (sort keys %{$self->{MAN3PODS}}) { - push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ]; - push @m, "$pod $self->{MAN3PODS}{$pod}\n"; - } - } - join('', @m); -} - =item processPL (override) Use VMS-style quoting on command line. @@ -1380,7 +1177,7 @@ sub installbin { my($self) = @_; return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY"; return '' unless @{$self->{EXE_FILES}}; - my(@m, $from, $to, %fromto, @to, $line); + my(@m, $from, $to, %fromto, @to); my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}}; for $from (@exefiles) { my($path) = '$(INST_SCRIPT)' . basename($from); @@ -1395,7 +1192,8 @@ EXE_FILES = @exefiles realclean :: "; - $line = ''; #avoid unitialized var warning + + my $line = ''; foreach $to (@to) { if (length($line) + length($to) > 80) { push @m, "\t\$(RM_F) $line\n"; @@ -1412,7 +1210,7 @@ realclean :: else { ($todir = $to) =~ s/[^\)]+$//; } $todir = $self->fixpath($todir,1); push @m, " -$to : $from \$(MAKEFILE) ${todir}.exists +$to : $from \$(FIRST_MAKEFILE) ${todir}\$(DIRFILESEP).exists \$(CP) $from $to ", $self->dir_target($todir); @@ -1455,13 +1253,8 @@ sub clean { push @m, ' # Delete temporary files but do not touch installed files. We don\'t delete # the Descrip.MMS here so that a later make realclean still has it to use. -clean :: +clean :: clean_subdirs '; - foreach $dir (@{$self->{DIR}}) { # clean subdirectories first - my($vmsdir) = $self->fixpath($dir,1); - push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t", - '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n"); - } push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp '; @@ -1469,24 +1262,28 @@ clean :: # Unlink realclean, $attribs{FILES} is a string here; it may contain # a list or a macro that expands to a list. if ($attribs{FILES}) { - my($word,$key,@filist); - if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; } - else { @filist = split /\s+/, $attribs{FILES}; } - foreach $word (@filist) { - if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') { - push(@otherfiles, @{$self->{$key}}); + my @filelist = ref $attribs{FILES} eq 'ARRAY' + ? @{$attribs{FILES}} + : split /\s+/, $attribs{FILES}; + + foreach my $word (@filelist) { + if ($word =~ m#^\$\((.*)\)$# and + ref $self->{$1} eq 'ARRAY') + { + push(@otherfiles, @{$self->{$1}}); } else { push(@otherfiles, $word); } } } - push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]); - push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all')); - my($file,$line); - $line = ''; #avoid unitialized var warning + push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld + perlmain.c pm_to_blib pm_to_blib.ts ]); + push(@otherfiles, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all')); + # Occasionally files are repeated several times from different sources - { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; } + { my(%of) = map { ($_ => 1) } @otherfiles; @otherfiles = keys %of; } - foreach $file (@otherfiles) { + my $line = ''; + foreach my $file (@otherfiles) { $file = $self->fixpath($file); if (length($line) + length($file) > 80) { push @m, "\t\$(RM_RF) $line\n"; @@ -1499,6 +1296,39 @@ clean :: join('', @m); } + +=item clean_subdirs_target + + my $make_frag = $MM->clean_subdirs_target; + +VMS semantics for changing directories and rerunning make very different. + +=cut + +sub clean_subdirs_target { + my($self) = shift; + + # No subdirectories, no cleaning. + return <<'NOOP_FRAG' unless @{$self->{DIR}}; +clean_subdirs : + $(NOECHO) $(NOOP) +NOOP_FRAG + + + my $clean = "clean_subdirs :\n"; + + foreach my $dir (@{$self->{DIR}}) { # clean subdirectories first + $dir = $self->fixpath($dir,1); + + $clean .= sprintf <<'MAKE_FRAG', $dir, $dir; + If F$Search("%s$(FIRST_MAKEFILE)").nes."" Then $(PERLRUN) -e "chdir '%s'; print `$(MMS)$(MMSQUALIFIERS) clean`;" +MAKE_FRAG + } + + return $clean; +} + + =item realclean (override) Guess what we're working around? Also, use MM[SK] for subdirectories. @@ -1514,7 +1344,7 @@ realclean :: clean '); foreach(@{$self->{DIR}}){ my($vmsdir) = $self->fixpath($_,1); - push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t", + push(@m, ' If F$Search("'."$vmsdir".'$(FIRST_MAKEFILE)").nes."" Then \\',"\n\t", '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n"); } push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n"; @@ -1523,15 +1353,16 @@ realclean :: clean # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a # combination of macros). In order to stay below DCL's 255 char limit, # we put only 2 on a line. - my($file,$line,$fcnt); - my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old }; + my($file,$fcnt); + my(@files) = qw{ $(FIRST_MAKEFILE) $(MAKEFILE_OLD) }; if ($self->has_link_code) { push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) }); } - push(@files, values %{$self->{PM}}); - $line = ''; #avoid unitialized var warning + # Occasionally files are repeated several times from different sources { my(%f) = map { ($_,1) } @files; @files = keys %f; } + + my $line = ''; foreach $file (@files) { $file = $self->fixpath($file); if (length($line) + length($file) > 80 || ++$fcnt >= 2) { @@ -1569,32 +1400,32 @@ realclean :: clean join('', @m); } +=item zipfile_target (o) -=item dist_core (override) +=item tarfile_target (o) -Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>, -so C<shdist> target actions are VMS-specific. +=item shdist_target (o) -=cut - -sub dist_core { - my($self) = @_; -q[ -dist : $(DIST_DEFAULT) - $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')" +Syntax for invoking shar, tar and zip differs from that for Unix. -zipdist : $(DISTVNAME).zip - $(NOECHO) $(NOOP) +=cut -tardist : $(DISTVNAME).tar$(SUFFIX) - $(NOECHO) $(NOOP) +sub zipfile_target { + my($self) = shift; + return <<'MAKE_FRAG'; $(DISTVNAME).zip : distdir $(PREOP) $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*; $(RM_RF) $(DISTVNAME) $(POSTOP) +MAKE_FRAG +} +sub tarfile_target { + my($self) = shift; + + return <<'MAKE_FRAG'; $(DISTVNAME).tar$(SUFFIX) : distdir $(PREOP) $(TO_UNIX) @@ -1602,13 +1433,19 @@ $(DISTVNAME).tar$(SUFFIX) : distdir $(RM_RF) $(DISTVNAME) $(COMPRESS) $(DISTVNAME).tar $(POSTOP) +MAKE_FRAG +} + +sub shdist_target { + my($self) = shift; + return <<'MAKE_FRAG'; shdist : distdir $(PREOP) - $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share + $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share $(RM_RF) $(DISTVNAME) $(POSTOP) -]; +MAKE_FRAG } =item dist_test (override) @@ -1642,18 +1479,18 @@ VMS-style command line quoting in a few cases. sub install { my($self, %attribs) = @_; - my(@m,@docfiles); + my(@m,@exe_files); if ($self->{EXE_FILES}) { my($line,$file) = ('',''); foreach $file (@{$self->{EXE_FILES}}) { $line .= "$file "; if (length($line) > 128) { - push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]); + push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]); $line = ''; } } - push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line; + push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]) if $line; } push @m, q[ @@ -1670,77 +1507,82 @@ pure_install :: pure_$(INSTALLDIRS)_install $(NOECHO) $(NOOP) doc_install :: doc_$(INSTALLDIRS)_install - $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod" + $(NOECHO) $(NOOP) pure__install : pure_site_install - $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" + $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" doc__install : doc_site_install - $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" + $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" # This hack brought to you by DCL's 255-character command line limit pure_perl_install :: $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp - $(MOD_INSTALL) <.MM_tmp - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp; - $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[ + $(NOECHO) $(ECHO) "$(INST_LIB) $(INSTALLPRIVLIB) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_ARCHLIB) $(INSTALLARCHLIB) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_BIN) $(INSTALLBIN) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN1DIR) $(INSTALLMAN1DIR) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN3DIR) $(INSTALLMAN3DIR) " >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp + $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[ # Likewise pure_site_install :: $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLSITEBIN) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) '" >>.MM_tmp - $(MOD_INSTALL) <.MM_tmp - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp; - $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[ + $(NOECHO) $(ECHO) "$(INST_LIB) $(INSTALLSITELIB) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_ARCHLIB) $(INSTALLSITEARCH) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_BIN) $(INSTALLSITEBIN) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) " >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp + $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[ pure_vendor_install :: - $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLVENDORLIB) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLVENDORARCH) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLVENDORBIN) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) '" >>.MM_tmp - $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) '" >>.MM_tmp - $(MOD_INSTALL) <.MM_tmp - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp; + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_LIB) $(INSTALLVENDORLIB) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_ARCHLIB) $(INSTALLVENDORARCH) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_BIN) $(INSTALLVENDORBIN) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) " >>.MM_tmp + $(NOECHO) $(ECHO) "$(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) " >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp # Ditto doc_perl_install :: - $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp - $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp -],@docfiles, -q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp - $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp - $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp - $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp - $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[ - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp; + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLARCHLIB}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(INSTALLARCHLIB) + $(NOECHO) $(ECHO) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp + $(NOECHO) $(ECHO) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp +],@exe_files, +q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp # And again doc_site_install :: - $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp - $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp -],@docfiles, -q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp - $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp - $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp - $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp - $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[ - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp; + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLSITEARCH}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(INSTALLSITEARCH) + $(NOECHO) $(ECHO) "installed into|$(INSTALLSITELIB)|" >.MM_tmp + $(NOECHO) $(ECHO) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp +],@exe_files, +q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLSITEARCH},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp doc_vendor_install :: + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLVENDORARCH}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(INSTALLVENDORARCH) + $(NOECHO) $(ECHO) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp + $(NOECHO) $(ECHO) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp +],@exe_files, +q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLVENDORARCH},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp ]; @@ -1749,16 +1591,16 @@ uninstall :: uninstall_from_$(INSTALLDIRS)dirs $(NOECHO) $(NOOP) uninstall_from_perldirs :: - $(NOECHO) $(UNINSTALL) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[ - $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes." - $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove" - $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience." + $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[ + $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes." + $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove" + $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience." uninstall_from_sitedirs :: - $(NOECHO) $(UNINSTALL) ],File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[ - $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes." - $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove" - $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience." + $(NOECHO) $(UNINSTALL) ],$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[ + $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes." + $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove" + $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience." ]; join('',@m); @@ -1797,7 +1639,7 @@ $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h if ($self->{PERL_SRC}) { my(@macros); - my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)'; + my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)'; push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP'; push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc'; push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc'; @@ -1851,15 +1693,15 @@ $(OBJECT) : $(FIRST_MAKEFILE) push @m,q[ # We take a very conservative approach here, but it\'s worth it. -# We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping. -$(MAKEFILE) : Makefile.PL $(CONFIGDEP) - $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)" - $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..." - - $(MV) $(MAKEFILE) $(MAKEFILE)_old - - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean +# We move $(FIRST_MAKEFILE) to $(MAKEFILE_OLD) here to avoid gnu make looping. +$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) + $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)" + $(NOECHO) $(ECHO) "Cleaning current config before rebuilding $(FIRST_MAKEFILE) ..." + - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) + - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE_OLD) clean $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[ - $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt." - $(NOECHO) $(SAY) "Please run $(MMS) to build the extension." + $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) has been rebuilt." + $(NOECHO) $(ECHO) "Please run $(MMS) to build the extension." ]; join('',@m); @@ -1899,10 +1741,10 @@ testdb :: testdb_\$(LINKTYPE) "; foreach(@{$self->{DIR}}){ my($vmsdir) = $self->fixpath($_,1); - push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'", + push(@m, ' If F$Search("',$vmsdir,'$(FIRST_MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'", '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n"); } - push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n") + push(@m, "\t\$(NOECHO) \$(ECHO) \"No tests defined for \$(NAME) extension.\"\n") unless $tests or -f "test.pl" or @{$self->{DIR}}; push(@m, "\n"); @@ -1949,7 +1791,7 @@ use vars qw(%olbs); sub makeaperl { my($self, %attribs) = @_; - my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) = + my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) = @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)}; my(@m); push @m, " @@ -1963,10 +1805,10 @@ MAP_TARGET = $target unless ($self->{MAKEAPERL}) { push @m, q{ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) - $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)" + $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)" $(NOECHO) $(PERLRUNINST) \ Makefile.PL DIR=}, $dir, q{ \ - MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ + FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ MAKEAPERL=1 NORECURS=1 }; push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{ @@ -2091,23 +1933,23 @@ $(MAP_TARGET) :: $(MAKE_APERL_FILE) $shrtarget =~ s/^([^.]*)/$1Shr/; $shrtarget = $targdir . $shrtarget; $target = "Perlshr.$Config{'dlext'}" unless $target; - $tmp = "[]" unless $tmp; - $tmp = $self->fixpath($tmp,1); + $tmpdir = "[]" unless $tmpdir; + $tmpdir = $self->fixpath($tmpdir,1); if (@optlibs) { $extralist = join(' ',@optlibs); } else { $extralist = ''; } # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr) # that's what we're building here). push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2]; if ($libperl) { - unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) { + unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) { print STDOUT "Warning: $libperl not found\n"; undef $libperl; } } unless ($libperl) { if (defined $self->{PERL_SRC}) { - $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}"); - } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) { + $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}"); + } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) { } else { print STDOUT "Warning: $libperl not found If you're going to build a static perl binary, make sure perl is installed @@ -2127,41 +1969,43 @@ MAP_LIBPERL = ",$self->fixpath($libperl,0),' '; - push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n"; + push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n"; foreach (@optlibs) { push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n"; } - push @m,"\n${tmp}PerlShr.Opt :\n\t"; + push @m,"\n${tmpdir}PerlShr.Opt :\n\t"; push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n"; -push @m,' + push @m,' $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",' $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",' -$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",' - $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option - $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say" - $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)" - $(NOECHO) $(SAY) "To remove the intermediate files, say - $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean" +$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",' + $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option + $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say" + $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)" + $(NOECHO) $(ECHO) "To remove the intermediate files, say + $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean" '; - push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n"; + push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n"; push @m, "# More from the 255-char line length limit\n"; foreach (@staticpkgs) { - push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n]; + push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n]; } - push @m,' - $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET) - $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n"; + + push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir; + $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET) + $(NOECHO) $(RM_F) %sWritemain.tmp +MAKE_FRAG push @m, q[ # Still more from the 255-char line length limit doc_inst_perl : - $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp - $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp - $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp - $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp - $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[ - $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp; + $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp + $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp + $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp + $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp + $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp ]; push @m, " @@ -2176,8 +2020,8 @@ clean :: map_clean \$(NOECHO) \$(NOOP) map_clean : - \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE) - \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET) + \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE) + \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET) "; join '', @m; @@ -2219,6 +2063,11 @@ used instead. sub prefixify { my($self, $var, $sprefix, $rprefix, $default) = @_; + + # Translate $(PERLPREFIX) to a real path. + $rprefix = $self->eliminate_macros($rprefix); + $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix; + $default = VMS::Filespec::vmsify($default) unless $default =~ /\[.*\]/; @@ -2238,7 +2087,7 @@ sub prefixify { print STDERR " prefixify $var => $path\n" if $Verbose >= 2; print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2; - my($path_vol, $path_dirs) = File::Spec->splitpath( $path ); + my($path_vol, $path_dirs) = $self->splitpath( $path ); if( $path_vol eq $Config{vms_prefix}.':' ) { print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2; @@ -2275,19 +2124,230 @@ sub _prefixify_default { sub _catprefix { my($self, $rprefix, $default) = @_; - my($rvol, $rdirs) = File::Spec->splitpath($rprefix); + my($rvol, $rdirs) = $self->splitpath($rprefix); if( $rvol ) { - return File::Spec->catpath($rvol, - File::Spec->catdir($rdirs, $default), + return $self->catpath($rvol, + $self->catdir($rdirs, $default), '' ) } else { - return File::Spec->catdir($rdirs, $default); + return $self->catdir($rdirs, $default); } } +=item oneliner (o) + +=cut + +sub oneliner { + my($self, $cmd, $switches) = @_; + $switches = [] unless defined $switches; + + # Strip leading and trailing newlines + $cmd =~ s{^\n+}{}; + $cmd =~ s{\n+$}{}; + + $cmd = $self->quote_literal($cmd); + $cmd = $self->escape_newlines($cmd); + + # Switches must be quoted else they will be lowercased. + $switches = join ' ', map { qq{"$_"} } @$switches; + + return qq{\$(PERLRUN) $switches -e $cmd}; +} + + +=item B<echo> (o) + +perl trips up on "<foo>" thinking its an input redirect. So we use the +native Write sys$output instead. + +=cut + +sub echo { + my($self, $text, $file, $appending) = @_; + $appending ||= 0; + + die "The VMS version of echo() cannot currently append" if $appending; + + my @cmds = ("\$(NOECHO) Assign $file Sys\$Output"); + push @cmds, map { '$(NOECHO) Write Sys$Output '.$self->quote_literal($_) } + split /\n/, $text; + push @cmds, '$(NOECHO) Deassign Sys$Output'; + return @cmds; +} + + +=item quote_literal + +=cut + +sub quote_literal { + my($self, $text) = @_; + + # I believe this is all we should need. + $text =~ s{"}{""}g; + + return qq{"$text"}; +} + +=item escape_newlines + +=cut + +sub escape_newlines { + my($self, $text) = @_; + + $text =~ s{\n}{-\n}g; + + return $text; +} + +=item max_exec_len + +256 characters. + +=cut + +sub max_exec_len { + my $self = shift; + + return $self->{_MAX_EXEC_LEN} ||= 256; +} + +=item init_linker (o) + +=cut + +sub init_linker { + my $self = shift; + $self->{EXPORT_LIST} ||= '$(BASEEXT).opt'; + + my $shr = $Config{dbgprefix} . 'PERLSHR'; + $self->{PERL_ARCHIVE} ||= $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"; + + $self->{PERL_ARCHIVE_AFTER} ||= ''; +} + +=item eliminate_macros + +Expands MM[KS]/Make macros in a text string, using the contents of +identically named elements of C<%$self>, and returns the result +as a file specification in Unix syntax. + +NOTE: This is the cannonical version of the method. The version in +File::Spec::VMS is deprecated. + +=cut + +sub eliminate_macros { + my($self,$path) = @_; + return '' unless $path; + $self = {} unless ref $self; + + if ($path =~ /\s/) { + return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path; + } + + my($npath) = unixify($path); + # sometimes unixify will return a string with an off-by-one trailing null + $npath =~ s{\0$}{}; + + my($complex) = 0; + my($head,$macro,$tail); + + # perform m##g in scalar context so it acts as an iterator + while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { + if (defined $self->{$2}) { + ($head,$macro,$tail) = ($1,$2,$3); + if (ref $self->{$macro}) { + if (ref $self->{$macro} eq 'ARRAY') { + $macro = join ' ', @{$self->{$macro}}; + } + else { + print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}), + "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n"; + $macro = "\cB$macro\cB"; + $complex = 1; + } + } + else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; } + $npath = "$head$macro$tail"; + } + } + if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; } + $npath; +} + +=item fixpath + +Catchall routine to clean up problem MM[SK]/Make macros. Expands macros +in any directory specification, in order to avoid juxtaposing two +VMS-syntax directories when MM[SK] is run. Also expands expressions which +are all macro, so that we can tell how long the expansion is, and avoid +overrunning DCL's command buffer when MM[KS] is running. + +If optional second argument has a TRUE value, then the return string is +a VMS-syntax directory specification, if it is FALSE, the return string +is a VMS-syntax file specification, and if it is not specified, fixpath() +checks to see whether it matches the name of a directory in the current +default directory, and returns a directory or file specification accordingly. + +NOTE: This is the cannonical version of the method. The version in +File::Spec::VMS is deprecated. + +=cut + +sub fixpath { + my($self,$path,$force_path) = @_; + return '' unless $path; + $self = bless {} unless ref $self; + my($fixedpath,$prefix,$name); + + if ($path =~ /\s/) { + return join ' ', + map { $self->fixpath($_,$force_path) } + split /\s+/, $path; + } + + if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) { + if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) { + $fixedpath = vmspath($self->eliminate_macros($path)); + } + else { + $fixedpath = vmsify($self->eliminate_macros($path)); + } + } + elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) { + my($vmspre) = $self->eliminate_macros("\$($prefix)"); + # is it a dir or just a name? + $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : ''; + $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name; + $fixedpath = vmspath($fixedpath) if $force_path; + } + else { + $fixedpath = $path; + $fixedpath = vmspath($fixedpath) if $force_path; + } + # No hints, so we try to guess + if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) { + $fixedpath = vmspath($fixedpath) if -d $fixedpath; + } + + # Trim off root dirname if it's had other dirs inserted in front of it. + $fixedpath =~ s/\.000000([\]>])/$1/; + # Special case for VMS absolute directory specs: these will have had device + # prepended during trip through Unix syntax in eliminate_macros(), since + # Unix syntax has no way to express "absolute from the top of this device's + # directory tree". + if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; } + + return $fixedpath; +} + + =back =cut |