2 # MakeMaker default methods for VMS
4 # Author: Charles Bailey bailey@newman.upenn.edu
6 package ExtUtils::MM_VMS;
14 # so we can compile the thing on non-VMS platforms.
16 require VMS::Filespec;
17 VMS::Filespec->import;
22 use vars qw($Revision @ISA $VERSION);
24 ($Revision) = q$Revision: 1.104 $ =~ /Revision:\s+(\S+)/;
26 require ExtUtils::MM_Any;
27 require ExtUtils::MM_Unix;
28 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
30 use ExtUtils::MakeMaker qw($Verbose neatvalue);
35 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
39 Do not use this directly.
40 Instead, use ExtUtils::MM and it will figure out which MM_*
45 See ExtUtils::MM_Unix for a documentation of the methods provided
46 there. This package overrides the implementation of these methods, not
49 =head2 Methods always loaded
55 Converts a list into a string wrapped at approximately 80 columns.
61 my($line,$hlen) = ('',0);
63 foreach my $word (@_) {
64 # Perl bug -- seems to occasionally insert extra elements when
65 # traversing array (scalar(@array) doesn't show them, but
66 # foreach(@array) does) (5.00307)
67 next unless $word =~ /\w/;
68 $line .= ' ' if length($line);
69 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
71 $hlen += length($word) + 2;
77 # This isn't really an override. It's just here because ExtUtils::MM_VMS
78 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
79 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
80 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
81 # XXX This hackery will die soon. --Schwern
83 require ExtUtils::Liblist::Kid;
84 goto &ExtUtils::Liblist::Kid::ext;
91 Those methods which override default MM_Unix methods are marked
92 "(override)", while methods unique to MM_VMS are marked "(specific)".
93 For overridden methods, documentation is limited to an explanation
94 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
95 documentation for more details.
99 =item guess_name (override)
101 Try to determine name of extension being built. We begin with the name
102 of the current directory. Since VMS filenames are case-insensitive,
103 however, we look for a F<.pm> file whose name matches that of the current
104 directory (presumably the 'main' F<.pm> file for this extension), and try
105 to find a C<package> statement from which to obtain the Mixed::Case
112 my($defname,$defpm,@pm,%xs,$pm);
115 $defname = basename(fileify($ENV{'DEFAULT'}));
116 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
118 # Fallback in case for some reason a user has copied the files for an
119 # extension into a working directory whose name doesn't reflect the
120 # extension's name. We'll use the name of a unique .pm file, or the
121 # first .pm file with a matching .xs file.
122 if (not -e "${defpm}.pm") {
123 @pm = map { s/.pm$//; $_ } glob('*.pm');
124 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
126 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
129 $defpm = $pm, last if exists $xs{$pm};
134 if (open(PM,"${defpm}.pm")){
136 if (/^\s*package\s+([^;]+)/i) {
141 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
142 "defaulting package name to $defname\n"
147 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
148 "defaulting package name to $defname\n";
150 $defname =~ s#[\d.\-_]+$##;
154 =item find_perl (override)
156 Use VMS file specification syntax and CLI commands to find and
162 my($self, $ver, $names, $dirs, $trace) = @_;
163 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
167 # Check in relative directories first, so we pick up the current
168 # version of Perl if we're running MakeMaker as part of the main build.
169 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
170 my($absb) = $self->file_name_is_absolute($b);
171 if ($absa && $absb) { return $a cmp $b }
172 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
174 # Check miniperl before perl, and check names likely to contain
175 # version numbers before "generic" names, so we pick up an
176 # executable that's less likely to be from an old installation.
177 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
178 my($bb) = $b =~ m!([^:>\]/]+)$!;
179 my($ahasdir) = (length($a) - length($ba) > 0);
180 my($bhasdir) = (length($b) - length($bb) > 0);
181 if ($ahasdir and not $bhasdir) { return 1; }
182 elsif ($bhasdir and not $ahasdir) { return -1; }
183 else { $bb =~ /\d/ <=> $ba =~ /\d/
184 or substr($ba,0,1) cmp substr($bb,0,1)
185 or length($bb) <=> length($ba) } } @$names;
186 # Image names containing Perl version use '_' instead of '.' under VMS
187 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
189 print "Looking for perl $ver by these names:\n";
190 print "\t@snames,\n";
191 print "in these dirs:\n";
194 foreach $dir (@sdirs){
195 next unless defined $dir; # $self->{PERL_SRC} may be undefined
196 $inabs++ if $self->file_name_is_absolute($dir);
198 # We've covered relative dirs; everything else is an absolute
199 # dir (probably an installed location). First, we'll try potential
200 # command names, to see whether we can avoid a long MCR expression.
201 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
202 $inabs++; # Should happen above in next $dir, but just in case . . .
204 foreach $name (@snames){
205 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
206 else { push(@cand,$self->fixpath($name,0)); }
209 foreach $name (@cand) {
210 print "Checking $name\n" if ($trace >= 2);
211 # If it looks like a potential command, try it without the MCR
212 if ($name =~ /^[\w\-\$]+$/) {
213 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
214 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
215 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
217 $rslt = `\@temp_mmvms.com` ;
218 unlink('temp_mmvms.com');
219 if ($rslt =~ /VER_OK/) {
220 print "Using PERL=$name\n" if $trace;
224 next unless $vmsfile = $self->maybe_command($name);
225 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
226 print "Executing $vmsfile\n" if ($trace >= 2);
227 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
228 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
229 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
231 $rslt = `\@temp_mmvms.com`;
232 unlink('temp_mmvms.com');
233 if ($rslt =~ /VER_OK/) {
234 print "Using PERL=MCR $vmsfile\n" if $trace;
235 return "MCR $vmsfile";
238 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
239 0; # false and not empty
242 =item maybe_command (override)
244 Follows VMS naming conventions for executable files.
245 If the name passed in doesn't exactly match an executable file,
246 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
247 to check for DCL procedure. If this fails, checks directories in DCL$PATH
248 and finally F<Sys$System:> for an executable file having the name specified,
249 with or without the F<.Exe>-equivalent suffix.
254 my($self,$file) = @_;
255 return $file if -x $file && ! -d _;
257 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
259 if ($file !~ m![/:>\]]!) {
260 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
261 $dir = $ENV{"DCL\$PATH;$i"};
262 $dir .= ':' unless $dir =~ m%[\]:]$%;
265 push(@dirs,'Sys$System:');
266 foreach $dir (@dirs) {
267 my $sysfile = "$dir$file";
268 foreach $ext (@exts) {
269 return $file if -x "$sysfile$ext" && ! -d _;
276 =item perl_script (override)
278 If name passed in doesn't specify a readable file, appends F<.com> or
279 F<.pl> and tries again, since it's customary to have file types on all files
285 my($self,$file) = @_;
286 return $file if -r $file && ! -d _;
287 return "$file.com" if -r "$file.com";
288 return "$file.pl" if -r "$file.pl";
292 =item replace_manpage_separator
294 Use as separator a character which is legal in a VMS-syntax file name.
298 sub replace_manpage_separator {
300 $man = unixify($man);
307 (override) Because of the difficulty concatenating VMS filepaths we
308 must pre-expand the DEST* variables.
315 $self->SUPER::init_DEST;
317 # Expand DEST variables.
318 foreach my $var ($self->installvars) {
319 my $destvar = 'DESTINSTALL'.$var;
320 $self->{$destvar} = File::Spec->eliminate_macros($self->{$destvar});
325 =item init_DIRFILESEP
327 No seperator between a directory path and a filename on VMS.
331 sub init_DIRFILESEP {
334 $self->{DIRFILESEP} = '';
339 =item init_main (override)
347 $self->SUPER::init_main;
349 $self->{DEFINE} ||= '';
350 if ($self->{DEFINE} ne '') {
351 my(@terms) = split(/\s+/,$self->{DEFINE});
353 foreach my $def (@terms) {
356 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
357 $targ = \@udefs if $1 eq 'U';
358 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
359 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
362 $def =~ s/"/""/g; # Protect existing " from DCL
363 $def = qq["$def"]; # and quote to prevent parsing of =
368 $self->{DEFINE} = '';
370 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
373 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
378 =item init_others (override)
380 Provide VMS-specific forms of various utility commands, then hand
381 off to the default MM_Unix method.
383 DEV_NULL should probably be overriden with something.
385 Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
386 one second later than source file, since MMK interprets precisely
387 equal revision dates for a source and target file as a sign that the
388 target needs to be updated.
395 $self->{NOOP} = 'Continue';
396 $self->{NOECHO} ||= '@ ';
398 $self->{MAKEFILE} ||= 'Descrip.MMS';
399 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
400 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
401 $self->{MAKEFILE_OLD} ||= '$(FIRST_MAKEFILE)_old';
403 $self->{ECHO} ||= '$(PERLRUN) -le "print qq{@ARGV}"';
404 $self->{ECHO_N} ||= '$(PERLRUN) -e "print qq{@ARGV}"';
405 $self->{TOUCH} ||= '$(PERLRUN) "-MExtUtils::Command" -e touch';
406 $self->{CHMOD} ||= '$(PERLRUN) "-MExtUtils::Command" -e chmod';
407 $self->{RM_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_f';
408 $self->{RM_RF} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_rf';
409 $self->{TEST_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e test_f';
410 $self->{EQUALIZE_TIMESTAMP} ||= '$(PERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
412 $self->{MOD_INSTALL} ||=
413 $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
414 install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)');
417 $self->{SHELL} ||= 'Posix';
419 $self->{CP} = 'Copy/NoConfirm';
420 $self->{MV} = 'Rename/NoConfirm';
421 $self->{UMASK_NULL} = '! ';
423 $self->SUPER::init_others;
425 if ($self->{OBJECT} =~ /\s/) {
426 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
427 $self->{OBJECT} = $self->wraplist(
428 map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
432 $self->{LDFROM} = $self->wraplist(
433 map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
438 =item init_platform (override)
440 Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
442 MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
450 $self->{MM_VMS_REVISION} = $Revision;
451 $self->{MM_VMS_VERSION} = $VERSION;
452 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
453 if $self->{PERL_SRC};
457 =item platform_constants
461 sub platform_constants {
465 foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
467 next unless defined $self->{$macro};
468 $make_frag .= "$macro = $self->{$macro}\n";
475 =item init_VERSION (override)
477 Override the *DEFINE_VERSION macros with VMS semantics. Translate the
478 MAKEMAKER filepath to VMS style.
485 $self->SUPER::init_VERSION;
487 $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
488 $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
489 $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
493 =item constants (override)
495 Fixes up numerous file and directory macros to insure VMS syntax
496 regardless of input syntax. Also makes lists of files
504 # Be kind about case for pollution
505 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
507 # Cleanup paths for directories in MMS macros.
508 foreach my $macro ( qw [
509 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
510 PERL_LIB PERL_ARCHLIB
512 (map { 'INSTALL'.$_ } $self->installvars)
515 next unless defined $self->{$macro};
516 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
517 $self->{$macro} = $self->fixpath($self->{$macro},1);
520 # Cleanup paths for files in MMS macros.
521 foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
522 MAKE_APERL_FILE MYEXTLIB] )
524 next unless defined $self->{$macro};
525 $self->{$macro} = $self->fixpath($self->{$macro},0);
528 # Fixup files for MMS macros
529 # XXX is this list complete?
531 FULLEXT VERSION_FROM OBJECT LDFROM
533 next unless defined $self->{$macro};
534 $self->{$macro} = $self->fixpath($self->{$macro},0);
538 for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
539 # Where is the space coming from? --jhi
540 next unless $self ne " " && defined $self->{$macro};
542 for my $key (keys %{$self->{$macro}}) {
543 $tmp{$self->fixpath($key,0)} =
544 $self->fixpath($self->{$macro}{$key},0);
546 $self->{$macro} = \%tmp;
549 for my $macro (qw/ C O_FILES H /) {
550 next unless defined $self->{$macro};
552 for my $val (@{$self->{$macro}}) {
553 push(@tmp,$self->fixpath($val,0));
555 $self->{$macro} = \@tmp;
558 return $self->SUPER::constants;
562 =item special_targets
564 Clear the default .SUFFIXES and put in our own list.
568 sub special_targets {
571 my $make_frag .= <<'MAKE_FRAG';
573 .SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
580 =item cflags (override)
582 Bypass shell script and produce qualifiers for CC directly (but warn
583 user if a shell script for this extension exists). Fold multiple
584 /Defines into one, since some C compilers pay attention to only one
585 instance of this qualifier on the command line.
590 my($self,$libperl) = @_;
591 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
592 my($definestr,$undefstr,$flagoptstr) = ('','','');
593 my($incstr) = '/Include=($(PERL_INC)';
596 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
597 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
598 " required to modify CC command for $self->{'BASEEXT'}\n"
601 if ($quals =~ / -[DIUOg]/) {
602 while ($quals =~ / -([Og])(\d*)\b/) {
603 my($type,$lvl) = ($1,$2);
604 $quals =~ s/ -$type$lvl\b\s*//;
605 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
606 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
608 while ($quals =~ / -([DIU])(\S+)/) {
609 my($type,$def) = ($1,$2);
610 $quals =~ s/ -$type$def\s*//;
612 if ($type eq 'D') { $definestr .= qq["$def",]; }
613 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
614 else { $undefstr .= qq["$def",]; }
617 if (length $quals and $quals !~ m!/!) {
618 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
621 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
622 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
623 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
624 # Deal with $self->{DEFINE} here since some C compilers pay attention
625 # to only one /Define clause on command line, so we have to
626 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
627 # ($self->{DEFINE} has already been VMSified in constants() above)
628 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
629 for my $type (qw(Def Undef)) {
631 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
633 $term =~ s:^\((.+)\)$:$1:;
636 if ($type eq 'Def') {
637 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
640 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
641 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
645 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
647 # Likewise with $self->{INC} and /Include
648 if ($self->{'INC'}) {
649 my(@includes) = split(/\s+/,$self->{INC});
650 foreach (@includes) {
652 $incstr .= ','.$self->fixpath($_,1);
655 $quals .= "$incstr)";
656 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
657 $self->{CCFLAGS} = $quals;
659 $self->{PERLTYPE} ||= '';
661 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
662 if ($self->{OPTIMIZE} !~ m!/!) {
663 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
664 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
665 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
668 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
669 $self->{OPTIMIZE} = '/Optimize';
673 return $self->{CFLAGS} = qq{
674 CCFLAGS = $self->{CCFLAGS}
675 OPTIMIZE = $self->{OPTIMIZE}
676 PERLTYPE = $self->{PERLTYPE}
680 =item const_cccmd (override)
682 Adds directives to point C preprocessor to the right place when
683 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
684 command line a bit differently than MM_Unix method.
689 my($self,$libperl) = @_;
692 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
693 return '' unless $self->needs_linking();
694 if ($Config{'vms_cc_type'} eq 'gcc') {
697 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
699 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
702 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
703 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
708 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
709 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
710 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
713 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
715 $self->{CONST_CCCMD} = join('',@m);
719 =item tool_sxubpp (override)
721 Use VMS-style quoting on xsubpp command line.
727 return '' unless $self->needs_linking;
730 foreach my $dir (@INC) {
731 $xsdir = $self->catdir($dir, 'ExtUtils');
732 if( -r $self->catfile($xsdir, "xsubpp") ) {
737 my $tmdir = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
738 my(@tmdeps) = $self->catfile($tmdir,'typemap');
739 if( $self->{TYPEMAPS} ){
741 foreach $typemap (@{$self->{TYPEMAPS}}){
743 warn "Typemap $typemap not found.\n";
746 push(@tmdeps, $self->fixpath($typemap,0));
750 push(@tmdeps, "typemap") if -f "typemap";
751 my(@tmargs) = map("-typemap $_", @tmdeps);
752 if( exists $self->{XSOPT} ){
753 unshift( @tmargs, $self->{XSOPT} );
756 if ($Config{'ldflags'} &&
757 $Config{'ldflags'} =~ m!/Debug!i &&
758 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
759 unshift(@tmargs,'-nolinenumbers');
761 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
763 # What are the correct thresholds for version 1 && 2 Paul?
764 if ( $xsubpp_version > 1.923 ){
765 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
767 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
768 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
769 Your version of xsubpp is $xsubpp_version and cannot handle this.
770 Please upgrade to a more recent version of xsubpp.
773 $self->{XSPROTOARG} = "";
779 XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
780 XSPROTOARG = $self->{XSPROTOARG}
786 =item xsubpp_version (override)
788 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
789 rather than Unix rules ($sts == 0 ==E<gt> good).
795 my($self,$xsubpp) = @_;
797 return '' unless $self->needs_linking;
799 # try to figure out the version number of the xsubpp on the system
801 # first try the -v flag, introduced in 1.921 & 2.000a2
803 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
804 print "Running: $command\n" if $Verbose;
805 $version = `$command` ;
807 use ExtUtils::MakeMaker::vmsish 'status';
808 warn "Running '$command' exits with status $?";
812 return $1 if $version =~ /^xsubpp version (.*)/ ;
814 # nope, then try something else
817 my ($file) = 'temp' ;
818 $counter++ while -e "$file$counter"; # don't overwrite anything
822 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
824 MODULE = fred PACKAGE = fred
833 $command = "$self->{PERLRUN} $xsubpp $file";
834 print "Running: $command\n" if $Verbose;
835 my $text = `$command` ;
837 use ExtUtils::MakeMaker::vmsish 'status';
838 warn "Running '$command' exits with status $?";
842 # gets 1.2 -> 1.92 and 2.000a1
843 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
845 # it is either 1.0 or 1.1
846 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
848 # none of the above, so 1.0
852 =item tools_other (override)
854 Throw in some dubious extra macros for Makefile args.
856 Also keep around the old $(SAY) macro in case somebody's using it.
863 # XXX Are these necessary? Does anyone override them? They're longer
864 # than just typing the literal string.
865 my $extra_tools = <<'EXTRA_TOOLS';
867 # Assumes $(MMS) invokes MMS or MMK
868 # (It is assumed in some cases later that the default makefile name
869 # (Descrip.MMS for MM[SK]) is used.)
870 USEMAKEFILE = /Descrip=
874 # Just in case anyone is using the old macro.
879 return $self->SUPER::tools_other . $extra_tools;
882 =item init_dist (override)
884 VMSish defaults for some values.
886 macro description default
888 ZIPFLAGS flags to pass to ZIP -Vu
890 COMPRESS compression command to gzip
892 SUFFIX suffix to put on -gz
895 SHAR shar command to use vms_share
897 DIST_DEFAULT default target to use to tardist
898 create a distribution
900 DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
907 $self->{ZIPFLAGS} ||= '-Vu';
908 $self->{COMPRESS} ||= 'gzip';
909 $self->{SUFFIX} ||= '-gz';
910 $self->{SHAR} ||= 'vms_share';
911 $self->{DIST_DEFAULT} ||= 'zipdist';
913 $self->SUPER::init_dist;
915 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
920 Use VMS syntax on command line. In particular, $(DEFINE) and
921 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
927 return '' unless $self->needs_linking();
930 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
933 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
936 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
941 =item xs_c (override)
949 return '' unless $self->needs_linking();
952 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
956 =item xs_o (override)
958 Use MM[SK] macros, and VMS command line for C compiler.
962 sub xs_o { # many makes are too dumb to use xs_c then c_o
964 return '' unless $self->needs_linking();
967 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
968 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
973 =item dlsyms (override)
975 Create VMS linker options files specifying universal symbols for this
976 extension's shareable image, and listing other shareable images or
977 libraries to which it should be linked.
982 my($self,%attribs) = @_;
984 return '' unless $self->needs_linking();
986 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
987 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
988 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
991 unless ($self->{SKIPHASH}{'dynamic'}) {
993 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
999 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1001 ') unless $self->{SKIPHASH}{'static'};
1004 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1005 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1007 $(BASEEXT).opt : Makefile.PL
1008 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
1009 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1010 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1011 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1013 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1014 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1015 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1016 push @m, ($Config{d_vms_case_sensitive_symbols}
1017 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1019 else { # We don't have a "main" object file, so pull 'em all in
1020 # Upcase module names if linker is being case-sensitive
1021 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1022 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1023 s[\$\(\w+_EXT\)][]; # even as a macro
1024 s/.*[:>\/\]]//; # Trim off dir spec
1025 $upcase ? uc($_) : $_;
1026 } split ' ', $self->eliminate_macros($self->{OBJECT});
1027 my($tmp,@lines,$elt) = '';
1028 $tmp = shift @omods;
1029 foreach $elt (@omods) {
1031 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1034 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1036 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1038 if (length $self->{LDLOADLIBS}) {
1039 my($lib); my($line) = '';
1040 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1041 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1042 if (length($line) + length($lib) > 160) {
1043 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1044 $line = $lib . '\n';
1046 else { $line .= $lib . '\n'; }
1048 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1055 =item dynamic_lib (override)
1057 Use VMS Link command.
1062 my($self, %attribs) = @_;
1063 return '' unless $self->needs_linking(); #might be because of a subdir
1065 return '' unless $self->has_link_code();
1067 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1068 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1069 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1073 OTHERLDFLAGS = $otherldflags
1074 INST_DYNAMIC_DEP = $inst_dynamic_dep
1078 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1079 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1080 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1081 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1084 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1088 =item dynamic_bs (override)
1090 Use VMS-style quoting on Mkbootstrap command line.
1095 my($self, %attribs) = @_;
1098 ' unless $self->has_link_code();
1100 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1102 # As MakeMaker mkbootstrap might not write a file (if none is required)
1103 # we use touch to prevent make continually trying to remake it.
1104 # The DynaLoader only reads a non-empty file.
1105 $(BOOTSTRAP) : $(FIRST_MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1106 $(NOECHO) $(ECHO) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1107 $(NOECHO) $(PERLRUN) -
1108 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1109 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1111 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1112 $(NOECHO) $(RM_RF) $(INST_BOOT)
1113 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1117 =item static_lib (override)
1119 Use VMS commands to manipulate object library.
1125 return '' unless $self->needs_linking();
1130 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1134 # Rely on suffix rule for update action
1135 $(OBJECT) : $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1137 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1139 # If this extension has its own library (eg SDBM_File)
1140 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1141 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1143 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1145 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1146 # 'cause it's a library and you can't stick them in other libraries.
1147 # In that case, we use $OBJECT instead and hope for the best
1148 if ($self->{MYEXTLIB}) {
1149 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1151 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1154 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1155 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1156 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1158 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1163 =item processPL (override)
1165 Use VMS-style quoting on command line.
1171 return "" unless $self->{PL_FILES};
1173 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1174 my $list = ref($self->{PL_FILES}->{$plfile})
1175 ? $self->{PL_FILES}->{$plfile}
1176 : [$self->{PL_FILES}->{$plfile}];
1177 foreach my $target (@$list) {
1178 my $vmsplfile = vmsify($plfile);
1179 my $vmsfile = vmsify($target);
1184 $vmsfile :: $vmsplfile
1185 ",' $(PERLRUNINST) '," $vmsplfile $vmsfile
1192 =item installbin (override)
1194 Stay under DCL's 255 character command line limit once again by
1195 splitting potentially long list of files across multiple lines
1196 in C<realclean> target.
1202 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1203 return '' unless @{$self->{EXE_FILES}};
1204 my(@m, $from, $to, %fromto, @to);
1205 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1206 for $from (@exefiles) {
1207 my($path) = '$(INST_SCRIPT)' . basename($from);
1208 local($_) = $path; # backward compatibility
1209 $to = $self->libscan($path);
1210 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1211 $fromto{$from} = vmsify($to);
1213 @to = values %fromto;
1215 EXE_FILES = @exefiles
1225 if (length($line) + length($to) > 80) {
1226 push @m, "\t\$(RM_F) $line\n";
1229 else { $line .= " $to"; }
1231 push @m, "\t\$(RM_F) $line\n\n" if $line;
1233 while (($from,$to) = each %fromto) {
1234 last unless defined $from;
1236 if ($to =~ m#[/>:\]]#) {
1237 $todir = dirname($to);
1240 ($todir = $to) =~ s/[^\)]+$//;
1242 $todir = $self->fixpath($todir,1);
1244 $to : $from \$(FIRST_MAKEFILE) ${todir}\$(DIRFILESEP).exists
1247 ", $self->dir_target($todir);
1252 =item subdir_x (override)
1254 Use VMS commands to change default directory.
1259 my($self, $subdir) = @_;
1261 $subdir = $self->fixpath($subdir,1);
1265 olddef = F$Environment("Default")
1266 Set Default ',$subdir,'
1267 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1268 Set Default \'olddef\'
1273 =item clean (override)
1275 Split potentially long list of files across multiple commands (in
1276 order to stay under the magic command line limit). Also use MM[SK]
1277 commands for handling subdirectories.
1282 my($self, %attribs) = @_;
1285 # Delete temporary files but do not touch installed files. We don\'t delete
1286 # the Descrip.MMS here so that a later make realclean still has it to use.
1287 clean :: clean_subdirs
1289 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1292 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1293 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1294 # a list or a macro that expands to a list.
1295 if ($attribs{FILES}) {
1296 my @filelist = ref $attribs{FILES} eq 'ARRAY'
1297 ? @{$attribs{FILES}}
1298 : split /\s+/, $attribs{FILES};
1300 foreach my $word (@filelist) {
1301 if ($word =~ m#^\$\((.*)\)$# and
1302 ref $self->{$1} eq 'ARRAY')
1304 push(@otherfiles, @{$self->{$1}});
1306 else { push(@otherfiles, $word); }
1309 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld
1310 perlmain.c pm_to_blib pm_to_blib.ts ]);
1311 push(@otherfiles, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1313 # Occasionally files are repeated several times from different sources
1314 { my(%of) = map { ($_ => 1) } @otherfiles; @otherfiles = keys %of; }
1317 foreach my $file (@otherfiles) {
1318 $file = $self->fixpath($file);
1319 if (length($line) + length($file) > 80) {
1320 push @m, "\t\$(RM_RF) $line\n";
1323 else { $line .= " $file"; }
1325 push @m, "\t\$(RM_RF) $line\n" if $line;
1326 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1331 =item clean_subdirs_target
1333 my $make_frag = $MM->clean_subdirs_target;
1335 VMS semantics for changing directories and rerunning make very different.
1339 sub clean_subdirs_target {
1342 # No subdirectories, no cleaning.
1343 return <<'NOOP_FRAG' unless @{$self->{DIR}};
1349 my $clean = "clean_subdirs :\n";
1351 foreach my $dir (@{$self->{DIR}}) { # clean subdirectories first
1352 $dir = $self->fixpath($dir,1);
1354 $clean .= sprintf <<'MAKE_FRAG', $dir, $dir;
1355 If F$Search("%s$(FIRST_MAKEFILE)").nes."" Then $(PERLRUN) -e "chdir '%s'; print `$(MMS)$(MMSQUALIFIERS) clean`;"
1363 =item realclean (override)
1365 Guess what we're working around? Also, use MM[SK] for subdirectories.
1370 my($self, %attribs) = @_;
1373 # Delete temporary files (via clean) and also delete installed files
1376 foreach(@{$self->{DIR}}){
1377 my($vmsdir) = $self->fixpath($_,1);
1378 push(@m, ' If F$Search("'."$vmsdir".'$(FIRST_MAKEFILE)").nes."" Then \\',"\n\t",
1379 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1381 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1382 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
1383 # We can't expand several of the MMS macros here, since they don't have
1384 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1385 # combination of macros). In order to stay below DCL's 255 char limit,
1386 # we put only 2 on a line.
1388 my(@files) = qw{ $(FIRST_MAKEFILE) $(MAKEFILE_OLD) };
1389 if ($self->has_link_code) {
1390 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1393 # Occasionally files are repeated several times from different sources
1394 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1397 foreach $file (@files) {
1398 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1399 push @m, "\t\$(RM_F) $line\n";
1403 else { $line .= " $file"; }
1405 push @m, "\t\$(RM_F) $line\n" if $line;
1406 if ($attribs{FILES}) {
1407 my($word,$key,@filist,@allfiles);
1408 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1409 else { @filist = split /\s+/, $attribs{FILES}; }
1410 foreach $word (@filist) {
1411 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1412 push(@allfiles, @{$self->{$key}});
1414 else { push(@allfiles, $word); }
1417 # Occasionally files are repeated several times from different sources
1418 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1419 foreach $file (@allfiles) {
1420 $file = $self->fixpath($file);
1421 if (length($line) + length($file) > 80) {
1422 push @m, "\t\$(RM_RF) $line\n";
1425 else { $line .= " $file"; }
1427 push @m, "\t\$(RM_RF) $line\n" if $line;
1429 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1433 =item zipfile_target (o)
1435 =item tarfile_target (o)
1437 =item shdist_target (o)
1439 Syntax for invoking shar, tar and zip differs from that for Unix.
1443 sub zipfile_target {
1446 return <<'MAKE_FRAG';
1447 $(DISTVNAME).zip : distdir
1449 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1450 $(RM_RF) $(DISTVNAME)
1455 sub tarfile_target {
1458 return <<'MAKE_FRAG';
1459 $(DISTVNAME).tar$(SUFFIX) : distdir
1462 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1463 $(RM_RF) $(DISTVNAME)
1464 $(COMPRESS) $(DISTVNAME).tar
1472 return <<'MAKE_FRAG';
1475 $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
1476 $(RM_RF) $(DISTVNAME)
1481 =item dist_test (override)
1483 Use VMS commands to change default directory, and use VMS-style
1484 quoting on command line.
1492 startdir = F$Environment("Default")
1493 Set Default [.$(DISTVNAME)]
1494 $(ABSPERLRUN) Makefile.PL
1495 $(MMS)$(MMSQUALIFIERS)
1496 $(MMS)$(MMSQUALIFIERS) test
1497 Set Default 'startdir'
1501 # --- Test and Installation Sections ---
1503 =item install (override)
1505 Work around DCL's 255 character limit several times,and use
1506 VMS-style command line quoting in a few cases.
1511 my($self, %attribs) = @_;
1514 if ($self->{EXE_FILES}) {
1515 my($line,$file) = ('','');
1516 foreach $file (@{$self->{EXE_FILES}}) {
1518 if (length($line) > 128) {
1519 push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]);
1523 push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]) if $line;
1527 install :: all pure_install doc_install
1530 install_perl :: all pure_perl_install doc_perl_install
1533 install_site :: all pure_site_install doc_site_install
1536 pure_install :: pure_$(INSTALLDIRS)_install
1539 doc_install :: doc_$(INSTALLDIRS)_install
1542 pure__install : pure_site_install
1543 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1545 doc__install : doc_site_install
1546 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1548 # This hack brought to you by DCL's 255-character command line limit
1549 pure_perl_install ::
1550 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1551 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1552 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
1553 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
1554 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
1555 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1556 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
1557 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
1558 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1559 $(NOECHO) $(RM_F) .MM_tmp
1560 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1563 pure_site_install ::
1564 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1565 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1566 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
1567 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
1568 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
1569 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1570 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
1571 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
1572 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1573 $(NOECHO) $(RM_F) .MM_tmp
1574 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1576 pure_vendor_install ::
1577 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1578 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1579 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
1580 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
1581 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
1582 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1583 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
1584 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
1585 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1586 $(NOECHO) $(RM_F) .MM_tmp
1590 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1591 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1592 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
1593 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1595 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1596 $(NOECHO) $(RM_F) .MM_tmp
1600 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1601 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1602 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
1603 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1605 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1606 $(NOECHO) $(RM_F) .MM_tmp
1608 doc_vendor_install ::
1609 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1610 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1611 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
1612 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1614 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1615 $(NOECHO) $(RM_F) .MM_tmp
1620 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1623 uninstall_from_perldirs ::
1624 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1625 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1626 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1627 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1629 uninstall_from_sitedirs ::
1630 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1631 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1632 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1633 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1639 =item perldepend (override)
1641 Use VMS-style syntax for files; it's cheaper to just do it directly here
1642 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1643 we have to rebuild Config.pm, use MM[SK] to do it.
1652 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1653 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1654 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1655 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
1656 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1657 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1658 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1659 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1660 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
1661 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
1662 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1663 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1664 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1665 $(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h
1666 $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h
1668 ' if $self->{OBJECT};
1670 if ($self->{PERL_SRC}) {
1672 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
1673 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1674 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1675 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1676 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1677 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1678 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1680 # Check for unpropagated config.sh changes. Should never happen.
1681 # We do NOT just update config.h because that is not sufficient.
1682 # An out of date config.h is not fatal but complains loudly!
1683 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1686 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1687 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1688 olddef = F$Environment("Default")
1689 Set Default $(PERL_SRC)
1690 $(MMS)],$mmsquals,);
1691 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1692 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1693 $target =~ s/\Q$prefix/[/;
1694 push(@m," $target");
1696 else { push(@m,' $(MMS$TARGET)'); }
1698 Set Default 'olddef'
1702 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1708 =item makefile (override)
1710 Use VMS commands and quoting.
1717 # We do not know what target was originally specified so we
1718 # must force a manual rerun to be sure. But as it should only
1719 # happen very rarely it is not a significant problem.
1721 $(OBJECT) : $(FIRST_MAKEFILE)
1722 ] if $self->{OBJECT};
1725 # We take a very conservative approach here, but it's worth it.
1726 # We move $(FIRST_MAKEFILE) to $(MAKEFILE_OLD) here to avoid gnu make looping.
1727 $(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
1728 $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1729 $(NOECHO) $(ECHO) "Cleaning current config before rebuilding $(FIRST_MAKEFILE) ..."
1730 - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
1731 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE_OLD) clean
1732 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1733 $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) has been rebuilt."
1734 $(NOECHO) $(ECHO) "Please run $(MMS) to build the extension."
1740 =item find_tests (override)
1746 return -d 't' ? 't/*.t' : '';
1749 =item test (override)
1751 Use VMS commands for handling subdirectories.
1756 my($self, %attribs) = @_;
1757 my($tests) = $attribs{TESTS} || $self->find_tests;
1761 TEST_TYPE = test_\$(LINKTYPE)
1765 test :: \$(TEST_TYPE)
1768 testdb :: testdb_\$(LINKTYPE)
1772 foreach(@{$self->{DIR}}){
1773 my($vmsdir) = $self->fixpath($_,1);
1774 push(@m, ' If F$Search("',$vmsdir,'$(FIRST_MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1775 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1777 push(@m, "\t\$(NOECHO) \$(ECHO) \"No tests defined for \$(NAME) extension.\"\n")
1778 unless $tests or -f "test.pl" or @{$self->{DIR}};
1781 push(@m, "test_dynamic :: pure_all\n");
1782 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1783 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
1784 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1787 push(@m, "testdb_dynamic :: pure_all\n");
1788 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1791 # Occasionally we may face this degenerate target:
1792 push @m, "test_ : test_dynamic\n\n";
1794 if ($self->needs_linking()) {
1795 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1796 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1797 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1799 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1800 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1804 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1805 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1811 =item makeaperl (override)
1813 Undertake to build a new set of Perl images using VMS commands. Since
1814 VMS does dynamic loading, it's not necessary to statically link each
1815 extension into the Perl image, so this isn't the normal build path.
1816 Consequently, it hasn't really been tested, and may well be incomplete.
1823 my($self, %attribs) = @_;
1824 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
1825 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1828 # --- MakeMaker makeaperl section ---
1829 MAP_TARGET = $target
1831 return join '', @m if $self->{PARENT};
1833 my($dir) = join ":", @{$self->{DIR}};
1835 unless ($self->{MAKEAPERL}) {
1837 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1838 $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1839 $(NOECHO) $(PERLRUNINST) \
1840 Makefile.PL DIR=}, $dir, q{ \
1841 FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1842 MAKEAPERL=1 NORECURS=1 };
1844 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1846 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1847 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1855 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1858 # The front matter of the linkcommand...
1859 $linkcmd = join ' ', $Config{'ld'},
1860 grep($_, @Config{qw(large split ldflags ccdlflags)});
1861 $linkcmd =~ s/\s+/ /g;
1863 # Which *.olb files could we make use of...
1864 local(%olbs); # XXX can this be lexical?
1865 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1867 File::Find::find(sub {
1868 return unless m/\Q$self->{LIB_EXT}\E$/;
1869 return if m/^libperl/;
1871 if( exists $self->{INCLUDE_EXT} ){
1876 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1880 # Throw away anything not explicitly marked for inclusion.
1881 # DynaLoader is implied.
1882 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1888 return unless $found;
1890 elsif( exists $self->{EXCLUDE_EXT} ){
1894 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1898 # Throw away anything explicitly marked for exclusion
1899 foreach $excl (@{$self->{EXCLUDE_EXT}}){
1900 return if( $xx eq $excl );
1904 $olbs{$ENV{DEFAULT}} = $_;
1905 }, grep( -d $_, @{$searchdirs || []}));
1907 # We trust that what has been handed in as argument will be buildable
1908 $static = [] unless $static;
1909 @olbs{@{$static}} = (1) x @{$static};
1911 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1912 # Sort the object libraries in inverse order of
1913 # filespec length to try to insure that dependent extensions
1914 # will appear before their parents, so the linker will
1915 # search the parent library to resolve references.
1916 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
1917 # references from [.intuit.dwim]dwim.obj can be found
1918 # in [.intuit]intuit.olb).
1919 for (sort { length($a) <=> length($b) } keys %olbs) {
1920 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
1921 my($dir) = $self->fixpath($_,1);
1922 my($extralibs) = $dir . "extralibs.ld";
1923 my($extopt) = $dir . $olbs{$_};
1924 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
1925 push @optlibs, "$dir$olbs{$_}";
1926 # Get external libraries this extension will need
1927 if (-f $extralibs ) {
1929 open LIST,$extralibs or warn $!,next;
1932 # Include a library in the link only once, unless it's mentioned
1933 # multiple times within a single extension's options file, in which
1934 # case we assume the builder needed to search it again later in the
1936 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
1937 $libseen{$_}++; $seenthis{$_}++;
1943 # Get full name of extension for ExtUtils::Miniperl
1945 open OPT,$extopt or die $!;
1947 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
1950 push @staticpkgs,$pkg;
1954 # Place all of the external libraries after all of the Perl extension
1955 # libraries in the final link, in order to maximize the opportunity
1956 # for XS code from multiple extensions to resolve symbols against the
1957 # same external library while only including that library once.
1958 push @optlibs, @$extra;
1960 $target = "Perl$Config{'exe_ext'}" unless $target;
1962 ($shrtarget,$targdir) = fileparse($target);
1963 $shrtarget =~ s/^([^.]*)/$1Shr/;
1964 $shrtarget = $targdir . $shrtarget;
1965 $target = "Perlshr.$Config{'dlext'}" unless $target;
1966 $tmpdir = "[]" unless $tmpdir;
1967 $tmpdir = $self->fixpath($tmpdir,1);
1968 if (@optlibs) { $extralist = join(' ',@optlibs); }
1969 else { $extralist = ''; }
1970 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
1971 # that's what we're building here).
1972 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
1974 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
1975 print STDOUT "Warning: $libperl not found\n";
1980 if (defined $self->{PERL_SRC}) {
1981 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
1982 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
1984 print STDOUT "Warning: $libperl not found
1985 If you're going to build a static perl binary, make sure perl is installed
1986 otherwise ignore this warning\n";
1989 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
1992 # Fill in the target you want to produce if it\'s not perl
1993 MAP_TARGET = ',$self->fixpath($target,0),'
1994 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
1995 MAP_LINKCMD = $linkcmd
1996 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
1997 MAP_EXTRA = $extralist
1998 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2002 push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2003 foreach (@optlibs) {
2004 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2006 push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
2007 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2010 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2011 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2012 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
2013 $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2014 $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
2015 $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2016 $(NOECHO) $(ECHO) "To remove the intermediate files, say
2017 $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
2019 push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
2020 push @m, "# More from the 255-char line length limit\n";
2021 foreach (@staticpkgs) {
2022 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
2025 push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
2026 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
2027 $(NOECHO) $(RM_F) %sWritemain.tmp
2031 # Still more from the 255-char line length limit
2033 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
2034 $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
2035 $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
2036 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2037 $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
2038 $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
2039 $(NOECHO) $(RM_F) .MM_tmp
2043 inst_perl : pure_inst_perl doc_inst_perl
2046 pure_inst_perl : \$(MAP_TARGET)
2047 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2048 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2054 \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
2055 \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
2061 # --- Output postprocessing section ---
2063 =item nicetext (override)
2065 Insure that colons marking targets are preceded by space, in order
2066 to distinguish the target delimiter from a colon appearing as
2072 my($self,$text) = @_;
2073 return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
2074 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
2078 =item prefixify (override)
2080 prefixifying on VMS is simple. Each should simply be:
2082 perl_root:[some.dir]
2084 which can just be converted to:
2086 volume:[your.prefix.some.dir]
2088 otherwise you get the default layout.
2090 In effect, your search prefix is ignored and $Config{vms_prefix} is
2096 my($self, $var, $sprefix, $rprefix, $default) = @_;
2098 # Translate $(PERLPREFIX) to a real path.
2099 $rprefix = $self->eliminate_macros($rprefix);
2100 $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
2101 $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
2103 $default = VMS::Filespec::vmsify($default)
2104 unless $default =~ /\[.*\]/;
2106 (my $var_no_install = $var) =~ s/^install//;
2107 my $path = $self->{uc $var} ||
2108 $ExtUtils::MM_Unix::Config_Override{lc $var} ||
2109 $Config{lc $var} || $Config{lc $var_no_install};
2112 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
2113 $path = $self->_prefixify_default($rprefix, $default);
2115 elsif( $sprefix eq $rprefix ) {
2116 print STDERR " no new prefix.\n" if $Verbose >= 2;
2120 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
2121 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
2123 my($path_vol, $path_dirs) = $self->splitpath( $path );
2124 if( $path_vol eq $Config{vms_prefix}.':' ) {
2125 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
2127 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
2128 $path = $self->_catprefix($rprefix, $path_dirs);
2131 $path = $self->_prefixify_default($rprefix, $default);
2135 print " now $path\n" if $Verbose >= 2;
2136 return $self->{uc $var} = $path;
2140 sub _prefixify_default {
2141 my($self, $rprefix, $default) = @_;
2143 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
2146 print STDERR "No default!\n" if $Verbose >= 1;
2150 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
2154 return $self->_catprefix($rprefix, $default);
2158 my($self, $rprefix, $default) = @_;
2160 my($rvol, $rdirs) = $self->splitpath($rprefix);
2162 return $self->catpath($rvol,
2163 $self->catdir($rdirs, $default),
2168 return $self->catdir($rdirs, $default);
2178 my($self, $cmd, $switches) = @_;
2179 $switches = [] unless defined $switches;
2181 # Strip leading and trailing newlines
2185 $cmd = $self->quote_literal($cmd);
2186 $cmd = $self->escape_newlines($cmd);
2188 # Switches must be quoted else they will be lowercased.
2189 $switches = join ' ', map { qq{"$_"} } @$switches;
2191 return qq{\$(PERLRUN) $switches -e $cmd};
2197 perl trips up on "<foo>" thinking it's an input redirect. So we use the
2198 native Write command instead. Besides, its faster.
2203 my($self, $text, $file, $appending) = @_;
2206 my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
2208 my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
2209 push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) }
2211 push @cmds, '$(NOECHO) Close MMECHOFILE';
2221 my($self, $text) = @_;
2223 # I believe this is all we should need.
2229 =item escape_newlines
2233 sub escape_newlines {
2234 my($self, $text) = @_;
2236 $text =~ s{\n}{-\n}g;
2250 return $self->{_MAX_EXEC_LEN} ||= 256;
2253 =item init_linker (o)
2259 $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
2261 my $shr = $Config{dbgprefix} . 'PERLSHR';
2262 if ($self->{PERL_SRC}) {
2263 $self->{PERL_ARCHIVE} ||=
2264 $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
2267 $self->{PERL_ARCHIVE} ||=
2268 $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
2271 $self->{PERL_ARCHIVE_AFTER} ||= '';
2274 =item eliminate_macros
2276 Expands MM[KS]/Make macros in a text string, using the contents of
2277 identically named elements of C<%$self>, and returns the result
2278 as a file specification in Unix syntax.
2280 NOTE: This is the canonical version of the method. The version in
2281 File::Spec::VMS is deprecated.
2285 sub eliminate_macros {
2286 my($self,$path) = @_;
2287 return '' unless $path;
2288 $self = {} unless ref $self;
2290 if ($path =~ /\s/) {
2291 return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
2294 my($npath) = unixify($path);
2295 # sometimes unixify will return a string with an off-by-one trailing null
2299 my($head,$macro,$tail);
2301 # perform m##g in scalar context so it acts as an iterator
2302 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
2303 if (defined $self->{$2}) {
2304 ($head,$macro,$tail) = ($1,$2,$3);
2305 if (ref $self->{$macro}) {
2306 if (ref $self->{$macro} eq 'ARRAY') {
2307 $macro = join ' ', @{$self->{$macro}};
2310 print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
2311 "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
2312 $macro = "\cB$macro\cB";
2316 else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
2317 $npath = "$head$macro$tail";
2320 if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
2326 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
2327 in any directory specification, in order to avoid juxtaposing two
2328 VMS-syntax directories when MM[SK] is run. Also expands expressions which
2329 are all macro, so that we can tell how long the expansion is, and avoid
2330 overrunning DCL's command buffer when MM[KS] is running.
2332 If optional second argument has a TRUE value, then the return string is
2333 a VMS-syntax directory specification, if it is FALSE, the return string
2334 is a VMS-syntax file specification, and if it is not specified, fixpath()
2335 checks to see whether it matches the name of a directory in the current
2336 default directory, and returns a directory or file specification accordingly.
2338 NOTE: This is the canonical version of the method. The version in
2339 File::Spec::VMS is deprecated.
2344 my($self,$path,$force_path) = @_;
2345 return '' unless $path;
2346 $self = bless {} unless ref $self;
2347 my($fixedpath,$prefix,$name);
2349 if ($path =~ /\s/) {
2351 map { $self->fixpath($_,$force_path) }
2355 if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
2356 if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
2357 $fixedpath = vmspath($self->eliminate_macros($path));
2360 $fixedpath = vmsify($self->eliminate_macros($path));
2363 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
2364 my($vmspre) = $self->eliminate_macros("\$($prefix)");
2365 # is it a dir or just a name?
2366 $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
2367 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
2368 $fixedpath = vmspath($fixedpath) if $force_path;
2372 $fixedpath = vmspath($fixedpath) if $force_path;
2374 # No hints, so we try to guess
2375 if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
2376 $fixedpath = vmspath($fixedpath) if -d $fixedpath;
2379 # Trim off root dirname if it's had other dirs inserted in front of it.
2380 $fixedpath =~ s/\.000000([\]>])/$1/;
2381 # Special case for VMS absolute directory specs: these will have had device
2382 # prepended during trip through Unix syntax in eliminate_macros(), since
2383 # Unix syntax has no way to express "absolute from the top of this device's
2385 if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }