1 package ExtUtils::MM_VMS;
5 use ExtUtils::MakeMaker::Config;
9 # so we can compile the thing on non-VMS platforms.
11 require VMS::Filespec;
12 VMS::Filespec->import;
18 # $Revision can't be on the same line or SVN/K gets confused
23 require ExtUtils::MM_Any;
24 require ExtUtils::MM_Unix;
25 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
27 use ExtUtils::MakeMaker qw($Verbose neatvalue);
28 $Revision = $ExtUtils::MakeMaker::Revision;
33 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
37 Do not use this directly.
38 Instead, use ExtUtils::MM and it will figure out which MM_*
43 See ExtUtils::MM_Unix for a documentation of the methods provided
44 there. This package overrides the implementation of these methods, not
47 =head2 Methods always loaded
53 Converts a list into a string wrapped at approximately 80 columns.
59 my($line,$hlen) = ('',0);
61 foreach my $word (@_) {
62 # Perl bug -- seems to occasionally insert extra elements when
63 # traversing array (scalar(@array) doesn't show them, but
64 # foreach(@array) does) (5.00307)
65 next unless $word =~ /\w/;
66 $line .= ' ' if length($line);
67 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
69 $hlen += length($word) + 2;
75 # This isn't really an override. It's just here because ExtUtils::MM_VMS
76 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
77 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
78 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
79 # XXX This hackery will die soon. --Schwern
81 require ExtUtils::Liblist::Kid;
82 goto &ExtUtils::Liblist::Kid::ext;
89 Those methods which override default MM_Unix methods are marked
90 "(override)", while methods unique to MM_VMS are marked "(specific)".
91 For overridden methods, documentation is limited to an explanation
92 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
93 documentation for more details.
97 =item guess_name (override)
99 Try to determine name of extension being built. We begin with the name
100 of the current directory. Since VMS filenames are case-insensitive,
101 however, we look for a F<.pm> file whose name matches that of the current
102 directory (presumably the 'main' F<.pm> file for this extension), and try
103 to find a C<package> statement from which to obtain the Mixed::Case
110 my($defname,$defpm,@pm,%xs,$pm);
113 $defname = basename(fileify($ENV{'DEFAULT'}));
114 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
116 # Fallback in case for some reason a user has copied the files for an
117 # extension into a working directory whose name doesn't reflect the
118 # extension's name. We'll use the name of a unique .pm file, or the
119 # first .pm file with a matching .xs file.
120 if (not -e "${defpm}.pm") {
121 @pm = map { s/.pm$//; $_ } glob('*.pm');
122 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
124 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
127 $defpm = $pm, last if exists $xs{$pm};
132 if (open(PM,"${defpm}.pm")){
134 if (/^\s*package\s+([^;]+)/i) {
139 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
140 "defaulting package name to $defname\n"
145 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
146 "defaulting package name to $defname\n";
148 $defname =~ s#[\d.\-_]+$##;
152 =item find_perl (override)
154 Use VMS file specification syntax and CLI commands to find and
160 my($self, $ver, $names, $dirs, $trace) = @_;
161 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
166 if( $self->{PERL_CORE} ) {
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;
192 # Image names containing Perl version use '_' instead of '.' under VMS
193 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
195 print "Looking for perl $ver by these names:\n";
196 print "\t@snames,\n";
197 print "in these dirs:\n";
200 foreach $dir (@sdirs){
201 next unless defined $dir; # $self->{PERL_SRC} may be undefined
202 $inabs++ if $self->file_name_is_absolute($dir);
204 # We've covered relative dirs; everything else is an absolute
205 # dir (probably an installed location). First, we'll try potential
206 # command names, to see whether we can avoid a long MCR expression.
207 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
208 $inabs++; # Should happen above in next $dir, but just in case . . .
210 foreach $name (@snames){
211 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
212 else { push(@cand,$self->fixpath($name,0)); }
215 foreach $name (@cand) {
216 print "Checking $name\n" if ($trace >= 2);
217 # If it looks like a potential command, try it without the MCR
218 if ($name =~ /^[\w\-\$]+$/) {
219 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
220 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
221 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
223 $rslt = `\@temp_mmvms.com` ;
224 unlink('temp_mmvms.com');
225 if ($rslt =~ /VER_OK/) {
226 print "Using PERL=$name\n" if $trace;
230 next unless $vmsfile = $self->maybe_command($name);
231 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
232 print "Executing $vmsfile\n" if ($trace >= 2);
233 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
234 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
235 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
237 $rslt = `\@temp_mmvms.com`;
238 unlink('temp_mmvms.com');
239 if ($rslt =~ /VER_OK/) {
240 print "Using PERL=MCR $vmsfile\n" if $trace;
241 return "MCR $vmsfile";
244 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
245 0; # false and not empty
248 =item maybe_command (override)
250 Follows VMS naming conventions for executable files.
251 If the name passed in doesn't exactly match an executable file,
252 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
253 to check for DCL procedure. If this fails, checks directories in DCL$PATH
254 and finally F<Sys$System:> for an executable file having the name specified,
255 with or without the F<.Exe>-equivalent suffix.
260 my($self,$file) = @_;
261 return $file if -x $file && ! -d _;
263 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
265 if ($file !~ m![/:>\]]!) {
266 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
267 $dir = $ENV{"DCL\$PATH;$i"};
268 $dir .= ':' unless $dir =~ m%[\]:]$%;
271 push(@dirs,'Sys$System:');
272 foreach $dir (@dirs) {
273 my $sysfile = "$dir$file";
274 foreach $ext (@exts) {
275 return $file if -x "$sysfile$ext" && ! -d _;
283 =item pasthru (override)
285 VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
286 options. This is used in every invocation of make in the VMS Makefile so
287 PASTHRU should not be necessary. Using PASTHRU tends to blow commands past
288 the 256 character limit.
297 =item pm_to_blib (override)
299 VMS wants a dot in every file so we can't have one called 'pm_to_blib',
300 it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
301 you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
303 So in VMS its pm_to_blib.ts.
310 my $make = $self->SUPER::pm_to_blib;
312 $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
313 $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
315 $make = <<'MAKE' . $make;
316 # Dummy target to match Unix target name; we use pm_to_blib.ts as
317 # timestamp file to avoid repeated invocations under VMS
318 pm_to_blib : pm_to_blib.ts
327 =item perl_script (override)
329 If name passed in doesn't specify a readable file, appends F<.com> or
330 F<.pl> and tries again, since it's customary to have file types on all files
336 my($self,$file) = @_;
337 return $file if -r $file && ! -d _;
338 return "$file.com" if -r "$file.com";
339 return "$file.pl" if -r "$file.pl";
344 =item replace_manpage_separator
346 Use as separator a character which is legal in a VMS-syntax file name.
350 sub replace_manpage_separator {
352 $man = unixify($man);
359 (override) Because of the difficulty concatenating VMS filepaths we
360 must pre-expand the DEST* variables.
367 $self->SUPER::init_DEST;
369 # Expand DEST variables.
370 foreach my $var ($self->installvars) {
371 my $destvar = 'DESTINSTALL'.$var;
372 $self->{$destvar} = File::Spec->eliminate_macros($self->{$destvar});
377 =item init_DIRFILESEP
379 No seperator between a directory path and a filename on VMS.
383 sub init_DIRFILESEP {
386 $self->{DIRFILESEP} = '';
391 =item init_main (override)
399 $self->SUPER::init_main;
401 $self->{DEFINE} ||= '';
402 if ($self->{DEFINE} ne '') {
403 my(@terms) = split(/\s+/,$self->{DEFINE});
405 foreach my $def (@terms) {
408 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
409 $targ = \@udefs if $1 eq 'U';
410 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
411 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
414 $def =~ s/"/""/g; # Protect existing " from DCL
415 $def = qq["$def"]; # and quote to prevent parsing of =
420 $self->{DEFINE} = '';
422 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
425 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
430 =item init_others (override)
432 Provide VMS-specific forms of various utility commands, then hand
433 off to the default MM_Unix method.
435 DEV_NULL should probably be overriden with something.
437 Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
438 one second later than source file, since MMK interprets precisely
439 equal revision dates for a source and target file as a sign that the
440 target needs to be updated.
447 $self->{NOOP} = 'Continue';
448 $self->{NOECHO} ||= '@ ';
450 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE} || 'Descrip.MMS';
451 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
452 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
453 $self->{MAKEFILE_OLD} ||= $self->eliminate_macros('$(FIRST_MAKEFILE)_old');
455 # If an extension is not specified, then MMS/MMK assumes an
456 # an extension of .MMS. If there really is no extension,
457 # then a trailing "." needs to be appended to specify a
460 $self->{MAKEFILE} .= '.' unless $self->{MAKEFILE} =~ m/\./;
461 $self->{FIRST_MAKEFILE} .= '.' unless $self->{FIRST_MAKEFILE} =~ m/\./;
462 $self->{MAKE_APERL_FILE} .= '.' unless $self->{MAKE_APERL_FILE} =~ m/\./;
463 $self->{MAKEFILE_OLD} .= '.' unless $self->{MAKEFILE_OLD} =~ m/\./;
465 $self->{MACROSTART} ||= '/Macro=(';
466 $self->{MACROEND} ||= ')';
467 $self->{USEMAKEFILE} ||= '/Descrip=';
469 $self->{ECHO} ||= '$(ABSPERLRUN) -le "print qq{@ARGV}"';
470 $self->{ECHO_N} ||= '$(ABSPERLRUN) -e "print qq{@ARGV}"';
471 $self->{TOUCH} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e touch';
472 $self->{CHMOD} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e chmod';
473 $self->{RM_F} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_f';
474 $self->{RM_RF} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_rf';
475 $self->{TEST_F} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e test_f';
476 $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
478 $self->{MOD_INSTALL} ||=
479 $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
480 install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)');
483 $self->{SHELL} ||= 'Posix';
485 $self->SUPER::init_others;
487 # So we can copy files into directories with less fuss
488 $self->{CP} = '$(ABSPERLRUN) "-MExtUtils::Command" -e cp';
489 $self->{MV} = '$(ABSPERLRUN) "-MExtUtils::Command" -e mv';
491 $self->{UMASK_NULL} = '! ';
493 # Redirection on VMS goes before the command, not after as on Unix.
494 # $(DEV_NULL) is used once and its not worth going nuts over making
495 # it work. However, Unix's DEV_NULL is quite wrong for VMS.
496 $self->{DEV_NULL} = '';
498 if ($self->{OBJECT} =~ /\s/) {
499 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
500 $self->{OBJECT} = $self->wraplist(
501 map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
505 $self->{LDFROM} = $self->wraplist(
506 map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
511 =item init_platform (override)
513 Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
515 MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
523 $self->{MM_VMS_REVISION} = $Revision;
524 $self->{MM_VMS_VERSION} = $VERSION;
525 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
526 if $self->{PERL_SRC};
530 =item platform_constants
534 sub platform_constants {
538 foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
540 next unless defined $self->{$macro};
541 $make_frag .= "$macro = $self->{$macro}\n";
548 =item init_VERSION (override)
550 Override the *DEFINE_VERSION macros with VMS semantics. Translate the
551 MAKEMAKER filepath to VMS style.
558 $self->SUPER::init_VERSION;
560 $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
561 $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
562 $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
566 =item constants (override)
568 Fixes up numerous file and directory macros to insure VMS syntax
569 regardless of input syntax. Also makes lists of files
577 # Be kind about case for pollution
578 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
580 # Cleanup paths for directories in MMS macros.
581 foreach my $macro ( qw [
582 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
583 PERL_LIB PERL_ARCHLIB
585 (map { 'INSTALL'.$_ } $self->installvars)
588 next unless defined $self->{$macro};
589 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
590 $self->{$macro} = $self->fixpath($self->{$macro},1);
593 # Cleanup paths for files in MMS macros.
594 foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
595 MAKE_APERL_FILE MYEXTLIB] )
597 next unless defined $self->{$macro};
598 $self->{$macro} = $self->fixpath($self->{$macro},0);
601 # Fixup files for MMS macros
602 # XXX is this list complete?
604 FULLEXT VERSION_FROM OBJECT LDFROM
606 next unless defined $self->{$macro};
607 $self->{$macro} = $self->fixpath($self->{$macro},0);
611 for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
612 # Where is the space coming from? --jhi
613 next unless $self ne " " && defined $self->{$macro};
615 for my $key (keys %{$self->{$macro}}) {
616 $tmp{$self->fixpath($key,0)} =
617 $self->fixpath($self->{$macro}{$key},0);
619 $self->{$macro} = \%tmp;
622 for my $macro (qw/ C O_FILES H /) {
623 next unless defined $self->{$macro};
625 for my $val (@{$self->{$macro}}) {
626 push(@tmp,$self->fixpath($val,0));
628 $self->{$macro} = \@tmp;
631 # mms/k does not define a $(MAKE) macro.
632 $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
634 return $self->SUPER::constants;
638 =item special_targets
640 Clear the default .SUFFIXES and put in our own list.
644 sub special_targets {
647 my $make_frag .= <<'MAKE_FRAG';
649 .SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
656 =item cflags (override)
658 Bypass shell script and produce qualifiers for CC directly (but warn
659 user if a shell script for this extension exists). Fold multiple
660 /Defines into one, since some C compilers pay attention to only one
661 instance of this qualifier on the command line.
666 my($self,$libperl) = @_;
667 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
668 my($definestr,$undefstr,$flagoptstr) = ('','','');
669 my($incstr) = '/Include=($(PERL_INC)';
672 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
673 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
674 " required to modify CC command for $self->{'BASEEXT'}\n"
677 if ($quals =~ / -[DIUOg]/) {
678 while ($quals =~ / -([Og])(\d*)\b/) {
679 my($type,$lvl) = ($1,$2);
680 $quals =~ s/ -$type$lvl\b\s*//;
681 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
682 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
684 while ($quals =~ / -([DIU])(\S+)/) {
685 my($type,$def) = ($1,$2);
686 $quals =~ s/ -$type$def\s*//;
688 if ($type eq 'D') { $definestr .= qq["$def",]; }
689 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
690 else { $undefstr .= qq["$def",]; }
693 if (length $quals and $quals !~ m!/!) {
694 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
697 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
698 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
699 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
700 # Deal with $self->{DEFINE} here since some C compilers pay attention
701 # to only one /Define clause on command line, so we have to
702 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
703 # ($self->{DEFINE} has already been VMSified in constants() above)
704 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
705 for my $type (qw(Def Undef)) {
707 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
709 $term =~ s:^\((.+)\)$:$1:;
712 if ($type eq 'Def') {
713 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
716 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
717 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
721 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
723 # Likewise with $self->{INC} and /Include
724 if ($self->{'INC'}) {
725 my(@includes) = split(/\s+/,$self->{INC});
726 foreach (@includes) {
728 $incstr .= ','.$self->fixpath($_,1);
731 $quals .= "$incstr)";
732 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
733 $self->{CCFLAGS} = $quals;
735 $self->{PERLTYPE} ||= '';
737 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
738 if ($self->{OPTIMIZE} !~ m!/!) {
739 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
740 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
741 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
744 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
745 $self->{OPTIMIZE} = '/Optimize';
749 return $self->{CFLAGS} = qq{
750 CCFLAGS = $self->{CCFLAGS}
751 OPTIMIZE = $self->{OPTIMIZE}
752 PERLTYPE = $self->{PERLTYPE}
756 =item const_cccmd (override)
758 Adds directives to point C preprocessor to the right place when
759 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
760 command line a bit differently than MM_Unix method.
765 my($self,$libperl) = @_;
768 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
769 return '' unless $self->needs_linking();
770 if ($Config{'vms_cc_type'} eq 'gcc') {
773 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
775 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
778 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
779 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
784 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
785 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
786 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
789 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
791 $self->{CONST_CCCMD} = join('',@m);
795 =item tools_other (override)
797 Throw in some dubious extra macros for Makefile args.
799 Also keep around the old $(SAY) macro in case somebody's using it.
806 # XXX Are these necessary? Does anyone override them? They're longer
807 # than just typing the literal string.
808 my $extra_tools = <<'EXTRA_TOOLS';
810 # Just in case anyone is using the old macro.
811 USEMACROS = $(MACROSTART)
816 return $self->SUPER::tools_other . $extra_tools;
819 =item init_dist (override)
821 VMSish defaults for some values.
823 macro description default
825 ZIPFLAGS flags to pass to ZIP -Vu
827 COMPRESS compression command to gzip
829 SUFFIX suffix to put on -gz
832 SHAR shar command to use vms_share
834 DIST_DEFAULT default target to use to tardist
835 create a distribution
837 DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
844 $self->{ZIPFLAGS} ||= '-Vu';
845 $self->{COMPRESS} ||= 'gzip';
846 $self->{SUFFIX} ||= '-gz';
847 $self->{SHAR} ||= 'vms_share';
848 $self->{DIST_DEFAULT} ||= 'zipdist';
850 $self->SUPER::init_dist;
852 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
857 Use VMS syntax on command line. In particular, $(DEFINE) and
858 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
864 return '' unless $self->needs_linking();
867 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
870 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
873 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
878 =item xs_c (override)
886 return '' unless $self->needs_linking();
889 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
893 =item xs_o (override)
895 Use MM[SK] macros, and VMS command line for C compiler.
899 sub xs_o { # many makes are too dumb to use xs_c then c_o
901 return '' unless $self->needs_linking();
904 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
905 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
910 =item dlsyms (override)
912 Create VMS linker options files specifying universal symbols for this
913 extension's shareable image, and listing other shareable images or
914 libraries to which it should be linked.
919 my($self,%attribs) = @_;
921 return '' unless $self->needs_linking();
923 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
924 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
925 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
928 unless ($self->{SKIPHASH}{'dynamic'}) {
930 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
936 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
938 ') unless $self->{SKIPHASH}{'static'};
941 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
942 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
944 $(BASEEXT).opt : Makefile.PL
945 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
946 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
947 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
948 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
950 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
951 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
952 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
953 push @m, ($Config{d_vms_case_sensitive_symbols}
954 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
956 else { # We don't have a "main" object file, so pull 'em all in
957 # Upcase module names if linker is being case-sensitive
958 my($upcase) = $Config{d_vms_case_sensitive_symbols};
959 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
960 s[\$\(\w+_EXT\)][]; # even as a macro
961 s/.*[:>\/\]]//; # Trim off dir spec
962 $upcase ? uc($_) : $_;
963 } split ' ', $self->eliminate_macros($self->{OBJECT});
964 my($tmp,@lines,$elt) = '';
966 foreach $elt (@omods) {
968 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
971 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
973 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
975 if (length $self->{LDLOADLIBS}) {
976 my($lib); my($line) = '';
977 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
978 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
979 if (length($line) + length($lib) > 160) {
980 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
983 else { $line .= $lib . '\n'; }
985 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
992 =item dynamic_lib (override)
994 Use VMS Link command.
999 my($self, %attribs) = @_;
1000 return '' unless $self->needs_linking(); #might be because of a subdir
1002 return '' unless $self->has_link_code();
1004 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1005 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1006 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1010 OTHERLDFLAGS = $otherldflags
1011 INST_DYNAMIC_DEP = $inst_dynamic_dep
1015 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1016 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1017 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1024 =item static_lib (override)
1026 Use VMS commands to manipulate object library.
1032 return '' unless $self->needs_linking();
1037 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1041 # Rely on suffix rule for update action
1042 $(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
1044 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1046 # If this extension has its own library (eg SDBM_File)
1047 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1048 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1050 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1052 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1053 # 'cause it's a library and you can't stick them in other libraries.
1054 # In that case, we use $OBJECT instead and hope for the best
1055 if ($self->{MYEXTLIB}) {
1056 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1058 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1061 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1062 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1063 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1069 =item extra_clean_files
1071 Clean up some OS specific files. Plus the temp file used to shorten
1076 sub extra_clean_files {
1078 *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
1084 =item zipfile_target
1086 =item tarfile_target
1090 Syntax for invoking shar, tar and zip differs from that for Unix.
1094 sub zipfile_target {
1097 return <<'MAKE_FRAG';
1098 $(DISTVNAME).zip : distdir
1100 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1101 $(RM_RF) $(DISTVNAME)
1106 sub tarfile_target {
1109 return <<'MAKE_FRAG';
1110 $(DISTVNAME).tar$(SUFFIX) : distdir
1113 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1114 $(RM_RF) $(DISTVNAME)
1115 $(COMPRESS) $(DISTVNAME).tar
1123 return <<'MAKE_FRAG';
1126 $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
1127 $(RM_RF) $(DISTVNAME)
1133 # --- Test and Installation Sections ---
1135 =item install (override)
1137 Work around DCL's 255 character limit several times,and use
1138 VMS-style command line quoting in a few cases.
1143 my($self, %attribs) = @_;
1147 install :: all pure_install doc_install
1150 install_perl :: all pure_perl_install doc_perl_install
1153 install_site :: all pure_site_install doc_site_install
1156 pure_install :: pure_$(INSTALLDIRS)_install
1159 doc_install :: doc_$(INSTALLDIRS)_install
1162 pure__install : pure_site_install
1163 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1165 doc__install : doc_site_install
1166 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1168 # This hack brought to you by DCL's 255-character command line limit
1169 pure_perl_install ::
1170 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1171 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1172 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
1173 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
1174 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
1175 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1176 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
1177 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
1178 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1179 $(NOECHO) $(RM_F) .MM_tmp
1180 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1183 pure_site_install ::
1184 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1185 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1186 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
1187 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
1188 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
1189 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1190 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
1191 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
1192 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1193 $(NOECHO) $(RM_F) .MM_tmp
1194 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1196 pure_vendor_install ::
1197 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1198 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1199 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
1200 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
1201 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
1202 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1203 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
1204 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
1205 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1206 $(NOECHO) $(RM_F) .MM_tmp
1210 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1211 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1212 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
1213 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1214 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1215 $(NOECHO) $(RM_F) .MM_tmp
1219 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1220 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1221 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
1222 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1223 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1224 $(NOECHO) $(RM_F) .MM_tmp
1226 doc_vendor_install ::
1227 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1228 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1229 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
1230 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1231 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1232 $(NOECHO) $(RM_F) .MM_tmp
1237 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1240 uninstall_from_perldirs ::
1241 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1242 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1243 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1244 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1246 uninstall_from_sitedirs ::
1247 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1248 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1249 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1250 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1256 =item perldepend (override)
1258 Use VMS-style syntax for files; it's cheaper to just do it directly here
1259 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1260 we have to rebuild Config.pm, use MM[SK] to do it.
1269 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1270 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1271 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1272 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
1273 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1274 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1275 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1276 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1277 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
1278 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
1279 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1280 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1281 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1282 $(OBJECT) : $(PERL_INC)thread.h, $(PERL_INC)util.h, $(PERL_INC)vmsish.h
1284 ' if $self->{OBJECT};
1286 if ($self->{PERL_SRC}) {
1288 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
1289 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1290 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1291 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1292 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1293 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1294 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1296 # Check for unpropagated config.sh changes. Should never happen.
1297 # We do NOT just update config.h because that is not sufficient.
1298 # An out of date config.h is not fatal but complains loudly!
1299 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1302 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1303 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1304 olddef = F$Environment("Default")
1305 Set Default $(PERL_SRC)
1306 $(MMS)],$mmsquals,);
1307 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1308 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1309 $target =~ s/\Q$prefix/[/;
1310 push(@m," $target");
1312 else { push(@m,' $(MMS$TARGET)'); }
1314 Set Default 'olddef'
1318 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1325 =item makeaperl (override)
1327 Undertake to build a new set of Perl images using VMS commands. Since
1328 VMS does dynamic loading, it's not necessary to statically link each
1329 extension into the Perl image, so this isn't the normal build path.
1330 Consequently, it hasn't really been tested, and may well be incomplete.
1337 my($self, %attribs) = @_;
1338 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
1339 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1342 # --- MakeMaker makeaperl section ---
1343 MAP_TARGET = $target
1345 return join '', @m if $self->{PARENT};
1347 my($dir) = join ":", @{$self->{DIR}};
1349 unless ($self->{MAKEAPERL}) {
1351 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1352 $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1353 $(NOECHO) $(PERLRUNINST) \
1354 Makefile.PL DIR=}, $dir, q{ \
1355 FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1356 MAKEAPERL=1 NORECURS=1 };
1358 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1360 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1361 $(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1369 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1372 # The front matter of the linkcommand...
1373 $linkcmd = join ' ', $Config{'ld'},
1374 grep($_, @Config{qw(large split ldflags ccdlflags)});
1375 $linkcmd =~ s/\s+/ /g;
1377 # Which *.olb files could we make use of...
1378 local(%olbs); # XXX can this be lexical?
1379 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1381 File::Find::find(sub {
1382 return unless m/\Q$self->{LIB_EXT}\E$/;
1383 return if m/^libperl/;
1385 if( exists $self->{INCLUDE_EXT} ){
1390 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1394 # Throw away anything not explicitly marked for inclusion.
1395 # DynaLoader is implied.
1396 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1402 return unless $found;
1404 elsif( exists $self->{EXCLUDE_EXT} ){
1408 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1412 # Throw away anything explicitly marked for exclusion
1413 foreach $excl (@{$self->{EXCLUDE_EXT}}){
1414 return if( $xx eq $excl );
1418 $olbs{$ENV{DEFAULT}} = $_;
1419 }, grep( -d $_, @{$searchdirs || []}));
1421 # We trust that what has been handed in as argument will be buildable
1422 $static = [] unless $static;
1423 @olbs{@{$static}} = (1) x @{$static};
1425 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1426 # Sort the object libraries in inverse order of
1427 # filespec length to try to insure that dependent extensions
1428 # will appear before their parents, so the linker will
1429 # search the parent library to resolve references.
1430 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
1431 # references from [.intuit.dwim]dwim.obj can be found
1432 # in [.intuit]intuit.olb).
1433 for (sort { length($a) <=> length($b) } keys %olbs) {
1434 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
1435 my($dir) = $self->fixpath($_,1);
1436 my($extralibs) = $dir . "extralibs.ld";
1437 my($extopt) = $dir . $olbs{$_};
1438 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
1439 push @optlibs, "$dir$olbs{$_}";
1440 # Get external libraries this extension will need
1441 if (-f $extralibs ) {
1443 open LIST,$extralibs or warn $!,next;
1446 # Include a library in the link only once, unless it's mentioned
1447 # multiple times within a single extension's options file, in which
1448 # case we assume the builder needed to search it again later in the
1450 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
1451 $libseen{$_}++; $seenthis{$_}++;
1457 # Get full name of extension for ExtUtils::Miniperl
1459 open OPT,$extopt or die $!;
1461 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
1464 push @staticpkgs,$pkg;
1468 # Place all of the external libraries after all of the Perl extension
1469 # libraries in the final link, in order to maximize the opportunity
1470 # for XS code from multiple extensions to resolve symbols against the
1471 # same external library while only including that library once.
1472 push @optlibs, @$extra;
1474 $target = "Perl$Config{'exe_ext'}" unless $target;
1476 ($shrtarget,$targdir) = fileparse($target);
1477 $shrtarget =~ s/^([^.]*)/$1Shr/;
1478 $shrtarget = $targdir . $shrtarget;
1479 $target = "Perlshr.$Config{'dlext'}" unless $target;
1480 $tmpdir = "[]" unless $tmpdir;
1481 $tmpdir = $self->fixpath($tmpdir,1);
1482 if (@optlibs) { $extralist = join(' ',@optlibs); }
1483 else { $extralist = ''; }
1484 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
1485 # that's what we're building here).
1486 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
1488 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
1489 print STDOUT "Warning: $libperl not found\n";
1494 if (defined $self->{PERL_SRC}) {
1495 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
1496 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
1498 print STDOUT "Warning: $libperl not found
1499 If you're going to build a static perl binary, make sure perl is installed
1500 otherwise ignore this warning\n";
1503 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
1506 # Fill in the target you want to produce if it\'s not perl
1507 MAP_TARGET = ',$self->fixpath($target,0),'
1508 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
1509 MAP_LINKCMD = $linkcmd
1510 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
1511 MAP_EXTRA = $extralist
1512 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
1516 push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
1517 foreach (@optlibs) {
1518 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
1520 push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
1521 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
1524 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
1525 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
1526 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
1527 $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
1528 $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
1529 $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
1530 $(NOECHO) $(ECHO) "To remove the intermediate files, say
1531 $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
1533 push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
1534 push @m, "# More from the 255-char line length limit\n";
1535 foreach (@staticpkgs) {
1536 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
1539 push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
1540 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
1541 $(NOECHO) $(RM_F) %sWritemain.tmp
1545 # Still more from the 255-char line length limit
1547 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1548 $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
1549 $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
1550 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
1551 $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
1552 $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
1553 $(NOECHO) $(RM_F) .MM_tmp
1557 inst_perl : pure_inst_perl doc_inst_perl
1560 pure_inst_perl : \$(MAP_TARGET)
1561 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
1562 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
1568 \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
1569 \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
1576 =item prefixify (override)
1578 prefixifying on VMS is simple. Each should simply be:
1580 perl_root:[some.dir]
1582 which can just be converted to:
1584 volume:[your.prefix.some.dir]
1586 otherwise you get the default layout.
1588 In effect, your search prefix is ignored and $Config{vms_prefix} is
1594 my($self, $var, $sprefix, $rprefix, $default) = @_;
1596 # Translate $(PERLPREFIX) to a real path.
1597 $rprefix = $self->eliminate_macros($rprefix);
1598 $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
1599 $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
1601 $default = VMS::Filespec::vmsify($default)
1602 unless $default =~ /\[.*\]/;
1604 (my $var_no_install = $var) =~ s/^install//;
1605 my $path = $self->{uc $var} ||
1606 $ExtUtils::MM_Unix::Config_Override{lc $var} ||
1607 $Config{lc $var} || $Config{lc $var_no_install};
1610 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
1611 $path = $self->_prefixify_default($rprefix, $default);
1613 elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
1614 # do nothing if there's no prefix or if its relative
1616 elsif( $sprefix eq $rprefix ) {
1617 print STDERR " no new prefix.\n" if $Verbose >= 2;
1621 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
1622 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
1624 my($path_vol, $path_dirs) = $self->splitpath( $path );
1625 if( $path_vol eq $Config{vms_prefix}.':' ) {
1626 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
1628 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
1629 $path = $self->_catprefix($rprefix, $path_dirs);
1632 $path = $self->_prefixify_default($rprefix, $default);
1636 print " now $path\n" if $Verbose >= 2;
1637 return $self->{uc $var} = $path;
1641 sub _prefixify_default {
1642 my($self, $rprefix, $default) = @_;
1644 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
1647 print STDERR "No default!\n" if $Verbose >= 1;
1651 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
1655 return $self->_catprefix($rprefix, $default);
1659 my($self, $rprefix, $default) = @_;
1661 my($rvol, $rdirs) = $self->splitpath($rprefix);
1663 return $self->catpath($rvol,
1664 $self->catdir($rdirs, $default),
1669 return $self->catdir($rdirs, $default);
1679 my($self, $dir, @cmds) = @_;
1681 $dir = vmspath($dir);
1683 my $cmd = join "\n\t", map "$_", @cmds;
1685 # No leading tab makes it look right when embedded
1686 my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
1687 startdir = F$Environment("Default")
1690 Set Default 'startdir'
1693 # No trailing newline makes this easier to embed
1705 my($self, $cmd, $switches) = @_;
1706 $switches = [] unless defined $switches;
1708 # Strip leading and trailing newlines
1712 $cmd = $self->quote_literal($cmd);
1713 $cmd = $self->escape_newlines($cmd);
1715 # Switches must be quoted else they will be lowercased.
1716 $switches = join ' ', map { qq{"$_"} } @$switches;
1718 return qq{\$(ABSPERLRUN) $switches -e $cmd "--"};
1724 perl trips up on "<foo>" thinking it's an input redirect. So we use the
1725 native Write command instead. Besides, its faster.
1730 my($self, $text, $file, $appending) = @_;
1733 my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
1735 my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
1736 push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) }
1738 push @cmds, '$(NOECHO) Close MMECHOFILE';
1748 my($self, $text) = @_;
1750 # I believe this is all we should need.
1756 =item escape_newlines
1760 sub escape_newlines {
1761 my($self, $text) = @_;
1763 $text =~ s{\n}{-\n}g;
1777 return $self->{_MAX_EXEC_LEN} ||= 256;
1786 $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
1788 my $shr = $Config{dbgprefix} . 'PERLSHR';
1789 if ($self->{PERL_SRC}) {
1790 $self->{PERL_ARCHIVE} ||=
1791 $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
1794 $self->{PERL_ARCHIVE} ||=
1795 $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
1798 $self->{PERL_ARCHIVE_AFTER} ||= '';
1801 =item eliminate_macros
1803 Expands MM[KS]/Make macros in a text string, using the contents of
1804 identically named elements of C<%$self>, and returns the result
1805 as a file specification in Unix syntax.
1807 NOTE: This is the canonical version of the method. The version in
1808 File::Spec::VMS is deprecated.
1812 sub eliminate_macros {
1813 my($self,$path) = @_;
1814 return '' unless $path;
1815 $self = {} unless ref $self;
1817 if ($path =~ /\s/) {
1818 return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
1821 my($npath) = unixify($path);
1822 # sometimes unixify will return a string with an off-by-one trailing null
1826 my($head,$macro,$tail);
1828 # perform m##g in scalar context so it acts as an iterator
1829 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
1830 if (defined $self->{$2}) {
1831 ($head,$macro,$tail) = ($1,$2,$3);
1832 if (ref $self->{$macro}) {
1833 if (ref $self->{$macro} eq 'ARRAY') {
1834 $macro = join ' ', @{$self->{$macro}};
1837 print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
1838 "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
1839 $macro = "\cB$macro\cB";
1843 else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
1844 $npath = "$head$macro$tail";
1847 if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
1853 my $path = $mm->fixpath($path);
1854 my $path = $mm->fixpath($path, $is_dir);
1856 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
1857 in any directory specification, in order to avoid juxtaposing two
1858 VMS-syntax directories when MM[SK] is run. Also expands expressions which
1859 are all macro, so that we can tell how long the expansion is, and avoid
1860 overrunning DCL's command buffer when MM[KS] is running.
1862 fixpath() checks to see whether the result matches the name of a
1863 directory in the current default directory and returns a directory or
1864 file specification accordingly. C<$is_dir> can be set to true to
1865 force fixpath() to consider the path to be a directory or false to force
1868 NOTE: This is the canonical version of the method. The version in
1869 File::Spec::VMS is deprecated.
1874 my($self,$path,$force_path) = @_;
1875 return '' unless $path;
1876 $self = bless {} unless ref $self;
1877 my($fixedpath,$prefix,$name);
1879 if ($path =~ /[ \t]/) {
1881 map { $self->fixpath($_,$force_path) }
1882 split /[ \t]+/, $path;
1885 if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
1886 if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
1887 $fixedpath = vmspath($self->eliminate_macros($path));
1890 $fixedpath = vmsify($self->eliminate_macros($path));
1893 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
1894 my($vmspre) = $self->eliminate_macros("\$($prefix)");
1895 # is it a dir or just a name?
1896 $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
1897 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
1898 $fixedpath = vmspath($fixedpath) if $force_path;
1902 $fixedpath = vmspath($fixedpath) if $force_path;
1904 # No hints, so we try to guess
1905 if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
1906 $fixedpath = vmspath($fixedpath) if -d $fixedpath;
1909 # Trim off root dirname if it's had other dirs inserted in front of it.
1910 $fixedpath =~ s/\.000000([\]>])/$1/;
1911 # Special case for VMS absolute directory specs: these will have had device
1912 # prepended during trip through Unix syntax in eliminate_macros(), since
1913 # Unix syntax has no way to express "absolute from the top of this device's
1915 if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
1936 Original author Charles Bailey F<bailey@newman.upenn.edu>
1938 Maintained by Michael G Schwern F<schwern@pobox.com>
1940 See L<ExtUtils::MakeMaker> for patching and contact information.