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.101 $ =~ /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);
305 =item init_DIRFILESEP
307 No seperator between a directory path and a filename on VMS.
311 sub init_DIRFILESEP {
314 $self->{DIRFILESEP} = '';
319 =item init_main (override)
327 $self->SUPER::init_main;
329 $self->{DEFINE} ||= '';
330 if ($self->{DEFINE} ne '') {
331 my(@terms) = split(/\s+/,$self->{DEFINE});
333 foreach my $def (@terms) {
336 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
337 $targ = \@udefs if $1 eq 'U';
338 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
339 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
342 $def =~ s/"/""/g; # Protect existing " from DCL
343 $def = qq["$def"]; # and quote to prevent parsing of =
348 $self->{DEFINE} = '';
350 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
353 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
358 =item init_others (override)
360 Provide VMS-specific forms of various utility commands, then hand
361 off to the default MM_Unix method.
363 DEV_NULL should probably be overriden with something.
365 Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
366 one second later than source file, since MMK interprets precisely
367 equal revision dates for a source and target file as a sign that the
368 target needs to be updated.
375 $self->{NOOP} = 'Continue';
376 $self->{NOECHO} ||= '@ ';
378 $self->{MAKEFILE} ||= 'Descrip.MMS';
379 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
380 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
381 $self->{MAKEFILE_OLD} ||= '$(FIRST_MAKEFILE)_old';
383 $self->{ECHO} ||= '$(PERLRUN) -le "print qq{@ARGV}"';
384 $self->{ECHO_N} ||= '$(PERLRUN) -e "print qq{@ARGV}"';
385 $self->{TOUCH} ||= '$(PERLRUN) "-MExtUtils::Command" -e touch';
386 $self->{CHMOD} ||= '$(PERLRUN) "-MExtUtils::Command" -e chmod';
387 $self->{RM_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_f';
388 $self->{RM_RF} ||= '$(PERLRUN) "-MExtUtils::Command" -e rm_rf';
389 $self->{TEST_F} ||= '$(PERLRUN) "-MExtUtils::Command" -e test_f';
390 $self->{EQUALIZE_TIMESTAMP} ||= '$(PERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
392 $self->{MOD_INSTALL} ||=
393 $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
394 install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)');
397 $self->{SHELL} ||= 'Posix';
399 $self->{CP} = 'Copy/NoConfirm';
400 $self->{MV} = 'Rename/NoConfirm';
401 $self->{UMASK_NULL} = '! ';
403 $self->SUPER::init_others;
405 if ($self->{OBJECT} =~ /\s/) {
406 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
407 $self->{OBJECT} = $self->wraplist(
408 map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
412 $self->{LDFROM} = $self->wraplist(
413 map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
418 =item init_platform (override)
420 Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
422 MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
430 $self->{MM_VMS_REVISION} = $Revision;
431 $self->{MM_VMS_VERSION} = $VERSION;
432 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
433 if $self->{PERL_SRC};
437 =item platform_constants
441 sub platform_constants {
445 foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
447 next unless defined $self->{$macro};
448 $make_frag .= "$macro = $self->{$macro}\n";
455 =item init_VERSION (override)
457 Override the *DEFINE_VERSION macros with VMS semantics. Translate the
458 MAKEMAKER filepath to VMS style.
465 $self->SUPER::init_VERSION;
467 $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
468 $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
469 $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
473 =item constants (override)
475 Fixes up numerous file and directory macros to insure VMS syntax
476 regardless of input syntax. Also makes lists of files
484 # Be kind about case for pollution
485 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
487 # Cleanup paths for directories in MMS macros.
488 foreach my $macro ( qw [
489 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
490 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
491 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
492 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
493 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
494 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
495 PERL_LIB PERL_ARCHLIB
496 PERL_INC PERL_SRC ] )
498 next unless defined $self->{$macro};
499 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
500 $self->{$macro} = $self->fixpath($self->{$macro},1);
503 # Cleanup paths for files in MMS macros.
504 foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
505 MAKE_APERL_FILE MYEXTLIB] )
507 next unless defined $self->{$macro};
508 $self->{$macro} = $self->fixpath($self->{$macro},0);
511 # Fixup files for MMS macros
512 # XXX is this list complete?
514 FULLEXT VERSION_FROM OBJECT LDFROM
516 next unless defined $self->{$macro};
517 $self->{$macro} = $self->fixpath($self->{$macro},0);
521 for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
522 # Where is the space coming from? --jhi
523 next unless $self ne " " && defined $self->{$macro};
525 for my $key (keys %{$self->{$macro}}) {
526 $tmp{$self->fixpath($key,0)} =
527 $self->fixpath($self->{$macro}{$key},0);
529 $self->{$macro} = \%tmp;
532 for my $macro (qw/ C O_FILES H /) {
533 next unless defined $self->{$macro};
535 for my $val (@{$self->{$macro}}) {
536 push(@tmp,$self->fixpath($val,0));
538 $self->{$macro} = \@tmp;
541 return $self->SUPER::constants;
545 =item special_targets
547 Clear the default .SUFFIXES and put in our own list.
551 sub special_targets {
554 my $make_frag .= <<'MAKE_FRAG';
556 .SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
563 =item cflags (override)
565 Bypass shell script and produce qualifiers for CC directly (but warn
566 user if a shell script for this extension exists). Fold multiple
567 /Defines into one, since some C compilers pay attention to only one
568 instance of this qualifier on the command line.
573 my($self,$libperl) = @_;
574 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
575 my($definestr,$undefstr,$flagoptstr) = ('','','');
576 my($incstr) = '/Include=($(PERL_INC)';
579 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
580 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
581 " required to modify CC command for $self->{'BASEEXT'}\n"
584 if ($quals =~ / -[DIUOg]/) {
585 while ($quals =~ / -([Og])(\d*)\b/) {
586 my($type,$lvl) = ($1,$2);
587 $quals =~ s/ -$type$lvl\b\s*//;
588 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
589 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
591 while ($quals =~ / -([DIU])(\S+)/) {
592 my($type,$def) = ($1,$2);
593 $quals =~ s/ -$type$def\s*//;
595 if ($type eq 'D') { $definestr .= qq["$def",]; }
596 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
597 else { $undefstr .= qq["$def",]; }
600 if (length $quals and $quals !~ m!/!) {
601 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
604 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
605 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
606 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
607 # Deal with $self->{DEFINE} here since some C compilers pay attention
608 # to only one /Define clause on command line, so we have to
609 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
610 # ($self->{DEFINE} has already been VMSified in constants() above)
611 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
612 for my $type (qw(Def Undef)) {
614 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
616 $term =~ s:^\((.+)\)$:$1:;
619 if ($type eq 'Def') {
620 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
623 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
624 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
628 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
630 # Likewise with $self->{INC} and /Include
631 if ($self->{'INC'}) {
632 my(@includes) = split(/\s+/,$self->{INC});
633 foreach (@includes) {
635 $incstr .= ','.$self->fixpath($_,1);
638 $quals .= "$incstr)";
639 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
640 $self->{CCFLAGS} = $quals;
642 $self->{PERLTYPE} ||= '';
644 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
645 if ($self->{OPTIMIZE} !~ m!/!) {
646 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
647 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
648 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
651 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
652 $self->{OPTIMIZE} = '/Optimize';
656 return $self->{CFLAGS} = qq{
657 CCFLAGS = $self->{CCFLAGS}
658 OPTIMIZE = $self->{OPTIMIZE}
659 PERLTYPE = $self->{PERLTYPE}
663 =item const_cccmd (override)
665 Adds directives to point C preprocessor to the right place when
666 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
667 command line a bit differently than MM_Unix method.
672 my($self,$libperl) = @_;
675 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
676 return '' unless $self->needs_linking();
677 if ($Config{'vms_cc_type'} eq 'gcc') {
680 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
682 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
685 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
686 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
691 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
692 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
693 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
696 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
698 $self->{CONST_CCCMD} = join('',@m);
702 =item tool_sxubpp (override)
704 Use VMS-style quoting on xsubpp command line.
710 return '' unless $self->needs_linking;
713 foreach my $dir (@INC) {
714 $xsdir = $self->catdir($dir, 'ExtUtils');
715 if( -r $self->catfile($xsdir, "xsubpp") ) {
720 my $tmdir = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
721 my(@tmdeps) = $self->catfile($tmdir,'typemap');
722 if( $self->{TYPEMAPS} ){
724 foreach $typemap (@{$self->{TYPEMAPS}}){
726 warn "Typemap $typemap not found.\n";
729 push(@tmdeps, $self->fixpath($typemap,0));
733 push(@tmdeps, "typemap") if -f "typemap";
734 my(@tmargs) = map("-typemap $_", @tmdeps);
735 if( exists $self->{XSOPT} ){
736 unshift( @tmargs, $self->{XSOPT} );
739 if ($Config{'ldflags'} &&
740 $Config{'ldflags'} =~ m!/Debug!i &&
741 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
742 unshift(@tmargs,'-nolinenumbers');
744 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
746 # What are the correct thresholds for version 1 && 2 Paul?
747 if ( $xsubpp_version > 1.923 ){
748 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
750 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
751 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
752 Your version of xsubpp is $xsubpp_version and cannot handle this.
753 Please upgrade to a more recent version of xsubpp.
756 $self->{XSPROTOARG} = "";
762 XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
763 XSPROTOARG = $self->{XSPROTOARG}
769 =item xsubpp_version (override)
771 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
772 rather than Unix rules ($sts == 0 ==E<gt> good).
778 my($self,$xsubpp) = @_;
780 return '' unless $self->needs_linking;
782 # try to figure out the version number of the xsubpp on the system
784 # first try the -v flag, introduced in 1.921 & 2.000a2
786 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
787 print "Running: $command\n" if $Verbose;
788 $version = `$command` ;
790 use ExtUtils::MakeMaker::vmsish 'status';
791 warn "Running '$command' exits with status $?";
795 return $1 if $version =~ /^xsubpp version (.*)/ ;
797 # nope, then try something else
800 my ($file) = 'temp' ;
801 $counter++ while -e "$file$counter"; # don't overwrite anything
805 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
807 MODULE = fred PACKAGE = fred
816 $command = "$self->{PERLRUN} $xsubpp $file";
817 print "Running: $command\n" if $Verbose;
818 my $text = `$command` ;
820 use ExtUtils::MakeMaker::vmsish 'status';
821 warn "Running '$command' exits with status $?";
825 # gets 1.2 -> 1.92 and 2.000a1
826 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
828 # it is either 1.0 or 1.1
829 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
831 # none of the above, so 1.0
835 =item tools_other (override)
837 Throw in some dubious extra macros for Makefile args.
839 Also keep around the old $(SAY) macro in case somebody's using it.
846 # XXX Are these necessary? Does anyone override them? They're longer
847 # than just typing the literal string.
848 my $extra_tools = <<'EXTRA_TOOLS';
850 # Assumes $(MMS) invokes MMS or MMK
851 # (It is assumed in some cases later that the default makefile name
852 # (Descrip.MMS for MM[SK]) is used.)
853 USEMAKEFILE = /Descrip=
857 # Just in case anyone is using the old macro.
862 return $self->SUPER::tools_other . $extra_tools;
865 =item init_dist (override)
867 VMSish defaults for some values.
869 macro description default
871 ZIPFLAGS flags to pass to ZIP -Vu
873 COMPRESS compression command to gzip
875 SUFFIX suffix to put on -gz
878 SHAR shar command to use vms_share
880 DIST_DEFAULT default target to use to tardist
881 create a distribution
883 DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
890 $self->{ZIPFLAGS} ||= '-Vu';
891 $self->{COMPRESS} ||= 'gzip';
892 $self->{SUFFIX} ||= '-gz';
893 $self->{SHAR} ||= 'vms_share';
894 $self->{DIST_DEFAULT} ||= 'zipdist';
896 $self->SUPER::init_dist;
898 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
903 Use VMS syntax on command line. In particular, $(DEFINE) and
904 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
910 return '' unless $self->needs_linking();
913 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
916 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
919 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
924 =item xs_c (override)
932 return '' unless $self->needs_linking();
935 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
939 =item xs_o (override)
941 Use MM[SK] macros, and VMS command line for C compiler.
945 sub xs_o { # many makes are too dumb to use xs_c then c_o
947 return '' unless $self->needs_linking();
950 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
951 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
956 =item dlsyms (override)
958 Create VMS linker options files specifying universal symbols for this
959 extension's shareable image, and listing other shareable images or
960 libraries to which it should be linked.
965 my($self,%attribs) = @_;
967 return '' unless $self->needs_linking();
969 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
970 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
971 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
974 unless ($self->{SKIPHASH}{'dynamic'}) {
976 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
982 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
984 ') unless $self->{SKIPHASH}{'static'};
987 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
988 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
990 $(BASEEXT).opt : Makefile.PL
991 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
992 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
993 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
994 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
996 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
997 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
998 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
999 push @m, ($Config{d_vms_case_sensitive_symbols}
1000 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1002 else { # We don't have a "main" object file, so pull 'em all in
1003 # Upcase module names if linker is being case-sensitive
1004 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1005 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1006 s[\$\(\w+_EXT\)][]; # even as a macro
1007 s/.*[:>\/\]]//; # Trim off dir spec
1008 $upcase ? uc($_) : $_;
1009 } split ' ', $self->eliminate_macros($self->{OBJECT});
1010 my($tmp,@lines,$elt) = '';
1011 $tmp = shift @omods;
1012 foreach $elt (@omods) {
1014 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1017 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1019 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1021 if (length $self->{LDLOADLIBS}) {
1022 my($lib); my($line) = '';
1023 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1024 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1025 if (length($line) + length($lib) > 160) {
1026 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1027 $line = $lib . '\n';
1029 else { $line .= $lib . '\n'; }
1031 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1038 =item dynamic_lib (override)
1040 Use VMS Link command.
1045 my($self, %attribs) = @_;
1046 return '' unless $self->needs_linking(); #might be because of a subdir
1048 return '' unless $self->has_link_code();
1050 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1051 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1052 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1056 OTHERLDFLAGS = $otherldflags
1057 INST_DYNAMIC_DEP = $inst_dynamic_dep
1061 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1062 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1063 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1064 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1067 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1071 =item dynamic_bs (override)
1073 Use VMS-style quoting on Mkbootstrap command line.
1078 my($self, %attribs) = @_;
1081 ' unless $self->has_link_code();
1083 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1085 # As MakeMaker mkbootstrap might not write a file (if none is required)
1086 # we use touch to prevent make continually trying to remake it.
1087 # The DynaLoader only reads a non-empty file.
1088 $(BOOTSTRAP) : $(FIRST_MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1089 $(NOECHO) $(ECHO) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1090 $(NOECHO) $(PERLRUN) -
1091 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1092 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1094 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1095 $(NOECHO) $(RM_RF) $(INST_BOOT)
1096 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1100 =item static_lib (override)
1102 Use VMS commands to manipulate object library.
1108 return '' unless $self->needs_linking();
1113 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1117 # Rely on suffix rule for update action
1118 $(OBJECT) : $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
1120 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1122 # If this extension has its own library (eg SDBM_File)
1123 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1124 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1126 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1128 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1129 # 'cause it's a library and you can't stick them in other libraries.
1130 # In that case, we use $OBJECT instead and hope for the best
1131 if ($self->{MYEXTLIB}) {
1132 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1134 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1137 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1138 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1139 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1141 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1146 =item processPL (override)
1148 Use VMS-style quoting on command line.
1154 return "" unless $self->{PL_FILES};
1156 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1157 my $list = ref($self->{PL_FILES}->{$plfile})
1158 ? $self->{PL_FILES}->{$plfile}
1159 : [$self->{PL_FILES}->{$plfile}];
1160 foreach my $target (@$list) {
1161 my $vmsplfile = vmsify($plfile);
1162 my $vmsfile = vmsify($target);
1167 $vmsfile :: $vmsplfile
1168 ",' $(PERLRUNINST) '," $vmsplfile $vmsfile
1175 =item installbin (override)
1177 Stay under DCL's 255 character command line limit once again by
1178 splitting potentially long list of files across multiple lines
1179 in C<realclean> target.
1185 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1186 return '' unless @{$self->{EXE_FILES}};
1187 my(@m, $from, $to, %fromto, @to);
1188 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1189 for $from (@exefiles) {
1190 my($path) = '$(INST_SCRIPT)' . basename($from);
1191 local($_) = $path; # backward compatibility
1192 $to = $self->libscan($path);
1193 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1194 $fromto{$from} = vmsify($to);
1196 @to = values %fromto;
1198 EXE_FILES = @exefiles
1208 if (length($line) + length($to) > 80) {
1209 push @m, "\t\$(RM_F) $line\n";
1212 else { $line .= " $to"; }
1214 push @m, "\t\$(RM_F) $line\n\n" if $line;
1216 while (($from,$to) = each %fromto) {
1217 last unless defined $from;
1219 if ($to =~ m#[/>:\]]#) {
1220 $todir = dirname($to);
1223 ($todir = $to) =~ s/[^\)]+$//;
1225 $todir = $self->fixpath($todir,1);
1227 $to : $from \$(FIRST_MAKEFILE) ${todir}\$(DIRFILESEP).exists
1230 ", $self->dir_target($todir);
1235 =item subdir_x (override)
1237 Use VMS commands to change default directory.
1242 my($self, $subdir) = @_;
1244 $subdir = $self->fixpath($subdir,1);
1248 olddef = F$Environment("Default")
1249 Set Default ',$subdir,'
1250 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1251 Set Default \'olddef\'
1256 =item clean (override)
1258 Split potentially long list of files across multiple commands (in
1259 order to stay under the magic command line limit). Also use MM[SK]
1260 commands for handling subdirectories.
1265 my($self, %attribs) = @_;
1268 # Delete temporary files but do not touch installed files. We don\'t delete
1269 # the Descrip.MMS here so that a later make realclean still has it to use.
1270 clean :: clean_subdirs
1272 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1275 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1276 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1277 # a list or a macro that expands to a list.
1278 if ($attribs{FILES}) {
1279 my @filelist = ref $attribs{FILES} eq 'ARRAY'
1280 ? @{$attribs{FILES}}
1281 : split /\s+/, $attribs{FILES};
1283 foreach my $word (@filelist) {
1284 if ($word =~ m#^\$\((.*)\)$# and
1285 ref $self->{$1} eq 'ARRAY')
1287 push(@otherfiles, @{$self->{$1}});
1289 else { push(@otherfiles, $word); }
1292 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld
1293 perlmain.c pm_to_blib pm_to_blib.ts ]);
1294 push(@otherfiles, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1296 # Occasionally files are repeated several times from different sources
1297 { my(%of) = map { ($_ => 1) } @otherfiles; @otherfiles = keys %of; }
1300 foreach my $file (@otherfiles) {
1301 $file = $self->fixpath($file);
1302 if (length($line) + length($file) > 80) {
1303 push @m, "\t\$(RM_RF) $line\n";
1306 else { $line .= " $file"; }
1308 push @m, "\t\$(RM_RF) $line\n" if $line;
1309 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1314 =item clean_subdirs_target
1316 my $make_frag = $MM->clean_subdirs_target;
1318 VMS semantics for changing directories and rerunning make very different.
1322 sub clean_subdirs_target {
1325 # No subdirectories, no cleaning.
1326 return <<'NOOP_FRAG' unless @{$self->{DIR}};
1332 my $clean = "clean_subdirs :\n";
1334 foreach my $dir (@{$self->{DIR}}) { # clean subdirectories first
1335 $dir = $self->fixpath($dir,1);
1337 $clean .= sprintf <<'MAKE_FRAG', $dir, $dir;
1338 If F$Search("%s$(FIRST_MAKEFILE)").nes."" Then $(PERLRUN) -e "chdir '%s'; print `$(MMS)$(MMSQUALIFIERS) clean`;"
1346 =item realclean (override)
1348 Guess what we're working around? Also, use MM[SK] for subdirectories.
1353 my($self, %attribs) = @_;
1356 # Delete temporary files (via clean) and also delete installed files
1359 foreach(@{$self->{DIR}}){
1360 my($vmsdir) = $self->fixpath($_,1);
1361 push(@m, ' If F$Search("'."$vmsdir".'$(FIRST_MAKEFILE)").nes."" Then \\',"\n\t",
1362 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1364 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1365 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
1366 # We can't expand several of the MMS macros here, since they don't have
1367 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1368 # combination of macros). In order to stay below DCL's 255 char limit,
1369 # we put only 2 on a line.
1371 my(@files) = qw{ $(FIRST_MAKEFILE) $(MAKEFILE_OLD) };
1372 if ($self->has_link_code) {
1373 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1376 # Occasionally files are repeated several times from different sources
1377 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1380 foreach $file (@files) {
1381 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1382 push @m, "\t\$(RM_F) $line\n";
1386 else { $line .= " $file"; }
1388 push @m, "\t\$(RM_F) $line\n" if $line;
1389 if ($attribs{FILES}) {
1390 my($word,$key,@filist,@allfiles);
1391 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1392 else { @filist = split /\s+/, $attribs{FILES}; }
1393 foreach $word (@filist) {
1394 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1395 push(@allfiles, @{$self->{$key}});
1397 else { push(@allfiles, $word); }
1400 # Occasionally files are repeated several times from different sources
1401 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1402 foreach $file (@allfiles) {
1403 $file = $self->fixpath($file);
1404 if (length($line) + length($file) > 80) {
1405 push @m, "\t\$(RM_RF) $line\n";
1408 else { $line .= " $file"; }
1410 push @m, "\t\$(RM_RF) $line\n" if $line;
1412 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1416 =item zipfile_target (o)
1418 =item tarfile_target (o)
1420 =item shdist_target (o)
1422 Syntax for invoking shar, tar and zip differs from that for Unix.
1426 sub zipfile_target {
1429 return <<'MAKE_FRAG';
1430 $(DISTVNAME).zip : distdir
1432 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1433 $(RM_RF) $(DISTVNAME)
1438 sub tarfile_target {
1441 return <<'MAKE_FRAG';
1442 $(DISTVNAME).tar$(SUFFIX) : distdir
1445 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1446 $(RM_RF) $(DISTVNAME)
1447 $(COMPRESS) $(DISTVNAME).tar
1455 return <<'MAKE_FRAG';
1458 $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
1459 $(RM_RF) $(DISTVNAME)
1464 =item dist_test (override)
1466 Use VMS commands to change default directory, and use VMS-style
1467 quoting on command line.
1475 startdir = F$Environment("Default")
1476 Set Default [.$(DISTVNAME)]
1477 $(ABSPERLRUN) Makefile.PL
1478 $(MMS)$(MMSQUALIFIERS)
1479 $(MMS)$(MMSQUALIFIERS) test
1480 Set Default 'startdir'
1484 # --- Test and Installation Sections ---
1486 =item install (override)
1488 Work around DCL's 255 character limit several times,and use
1489 VMS-style command line quoting in a few cases.
1494 my($self, %attribs) = @_;
1497 if ($self->{EXE_FILES}) {
1498 my($line,$file) = ('','');
1499 foreach $file (@{$self->{EXE_FILES}}) {
1501 if (length($line) > 128) {
1502 push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]);
1506 push(@exe_files,qq[\t\$(NOECHO) \$(ECHO) "$line" >>.MM_tmp\n]) if $line;
1510 install :: all pure_install doc_install
1513 install_perl :: all pure_perl_install doc_perl_install
1516 install_site :: all pure_site_install doc_site_install
1519 pure_install :: pure_$(INSTALLDIRS)_install
1522 doc_install :: doc_$(INSTALLDIRS)_install
1525 pure__install : pure_site_install
1526 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1528 doc__install : doc_site_install
1529 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1531 # This hack brought to you by DCL's 255-character command line limit
1532 pure_perl_install ::
1533 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1534 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1535 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(INSTALLPRIVLIB) " >>.MM_tmp
1536 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(INSTALLARCHLIB) " >>.MM_tmp
1537 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(INSTALLBIN) " >>.MM_tmp
1538 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp
1539 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(INSTALLMAN1DIR) " >>.MM_tmp
1540 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(INSTALLMAN3DIR) " >>.MM_tmp
1541 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1542 $(NOECHO) $(RM_F) .MM_tmp
1543 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1546 pure_site_install ::
1547 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1548 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1549 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(INSTALLSITELIB) " >>.MM_tmp
1550 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(INSTALLSITEARCH) " >>.MM_tmp
1551 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(INSTALLSITEBIN) " >>.MM_tmp
1552 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp
1553 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) " >>.MM_tmp
1554 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) " >>.MM_tmp
1555 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1556 $(NOECHO) $(RM_F) .MM_tmp
1557 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1559 pure_vendor_install ::
1560 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1561 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1562 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(INSTALLVENDORLIB) " >>.MM_tmp
1563 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(INSTALLVENDORARCH) " >>.MM_tmp
1564 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(INSTALLVENDORBIN) " >>.MM_tmp
1565 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(INSTALLSCRIPT) " >>.MM_tmp
1566 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) " >>.MM_tmp
1567 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) " >>.MM_tmp
1568 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1569 $(NOECHO) $(RM_F) .MM_tmp
1573 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLARCHLIB}, 'perllocal.pod').q["
1574 $(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
1575 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
1576 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1578 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1579 $(NOECHO) $(RM_F) .MM_tmp
1583 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLARCHLIB}, 'perllocal.pod').q["
1584 $(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
1585 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
1586 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1588 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1589 $(NOECHO) $(RM_F) .MM_tmp
1591 doc_vendor_install ::
1592 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{INSTALLARCHLIB}, 'perllocal.pod').q["
1593 $(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
1594 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
1595 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1597 q[ $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1598 $(NOECHO) $(RM_F) .MM_tmp
1603 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1606 uninstall_from_perldirs ::
1607 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1608 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1609 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1610 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1612 uninstall_from_sitedirs ::
1613 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1614 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1615 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1616 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1622 =item perldepend (override)
1624 Use VMS-style syntax for files; it's cheaper to just do it directly here
1625 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1626 we have to rebuild Config.pm, use MM[SK] to do it.
1635 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1636 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1637 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1638 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
1639 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1640 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1641 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1642 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1643 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
1644 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
1645 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1646 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1647 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1648 $(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h
1649 $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h
1651 ' if $self->{OBJECT};
1653 if ($self->{PERL_SRC}) {
1655 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
1656 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1657 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1658 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1659 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1660 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1661 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1663 # Check for unpropagated config.sh changes. Should never happen.
1664 # We do NOT just update config.h because that is not sufficient.
1665 # An out of date config.h is not fatal but complains loudly!
1666 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1669 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1670 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1671 olddef = F$Environment("Default")
1672 Set Default $(PERL_SRC)
1673 $(MMS)],$mmsquals,);
1674 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1675 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1676 $target =~ s/\Q$prefix/[/;
1677 push(@m," $target");
1679 else { push(@m,' $(MMS$TARGET)'); }
1681 Set Default 'olddef'
1685 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1691 =item makefile (override)
1693 Use VMS commands and quoting.
1700 # We do not know what target was originally specified so we
1701 # must force a manual rerun to be sure. But as it should only
1702 # happen very rarely it is not a significant problem.
1704 $(OBJECT) : $(FIRST_MAKEFILE)
1705 ] if $self->{OBJECT};
1708 # We take a very conservative approach here, but it's worth it.
1709 # We move $(FIRST_MAKEFILE) to $(MAKEFILE_OLD) here to avoid gnu make looping.
1710 $(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
1711 $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1712 $(NOECHO) $(ECHO) "Cleaning current config before rebuilding $(FIRST_MAKEFILE) ..."
1713 - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
1714 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE_OLD) clean
1715 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1716 $(NOECHO) $(ECHO) "$(FIRST_MAKEFILE) has been rebuilt."
1717 $(NOECHO) $(ECHO) "Please run $(MMS) to build the extension."
1723 =item find_tests (override)
1729 return -d 't' ? 't/*.t' : '';
1732 =item test (override)
1734 Use VMS commands for handling subdirectories.
1739 my($self, %attribs) = @_;
1740 my($tests) = $attribs{TESTS} || $self->find_tests;
1744 TEST_TYPE = test_\$(LINKTYPE)
1748 test :: \$(TEST_TYPE)
1751 testdb :: testdb_\$(LINKTYPE)
1755 foreach(@{$self->{DIR}}){
1756 my($vmsdir) = $self->fixpath($_,1);
1757 push(@m, ' If F$Search("',$vmsdir,'$(FIRST_MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1758 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1760 push(@m, "\t\$(NOECHO) \$(ECHO) \"No tests defined for \$(NAME) extension.\"\n")
1761 unless $tests or -f "test.pl" or @{$self->{DIR}};
1764 push(@m, "test_dynamic :: pure_all\n");
1765 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1766 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
1767 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1770 push(@m, "testdb_dynamic :: pure_all\n");
1771 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1774 # Occasionally we may face this degenerate target:
1775 push @m, "test_ : test_dynamic\n\n";
1777 if ($self->needs_linking()) {
1778 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1779 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1780 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1782 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1783 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1787 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1788 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1794 =item makeaperl (override)
1796 Undertake to build a new set of Perl images using VMS commands. Since
1797 VMS does dynamic loading, it's not necessary to statically link each
1798 extension into the Perl image, so this isn't the normal build path.
1799 Consequently, it hasn't really been tested, and may well be incomplete.
1806 my($self, %attribs) = @_;
1807 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
1808 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1811 # --- MakeMaker makeaperl section ---
1812 MAP_TARGET = $target
1814 return join '', @m if $self->{PARENT};
1816 my($dir) = join ":", @{$self->{DIR}};
1818 unless ($self->{MAKEAPERL}) {
1820 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1821 $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1822 $(NOECHO) $(PERLRUNINST) \
1823 Makefile.PL DIR=}, $dir, q{ \
1824 FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1825 MAKEAPERL=1 NORECURS=1 };
1827 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1829 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1830 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1838 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1841 # The front matter of the linkcommand...
1842 $linkcmd = join ' ', $Config{'ld'},
1843 grep($_, @Config{qw(large split ldflags ccdlflags)});
1844 $linkcmd =~ s/\s+/ /g;
1846 # Which *.olb files could we make use of...
1847 local(%olbs); # XXX can this be lexical?
1848 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1850 File::Find::find(sub {
1851 return unless m/\Q$self->{LIB_EXT}\E$/;
1852 return if m/^libperl/;
1854 if( exists $self->{INCLUDE_EXT} ){
1859 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1863 # Throw away anything not explicitly marked for inclusion.
1864 # DynaLoader is implied.
1865 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1871 return unless $found;
1873 elsif( exists $self->{EXCLUDE_EXT} ){
1877 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1881 # Throw away anything explicitly marked for exclusion
1882 foreach $excl (@{$self->{EXCLUDE_EXT}}){
1883 return if( $xx eq $excl );
1887 $olbs{$ENV{DEFAULT}} = $_;
1888 }, grep( -d $_, @{$searchdirs || []}));
1890 # We trust that what has been handed in as argument will be buildable
1891 $static = [] unless $static;
1892 @olbs{@{$static}} = (1) x @{$static};
1894 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1895 # Sort the object libraries in inverse order of
1896 # filespec length to try to insure that dependent extensions
1897 # will appear before their parents, so the linker will
1898 # search the parent library to resolve references.
1899 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
1900 # references from [.intuit.dwim]dwim.obj can be found
1901 # in [.intuit]intuit.olb).
1902 for (sort { length($a) <=> length($b) } keys %olbs) {
1903 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
1904 my($dir) = $self->fixpath($_,1);
1905 my($extralibs) = $dir . "extralibs.ld";
1906 my($extopt) = $dir . $olbs{$_};
1907 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
1908 push @optlibs, "$dir$olbs{$_}";
1909 # Get external libraries this extension will need
1910 if (-f $extralibs ) {
1912 open LIST,$extralibs or warn $!,next;
1915 # Include a library in the link only once, unless it's mentioned
1916 # multiple times within a single extension's options file, in which
1917 # case we assume the builder needed to search it again later in the
1919 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
1920 $libseen{$_}++; $seenthis{$_}++;
1926 # Get full name of extension for ExtUtils::Miniperl
1928 open OPT,$extopt or die $!;
1930 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
1933 push @staticpkgs,$pkg;
1937 # Place all of the external libraries after all of the Perl extension
1938 # libraries in the final link, in order to maximize the opportunity
1939 # for XS code from multiple extensions to resolve symbols against the
1940 # same external library while only including that library once.
1941 push @optlibs, @$extra;
1943 $target = "Perl$Config{'exe_ext'}" unless $target;
1945 ($shrtarget,$targdir) = fileparse($target);
1946 $shrtarget =~ s/^([^.]*)/$1Shr/;
1947 $shrtarget = $targdir . $shrtarget;
1948 $target = "Perlshr.$Config{'dlext'}" unless $target;
1949 $tmpdir = "[]" unless $tmpdir;
1950 $tmpdir = $self->fixpath($tmpdir,1);
1951 if (@optlibs) { $extralist = join(' ',@optlibs); }
1952 else { $extralist = ''; }
1953 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
1954 # that's what we're building here).
1955 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
1957 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
1958 print STDOUT "Warning: $libperl not found\n";
1963 if (defined $self->{PERL_SRC}) {
1964 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
1965 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
1967 print STDOUT "Warning: $libperl not found
1968 If you're going to build a static perl binary, make sure perl is installed
1969 otherwise ignore this warning\n";
1972 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
1975 # Fill in the target you want to produce if it\'s not perl
1976 MAP_TARGET = ',$self->fixpath($target,0),'
1977 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
1978 MAP_LINKCMD = $linkcmd
1979 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
1980 MAP_EXTRA = $extralist
1981 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
1985 push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
1986 foreach (@optlibs) {
1987 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
1989 push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
1990 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
1993 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
1994 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
1995 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
1996 $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
1997 $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
1998 $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
1999 $(NOECHO) $(ECHO) "To remove the intermediate files, say
2000 $(NOECHO) $(ECHO) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
2002 push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
2003 push @m, "# More from the 255-char line length limit\n";
2004 foreach (@staticpkgs) {
2005 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
2008 push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
2009 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
2010 $(NOECHO) $(RM_F) %sWritemain.tmp
2014 # Still more from the 255-char line length limit
2016 $(NOECHO) $(MKPATH) $(INSTALLARCHLIB)
2017 $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
2018 $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
2019 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2020 $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
2021 $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2022 $(NOECHO) $(RM_F) .MM_tmp
2026 inst_perl : pure_inst_perl doc_inst_perl
2029 pure_inst_perl : \$(MAP_TARGET)
2030 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2031 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2037 \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
2038 \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
2044 # --- Output postprocessing section ---
2046 =item nicetext (override)
2048 Insure that colons marking targets are preceded by space, in order
2049 to distinguish the target delimiter from a colon appearing as
2055 my($self,$text) = @_;
2056 return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
2057 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
2061 =item prefixify (override)
2063 prefixifying on VMS is simple. Each should simply be:
2065 perl_root:[some.dir]
2067 which can just be converted to:
2069 volume:[your.prefix.some.dir]
2071 otherwise you get the default layout.
2073 In effect, your search prefix is ignored and $Config{vms_prefix} is
2079 my($self, $var, $sprefix, $rprefix, $default) = @_;
2081 # Translate $(PERLPREFIX) to a real path.
2082 $rprefix = $self->eliminate_macros($rprefix);
2083 $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
2085 $default = VMS::Filespec::vmsify($default)
2086 unless $default =~ /\[.*\]/;
2088 (my $var_no_install = $var) =~ s/^install//;
2089 my $path = $self->{uc $var} || $Config{lc $var} ||
2090 $Config{lc $var_no_install};
2093 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
2094 $path = $self->_prefixify_default($rprefix, $default);
2096 elsif( $sprefix eq $rprefix ) {
2097 print STDERR " no new prefix.\n" if $Verbose >= 2;
2101 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
2102 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
2104 my($path_vol, $path_dirs) = $self->splitpath( $path );
2105 if( $path_vol eq $Config{vms_prefix}.':' ) {
2106 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
2108 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
2109 $path = $self->_catprefix($rprefix, $path_dirs);
2112 $path = $self->_prefixify_default($rprefix, $default);
2116 print " now $path\n" if $Verbose >= 2;
2117 return $self->{uc $var} = $path;
2121 sub _prefixify_default {
2122 my($self, $rprefix, $default) = @_;
2124 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
2127 print STDERR "No default!\n" if $Verbose >= 1;
2131 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
2135 return $self->_catprefix($rprefix, $default);
2139 my($self, $rprefix, $default) = @_;
2141 my($rvol, $rdirs) = $self->splitpath($rprefix);
2143 return $self->catpath($rvol,
2144 $self->catdir($rdirs, $default),
2149 return $self->catdir($rdirs, $default);
2159 my($self, $cmd, $switches) = @_;
2160 $switches = [] unless defined $switches;
2162 # Strip leading and trailing newlines
2166 $cmd = $self->quote_literal($cmd);
2167 $cmd = $self->escape_newlines($cmd);
2169 # Switches must be quoted else they will be lowercased.
2170 $switches = join ' ', map { qq{"$_"} } @$switches;
2172 return qq{\$(PERLRUN) $switches -e $cmd};
2178 perl trips up on "<foo>" thinking it's an input redirect. So we use the
2179 native Write command instead. Besides, its faster.
2184 my($self, $text, $file, $appending) = @_;
2187 my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
2189 my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
2190 push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) }
2192 push @cmds, '$(NOECHO) Close MMECHOFILE';
2202 my($self, $text) = @_;
2204 # I believe this is all we should need.
2210 =item escape_newlines
2214 sub escape_newlines {
2215 my($self, $text) = @_;
2217 $text =~ s{\n}{-\n}g;
2231 return $self->{_MAX_EXEC_LEN} ||= 256;
2234 =item init_linker (o)
2240 $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
2242 my $shr = $Config{dbgprefix} . 'PERLSHR';
2243 if ($self->{PERL_SRC}) {
2244 $self->{PERL_ARCHIVE} ||=
2245 $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
2248 $self->{PERL_ARCHIVE} ||=
2249 $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
2252 $self->{PERL_ARCHIVE_AFTER} ||= '';
2255 =item eliminate_macros
2257 Expands MM[KS]/Make macros in a text string, using the contents of
2258 identically named elements of C<%$self>, and returns the result
2259 as a file specification in Unix syntax.
2261 NOTE: This is the canonical version of the method. The version in
2262 File::Spec::VMS is deprecated.
2266 sub eliminate_macros {
2267 my($self,$path) = @_;
2268 return '' unless $path;
2269 $self = {} unless ref $self;
2271 if ($path =~ /\s/) {
2272 return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
2275 my($npath) = unixify($path);
2276 # sometimes unixify will return a string with an off-by-one trailing null
2280 my($head,$macro,$tail);
2282 # perform m##g in scalar context so it acts as an iterator
2283 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
2284 if (defined $self->{$2}) {
2285 ($head,$macro,$tail) = ($1,$2,$3);
2286 if (ref $self->{$macro}) {
2287 if (ref $self->{$macro} eq 'ARRAY') {
2288 $macro = join ' ', @{$self->{$macro}};
2291 print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
2292 "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
2293 $macro = "\cB$macro\cB";
2297 else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
2298 $npath = "$head$macro$tail";
2301 if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
2307 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
2308 in any directory specification, in order to avoid juxtaposing two
2309 VMS-syntax directories when MM[SK] is run. Also expands expressions which
2310 are all macro, so that we can tell how long the expansion is, and avoid
2311 overrunning DCL's command buffer when MM[KS] is running.
2313 If optional second argument has a TRUE value, then the return string is
2314 a VMS-syntax directory specification, if it is FALSE, the return string
2315 is a VMS-syntax file specification, and if it is not specified, fixpath()
2316 checks to see whether it matches the name of a directory in the current
2317 default directory, and returns a directory or file specification accordingly.
2319 NOTE: This is the canonical version of the method. The version in
2320 File::Spec::VMS is deprecated.
2325 my($self,$path,$force_path) = @_;
2326 return '' unless $path;
2327 $self = bless {} unless ref $self;
2328 my($fixedpath,$prefix,$name);
2330 if ($path =~ /\s/) {
2332 map { $self->fixpath($_,$force_path) }
2336 if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
2337 if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
2338 $fixedpath = vmspath($self->eliminate_macros($path));
2341 $fixedpath = vmsify($self->eliminate_macros($path));
2344 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
2345 my($vmspre) = $self->eliminate_macros("\$($prefix)");
2346 # is it a dir or just a name?
2347 $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
2348 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
2349 $fixedpath = vmspath($fixedpath) if $force_path;
2353 $fixedpath = vmspath($fixedpath) if $force_path;
2355 # No hints, so we try to guess
2356 if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
2357 $fixedpath = vmspath($fixedpath) if -d $fixedpath;
2360 # Trim off root dirname if it's had other dirs inserted in front of it.
2361 $fixedpath =~ s/\.000000([\]>])/$1/;
2362 # Special case for VMS absolute directory specs: these will have had device
2363 # prepended during trip through Unix syntax in eliminate_macros(), since
2364 # Unix syntax has no way to express "absolute from the top of this device's
2366 if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }