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 our $VERSION = '6.44';
20 require ExtUtils::MM_Any;
21 require ExtUtils::MM_Unix;
22 our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
24 use ExtUtils::MakeMaker qw($Verbose neatvalue);
25 our $Revision = $ExtUtils::MakeMaker::Revision;
30 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
34 Do not use this directly.
35 Instead, use ExtUtils::MM and it will figure out which MM_*
40 See ExtUtils::MM_Unix for a documentation of the methods provided
41 there. This package overrides the implementation of these methods, not
44 =head2 Methods always loaded
50 Converts a list into a string wrapped at approximately 80 columns.
56 my($line,$hlen) = ('',0);
58 foreach my $word (@_) {
59 # Perl bug -- seems to occasionally insert extra elements when
60 # traversing array (scalar(@array) doesn't show them, but
61 # foreach(@array) does) (5.00307)
62 next unless $word =~ /\w/;
63 $line .= ' ' if length($line);
64 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
66 $hlen += length($word) + 2;
72 # This isn't really an override. It's just here because ExtUtils::MM_VMS
73 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
74 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
75 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
76 # XXX This hackery will die soon. --Schwern
78 require ExtUtils::Liblist::Kid;
79 goto &ExtUtils::Liblist::Kid::ext;
86 Those methods which override default MM_Unix methods are marked
87 "(override)", while methods unique to MM_VMS are marked "(specific)".
88 For overridden methods, documentation is limited to an explanation
89 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
90 documentation for more details.
94 =item guess_name (override)
96 Try to determine name of extension being built. We begin with the name
97 of the current directory. Since VMS filenames are case-insensitive,
98 however, we look for a F<.pm> file whose name matches that of the current
99 directory (presumably the 'main' F<.pm> file for this extension), and try
100 to find a C<package> statement from which to obtain the Mixed::Case
107 my($defname,$defpm,@pm,%xs);
110 $defname = basename(fileify($ENV{'DEFAULT'}));
111 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
113 # Fallback in case for some reason a user has copied the files for an
114 # extension into a working directory whose name doesn't reflect the
115 # extension's name. We'll use the name of a unique .pm file, or the
116 # first .pm file with a matching .xs file.
117 if (not -e "${defpm}.pm") {
120 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
122 %xs = map { s/.xs$//; ($_,1) } glob('*.xs'); ## no critic
124 foreach my $pm (@pm) {
125 $defpm = $pm, last if exists $xs{$pm};
130 if (open(my $pm, '<', "${defpm}.pm")){
132 if (/^\s*package\s+([^;]+)/i) {
137 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
138 "defaulting package name to $defname\n"
143 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
144 "defaulting package name to $defname\n";
146 $defname =~ s#[\d.\-_]+$##;
150 =item find_perl (override)
152 Use VMS file specification syntax and CLI commands to find and
158 my($self, $ver, $names, $dirs, $trace) = @_;
159 my($vmsfile,@sdirs,@snames,@cand);
164 if( $self->{PERL_CORE} ) {
165 # Check in relative directories first, so we pick up the current
166 # version of Perl if we're running MakeMaker as part of the main build.
167 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
168 my($absb) = $self->file_name_is_absolute($b);
169 if ($absa && $absb) { return $a cmp $b }
170 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
172 # Check miniperl before perl, and check names likely to contain
173 # version numbers before "generic" names, so we pick up an
174 # executable that's less likely to be from an old installation.
175 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
176 my($bb) = $b =~ m!([^:>\]/]+)$!;
177 my($ahasdir) = (length($a) - length($ba) > 0);
178 my($bhasdir) = (length($b) - length($bb) > 0);
179 if ($ahasdir and not $bhasdir) { return 1; }
180 elsif ($bhasdir and not $ahasdir) { return -1; }
181 else { $bb =~ /\d/ <=> $ba =~ /\d/
182 or substr($ba,0,1) cmp substr($bb,0,1)
183 or length($bb) <=> length($ba) } } @$names;
190 # Image names containing Perl version use '_' instead of '.' under VMS
191 s/\.(\d+)$/_$1/ for @snames;
193 print "Looking for perl $ver by these names:\n";
194 print "\t@snames,\n";
195 print "in these dirs:\n";
198 foreach my $dir (@sdirs){
199 next unless defined $dir; # $self->{PERL_SRC} may be undefined
200 $inabs++ if $self->file_name_is_absolute($dir);
202 # We've covered relative dirs; everything else is an absolute
203 # dir (probably an installed location). First, we'll try
204 # potential command names, to see whether we can avoid a long
206 foreach my $name (@snames) {
207 push(@cand,$name) if $name =~ /^[\w\-\$]+$/;
209 $inabs++; # Should happen above in next $dir, but just in case...
211 foreach my $name (@snames){
212 push @cand, ($name !~ m![/:>\]]!) ? $self->catfile($dir,$name)
213 : $self->fixpath($name,0);
216 foreach my $name (@cand) {
217 print "Checking $name\n" if $trace >= 2;
218 # If it looks like a potential command, try it without the MCR
219 if ($name =~ /^[\w\-\$]+$/) {
220 open(my $tcf, ">", "temp_mmvms.com")
221 or die('unable to open temp file');
222 print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
223 print $tcf "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
225 $rslt = `\@temp_mmvms.com` ;
226 unlink('temp_mmvms.com');
227 if ($rslt =~ /VER_OK/) {
228 print "Using PERL=$name\n" if $trace;
232 next unless $vmsfile = $self->maybe_command($name);
233 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
234 print "Executing $vmsfile\n" if ($trace >= 2);
235 open(my $tcf, '>', "temp_mmvms.com")
236 or die('unable to open temp file');
237 print $tcf "\$ set message/nofacil/nosever/noident/notext\n";
238 print $tcf "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
240 $rslt = `\@temp_mmvms.com`;
241 unlink('temp_mmvms.com');
242 if ($rslt =~ /VER_OK/) {
243 print "Using PERL=MCR $vmsfile\n" if $trace;
244 return "MCR $vmsfile";
247 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
248 0; # false and not empty
251 =item maybe_command (override)
253 Follows VMS naming conventions for executable files.
254 If the name passed in doesn't exactly match an executable file,
255 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
256 to check for DCL procedure. If this fails, checks directories in DCL$PATH
257 and finally F<Sys$System:> for an executable file having the name specified,
258 with or without the F<.Exe>-equivalent suffix.
263 my($self,$file) = @_;
264 return $file if -x $file && ! -d _;
266 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
268 if ($file !~ m![/:>\]]!) {
269 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
270 my $dir = $ENV{"DCL\$PATH;$i"};
271 $dir .= ':' unless $dir =~ m%[\]:]$%;
274 push(@dirs,'Sys$System:');
275 foreach my $dir (@dirs) {
276 my $sysfile = "$dir$file";
277 foreach my $ext (@exts) {
278 return $file if -x "$sysfile$ext" && ! -d _;
286 =item pasthru (override)
288 VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
289 options. This is used in every invocation of make in the VMS Makefile so
290 PASTHRU should not be necessary. Using PASTHRU tends to blow commands past
291 the 256 character limit.
300 =item pm_to_blib (override)
302 VMS wants a dot in every file so we can't have one called 'pm_to_blib',
303 it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
304 you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
306 So in VMS its pm_to_blib.ts.
313 my $make = $self->SUPER::pm_to_blib;
315 $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
316 $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
318 $make = <<'MAKE' . $make;
319 # Dummy target to match Unix target name; we use pm_to_blib.ts as
320 # timestamp file to avoid repeated invocations under VMS
321 pm_to_blib : pm_to_blib.ts
330 =item perl_script (override)
332 If name passed in doesn't specify a readable file, appends F<.com> or
333 F<.pl> and tries again, since it's customary to have file types on all files
339 my($self,$file) = @_;
340 return $file if -r $file && ! -d _;
341 return "$file.com" if -r "$file.com";
342 return "$file.pl" if -r "$file.pl";
347 =item replace_manpage_separator
349 Use as separator a character which is legal in a VMS-syntax file name.
353 sub replace_manpage_separator {
355 $man = unixify($man);
362 (override) Because of the difficulty concatenating VMS filepaths we
363 must pre-expand the DEST* variables.
370 $self->SUPER::init_DEST;
372 # Expand DEST variables.
373 foreach my $var ($self->installvars) {
374 my $destvar = 'DESTINSTALL'.$var;
375 $self->{$destvar} = File::Spec->eliminate_macros($self->{$destvar});
380 =item init_DIRFILESEP
382 No seperator between a directory path and a filename on VMS.
386 sub init_DIRFILESEP {
389 $self->{DIRFILESEP} = '';
394 =item init_main (override)
402 $self->SUPER::init_main;
404 $self->{DEFINE} ||= '';
405 if ($self->{DEFINE} ne '') {
406 my(@terms) = split(/\s+/,$self->{DEFINE});
408 foreach my $def (@terms) {
411 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
412 $targ = \@udefs if $1 eq 'U';
413 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
414 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
417 $def =~ s/"/""/g; # Protect existing " from DCL
418 $def = qq["$def"]; # and quote to prevent parsing of =
423 $self->{DEFINE} = '';
425 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
428 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
433 =item init_others (override)
435 Provide VMS-specific forms of various utility commands, then hand
436 off to the default MM_Unix method.
438 DEV_NULL should probably be overriden with something.
440 Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
441 one second later than source file, since MMK interprets precisely
442 equal revision dates for a source and target file as a sign that the
443 target needs to be updated.
450 $self->{NOOP} = 'Continue';
451 $self->{NOECHO} ||= '@ ';
453 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE} || 'Descrip.MMS';
454 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE};
455 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
456 $self->{MAKEFILE_OLD} ||= $self->eliminate_macros('$(FIRST_MAKEFILE)_old');
458 # If an extension is not specified, then MMS/MMK assumes an
459 # an extension of .MMS. If there really is no extension,
460 # then a trailing "." needs to be appended to specify a
463 $self->{MAKEFILE} .= '.' unless $self->{MAKEFILE} =~ m/\./;
464 $self->{FIRST_MAKEFILE} .= '.' unless $self->{FIRST_MAKEFILE} =~ m/\./;
465 $self->{MAKE_APERL_FILE} .= '.' unless $self->{MAKE_APERL_FILE} =~ m/\./;
466 $self->{MAKEFILE_OLD} .= '.' unless $self->{MAKEFILE_OLD} =~ m/\./;
468 $self->{MACROSTART} ||= '/Macro=(';
469 $self->{MACROEND} ||= ')';
470 $self->{USEMAKEFILE} ||= '/Descrip=';
472 $self->{ECHO} ||= '$(ABSPERLRUN) -le "print qq{@ARGV}"';
473 $self->{ECHO_N} ||= '$(ABSPERLRUN) -e "print qq{@ARGV}"';
474 $self->{TOUCH} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e touch';
475 $self->{CHMOD} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e chmod';
476 $self->{RM_F} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_f';
477 $self->{RM_RF} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_rf';
478 $self->{TEST_F} ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e test_f';
479 $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
481 $self->{MOD_INSTALL} ||=
482 $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
483 install({split(' ',<STDIN>)}, '$(VERBINST)', 0, '$(UNINST)');
486 $self->{SHELL} ||= 'Posix';
488 $self->SUPER::init_others;
490 # So we can copy files into directories with less fuss
491 $self->{CP} = '$(ABSPERLRUN) "-MExtUtils::Command" -e cp';
492 $self->{MV} = '$(ABSPERLRUN) "-MExtUtils::Command" -e mv';
494 $self->{UMASK_NULL} = '! ';
496 # Redirection on VMS goes before the command, not after as on Unix.
497 # $(DEV_NULL) is used once and its not worth going nuts over making
498 # it work. However, Unix's DEV_NULL is quite wrong for VMS.
499 $self->{DEV_NULL} = '';
501 if ($self->{OBJECT} =~ /\s/) {
502 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
503 $self->{OBJECT} = $self->wraplist(
504 map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
508 $self->{LDFROM} = $self->wraplist(
509 map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
514 =item init_platform (override)
516 Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
518 MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
526 $self->{MM_VMS_REVISION} = $Revision;
527 $self->{MM_VMS_VERSION} = $VERSION;
528 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
529 if $self->{PERL_SRC};
533 =item platform_constants
537 sub platform_constants {
541 foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
543 next unless defined $self->{$macro};
544 $make_frag .= "$macro = $self->{$macro}\n";
551 =item init_VERSION (override)
553 Override the *DEFINE_VERSION macros with VMS semantics. Translate the
554 MAKEMAKER filepath to VMS style.
561 $self->SUPER::init_VERSION;
563 $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""';
564 $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
565 $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
569 =item constants (override)
571 Fixes up numerous file and directory macros to insure VMS syntax
572 regardless of input syntax. Also makes lists of files
580 # Be kind about case for pollution
581 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
583 # Cleanup paths for directories in MMS macros.
584 foreach my $macro ( qw [
585 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
586 PERL_LIB PERL_ARCHLIB
588 (map { 'INSTALL'.$_ } $self->installvars)
591 next unless defined $self->{$macro};
592 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
593 $self->{$macro} = $self->fixpath($self->{$macro},1);
596 # Cleanup paths for files in MMS macros.
597 foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD
598 MAKE_APERL_FILE MYEXTLIB] )
600 next unless defined $self->{$macro};
601 $self->{$macro} = $self->fixpath($self->{$macro},0);
604 # Fixup files for MMS macros
605 # XXX is this list complete?
607 FULLEXT VERSION_FROM OBJECT LDFROM
609 next unless defined $self->{$macro};
610 $self->{$macro} = $self->fixpath($self->{$macro},0);
614 for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
615 # Where is the space coming from? --jhi
616 next unless $self ne " " && defined $self->{$macro};
618 for my $key (keys %{$self->{$macro}}) {
619 $tmp{$self->fixpath($key,0)} =
620 $self->fixpath($self->{$macro}{$key},0);
622 $self->{$macro} = \%tmp;
625 for my $macro (qw/ C O_FILES H /) {
626 next unless defined $self->{$macro};
628 for my $val (@{$self->{$macro}}) {
629 push(@tmp,$self->fixpath($val,0));
631 $self->{$macro} = \@tmp;
634 # mms/k does not define a $(MAKE) macro.
635 $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
637 return $self->SUPER::constants;
641 =item special_targets
643 Clear the default .SUFFIXES and put in our own list.
647 sub special_targets {
650 my $make_frag .= <<'MAKE_FRAG';
652 .SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
659 =item cflags (override)
661 Bypass shell script and produce qualifiers for CC directly (but warn
662 user if a shell script for this extension exists). Fold multiple
663 /Defines into one, since some C compilers pay attention to only one
664 instance of this qualifier on the command line.
669 my($self,$libperl) = @_;
670 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
671 my($definestr,$undefstr,$flagoptstr) = ('','','');
672 my($incstr) = '/Include=($(PERL_INC)';
675 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
676 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
677 " required to modify CC command for $self->{'BASEEXT'}\n"
680 if ($quals =~ / -[DIUOg]/) {
681 while ($quals =~ / -([Og])(\d*)\b/) {
682 my($type,$lvl) = ($1,$2);
683 $quals =~ s/ -$type$lvl\b\s*//;
684 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
685 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
687 while ($quals =~ / -([DIU])(\S+)/) {
688 my($type,$def) = ($1,$2);
689 $quals =~ s/ -$type$def\s*//;
691 if ($type eq 'D') { $definestr .= qq["$def",]; }
692 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
693 else { $undefstr .= qq["$def",]; }
696 if (length $quals and $quals !~ m!/!) {
697 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
700 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
701 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
702 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
703 # Deal with $self->{DEFINE} here since some C compilers pay attention
704 # to only one /Define clause on command line, so we have to
705 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
706 # ($self->{DEFINE} has already been VMSified in constants() above)
707 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
708 for my $type (qw(Def Undef)) {
710 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
712 $term =~ s:^\((.+)\)$:$1:;
715 if ($type eq 'Def') {
716 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
719 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
720 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
724 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
726 # Likewise with $self->{INC} and /Include
727 if ($self->{'INC'}) {
728 my(@includes) = split(/\s+/,$self->{INC});
729 foreach (@includes) {
731 $incstr .= ','.$self->fixpath($_,1);
734 $quals .= "$incstr)";
735 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
736 $self->{CCFLAGS} = $quals;
738 $self->{PERLTYPE} ||= '';
740 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
741 if ($self->{OPTIMIZE} !~ m!/!) {
742 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
743 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
744 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
747 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
748 $self->{OPTIMIZE} = '/Optimize';
752 return $self->{CFLAGS} = qq{
753 CCFLAGS = $self->{CCFLAGS}
754 OPTIMIZE = $self->{OPTIMIZE}
755 PERLTYPE = $self->{PERLTYPE}
759 =item const_cccmd (override)
761 Adds directives to point C preprocessor to the right place when
762 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
763 command line a bit differently than MM_Unix method.
768 my($self,$libperl) = @_;
771 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
772 return '' unless $self->needs_linking();
773 if ($Config{'vms_cc_type'} eq 'gcc') {
776 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
778 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
781 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
782 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
787 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
788 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
789 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
792 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
794 $self->{CONST_CCCMD} = join('',@m);
798 =item tools_other (override)
800 Throw in some dubious extra macros for Makefile args.
802 Also keep around the old $(SAY) macro in case somebody's using it.
809 # XXX Are these necessary? Does anyone override them? They're longer
810 # than just typing the literal string.
811 my $extra_tools = <<'EXTRA_TOOLS';
813 # Just in case anyone is using the old macro.
814 USEMACROS = $(MACROSTART)
819 return $self->SUPER::tools_other . $extra_tools;
822 =item init_dist (override)
824 VMSish defaults for some values.
826 macro description default
828 ZIPFLAGS flags to pass to ZIP -Vu
830 COMPRESS compression command to gzip
832 SUFFIX suffix to put on -gz
835 SHAR shar command to use vms_share
837 DIST_DEFAULT default target to use to tardist
838 create a distribution
840 DISTVNAME Use VERSION_SYM instead of $(DISTNAME)-$(VERSION_SYM)
847 $self->{ZIPFLAGS} ||= '-Vu';
848 $self->{COMPRESS} ||= 'gzip';
849 $self->{SUFFIX} ||= '-gz';
850 $self->{SHAR} ||= 'vms_share';
851 $self->{DIST_DEFAULT} ||= 'zipdist';
853 $self->SUPER::init_dist;
855 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
860 Use VMS syntax on command line. In particular, $(DEFINE) and
861 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
867 return '' unless $self->needs_linking();
870 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
873 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
876 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
881 =item xs_c (override)
889 return '' unless $self->needs_linking();
892 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
896 =item xs_o (override)
898 Use MM[SK] macros, and VMS command line for C compiler.
902 sub xs_o { # many makes are too dumb to use xs_c then c_o
904 return '' unless $self->needs_linking();
907 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
908 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
913 =item dlsyms (override)
915 Create VMS linker options files specifying universal symbols for this
916 extension's shareable image, and listing other shareable images or
917 libraries to which it should be linked.
922 my($self,%attribs) = @_;
924 return '' unless $self->needs_linking();
926 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
927 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
928 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
931 unless ($self->{SKIPHASH}{'dynamic'}) {
933 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
939 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
941 ') unless $self->{SKIPHASH}{'static'};
944 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
945 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
947 $(BASEEXT).opt : Makefile.PL
948 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
949 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
950 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
951 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
953 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
954 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
955 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
956 push @m, ($Config{d_vms_case_sensitive_symbols}
957 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
959 else { # We don't have a "main" object file, so pull 'em all in
960 # Upcase module names if linker is being case-sensitive
961 my($upcase) = $Config{d_vms_case_sensitive_symbols};
962 my(@omods) = split ' ', $self->eliminate_macros($self->{OBJECT});
964 s/\.[^.]*$//; # Trim off file type
965 s[\$\(\w+_EXT\)][]; # even as a macro
966 s/.*[:>\/\]]//; # Trim off dir spec
971 my $tmp = shift @omods;
972 foreach my $elt (@omods) {
974 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
977 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
979 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
981 if (length $self->{LDLOADLIBS}) {
983 foreach my $lib (split ' ', $self->{LDLOADLIBS}) {
984 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
985 if (length($line) + length($lib) > 160) {
986 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
989 else { $line .= $lib . '\n'; }
991 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
998 =item dynamic_lib (override)
1000 Use VMS Link command.
1005 my($self, %attribs) = @_;
1006 return '' unless $self->needs_linking(); #might be because of a subdir
1008 return '' unless $self->has_link_code();
1010 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1011 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1012 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1016 OTHERLDFLAGS = $otherldflags
1017 INST_DYNAMIC_DEP = $inst_dynamic_dep
1021 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1022 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1023 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1030 =item static_lib (override)
1032 Use VMS commands to manipulate object library.
1038 return '' unless $self->needs_linking();
1043 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1047 # Rely on suffix rule for update action
1048 $(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
1050 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1052 # If this extension has its own library (eg SDBM_File)
1053 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1054 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1056 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1058 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1059 # 'cause it's a library and you can't stick them in other libraries.
1060 # In that case, we use $OBJECT instead and hope for the best
1061 if ($self->{MYEXTLIB}) {
1062 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1064 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1067 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1068 foreach my $lib (split ' ', $self->{EXTRALIBS}) {
1069 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1075 =item extra_clean_files
1077 Clean up some OS specific files. Plus the temp file used to shorten
1082 sub extra_clean_files {
1084 *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
1090 =item zipfile_target
1092 =item tarfile_target
1096 Syntax for invoking shar, tar and zip differs from that for Unix.
1100 sub zipfile_target {
1103 return <<'MAKE_FRAG';
1104 $(DISTVNAME).zip : distdir
1106 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1107 $(RM_RF) $(DISTVNAME)
1112 sub tarfile_target {
1115 return <<'MAKE_FRAG';
1116 $(DISTVNAME).tar$(SUFFIX) : distdir
1119 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1120 $(RM_RF) $(DISTVNAME)
1121 $(COMPRESS) $(DISTVNAME).tar
1129 return <<'MAKE_FRAG';
1132 $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
1133 $(RM_RF) $(DISTVNAME)
1139 # --- Test and Installation Sections ---
1141 =item install (override)
1143 Work around DCL's 255 character limit several times,and use
1144 VMS-style command line quoting in a few cases.
1149 my($self, %attribs) = @_;
1153 install :: all pure_install doc_install
1156 install_perl :: all pure_perl_install doc_perl_install
1159 install_site :: all pure_site_install doc_site_install
1162 pure_install :: pure_$(INSTALLDIRS)_install
1165 doc_install :: doc_$(INSTALLDIRS)_install
1168 pure__install : pure_site_install
1169 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1171 doc__install : doc_site_install
1172 $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1174 # This hack brought to you by DCL's 255-character command line limit
1175 pure_perl_install ::
1176 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1177 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1178 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
1179 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
1180 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
1181 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1182 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
1183 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
1184 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1185 $(NOECHO) $(RM_F) .MM_tmp
1186 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1189 pure_site_install ::
1190 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1191 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1192 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
1193 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
1194 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
1195 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1196 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
1197 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
1198 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1199 $(NOECHO) $(RM_F) .MM_tmp
1200 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1202 pure_vendor_install ::
1203 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1204 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1205 $(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
1206 $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
1207 $(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
1208 $(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
1209 $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
1210 $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
1211 $(NOECHO) $(MOD_INSTALL) <.MM_tmp
1212 $(NOECHO) $(RM_F) .MM_tmp
1216 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1217 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1218 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
1219 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1220 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1221 $(NOECHO) $(RM_F) .MM_tmp
1225 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1226 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1227 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
1228 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1229 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1230 $(NOECHO) $(RM_F) .MM_tmp
1232 doc_vendor_install ::
1233 $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
1234 $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
1235 $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
1236 $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
1237 $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
1238 $(NOECHO) $(RM_F) .MM_tmp
1243 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1246 uninstall_from_perldirs ::
1247 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'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."
1252 uninstall_from_sitedirs ::
1253 $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1254 $(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
1255 $(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
1256 $(NOECHO) $(ECHO) "the appropriate files. Sorry for the inconvenience."
1262 =item perldepend (override)
1264 Use VMS-style syntax for files; it's cheaper to just do it directly here
1265 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1266 we have to rebuild Config.pm, use MM[SK] to do it.
1275 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1276 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1277 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1278 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
1279 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1280 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1281 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1282 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1283 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
1284 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
1285 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1286 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1287 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1288 $(OBJECT) : $(PERL_INC)thread.h, $(PERL_INC)util.h, $(PERL_INC)vmsish.h
1290 ' if $self->{OBJECT};
1292 if ($self->{PERL_SRC}) {
1294 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
1295 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1296 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1297 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1298 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1299 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1300 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1302 # Check for unpropagated config.sh changes. Should never happen.
1303 # We do NOT just update config.h because that is not sufficient.
1304 # An out of date config.h is not fatal but complains loudly!
1305 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1308 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1309 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1310 olddef = F$Environment("Default")
1311 Set Default $(PERL_SRC)
1312 $(MMS)],$mmsquals,);
1313 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1314 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1315 $target =~ s/\Q$prefix/[/;
1316 push(@m," $target");
1318 else { push(@m,' $(MMS$TARGET)'); }
1320 Set Default 'olddef'
1324 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1331 =item makeaperl (override)
1333 Undertake to build a new set of Perl images using VMS commands. Since
1334 VMS does dynamic loading, it's not necessary to statically link each
1335 extension into the Perl image, so this isn't the normal build path.
1336 Consequently, it hasn't really been tested, and may well be incomplete.
1340 our %olbs; # needs to be localized
1343 my($self, %attribs) = @_;
1344 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) =
1345 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1348 # --- MakeMaker makeaperl section ---
1349 MAP_TARGET = $target
1351 return join '', @m if $self->{PARENT};
1353 my($dir) = join ":", @{$self->{DIR}};
1355 unless ($self->{MAKEAPERL}) {
1357 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1358 $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1359 $(NOECHO) $(PERLRUNINST) \
1360 Makefile.PL DIR=}, $dir, q{ \
1361 FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1362 MAKEAPERL=1 NORECURS=1 };
1364 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1366 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1367 $(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1375 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1378 # The front matter of the linkcommand...
1379 $linkcmd = join ' ', $Config{'ld'},
1380 grep($_, @Config{qw(large split ldflags ccdlflags)});
1381 $linkcmd =~ s/\s+/ /g;
1383 # Which *.olb files could we make use of...
1384 local(%olbs); # XXX can this be lexical?
1385 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1387 File::Find::find(sub {
1388 return unless m/\Q$self->{LIB_EXT}\E$/;
1389 return if m/^libperl/;
1391 if( exists $self->{INCLUDE_EXT} ){
1394 (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
1398 # Throw away anything not explicitly marked for inclusion.
1399 # DynaLoader is implied.
1400 foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1406 return unless $found;
1408 elsif( exists $self->{EXCLUDE_EXT} ){
1409 (my $xx = $File::Find::name) =~ s,.*?/auto/,,;
1413 # Throw away anything explicitly marked for exclusion
1414 foreach my $excl (@{$self->{EXCLUDE_EXT}}){
1415 return if( $xx eq $excl );
1419 $olbs{$ENV{DEFAULT}} = $_;
1420 }, grep( -d $_, @{$searchdirs || []}));
1422 # We trust that what has been handed in as argument will be buildable
1423 $static = [] unless $static;
1424 @olbs{@{$static}} = (1) x @{$static};
1426 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1427 # Sort the object libraries in inverse order of
1428 # filespec length to try to insure that dependent extensions
1429 # will appear before their parents, so the linker will
1430 # search the parent library to resolve references.
1431 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
1432 # references from [.intuit.dwim]dwim.obj can be found
1433 # in [.intuit]intuit.olb).
1434 for (sort { length($a) <=> length($b) } keys %olbs) {
1435 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
1436 my($dir) = $self->fixpath($_,1);
1437 my($extralibs) = $dir . "extralibs.ld";
1438 my($extopt) = $dir . $olbs{$_};
1439 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
1440 push @optlibs, "$dir$olbs{$_}";
1441 # Get external libraries this extension will need
1442 if (-f $extralibs ) {
1444 open my $list, "<", $extralibs or warn $!,next;
1447 # Include a library in the link only once, unless it's mentioned
1448 # multiple times within a single extension's options file, in which
1449 # case we assume the builder needed to search it again later in the
1451 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
1452 $libseen{$_}++; $seenthis{$_}++;
1457 # Get full name of extension for ExtUtils::Miniperl
1459 open my $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)
1575 # --- Output postprocessing section ---
1577 =item maketext_filter (override)
1579 Insure that colons marking targets are preceded by space, in order
1580 to distinguish the target delimiter from a colon appearing as
1585 sub maketext_filter {
1586 my($self, $text) = @_;
1588 $text =~ s/^([^\s:=]+)(:+\s)/$1 $2/mg;
1592 =item prefixify (override)
1594 prefixifying on VMS is simple. Each should simply be:
1596 perl_root:[some.dir]
1598 which can just be converted to:
1600 volume:[your.prefix.some.dir]
1602 otherwise you get the default layout.
1604 In effect, your search prefix is ignored and $Config{vms_prefix} is
1610 my($self, $var, $sprefix, $rprefix, $default) = @_;
1612 # Translate $(PERLPREFIX) to a real path.
1613 $rprefix = $self->eliminate_macros($rprefix);
1614 $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
1615 $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
1617 $default = VMS::Filespec::vmsify($default)
1618 unless $default =~ /\[.*\]/;
1620 (my $var_no_install = $var) =~ s/^install//;
1621 my $path = $self->{uc $var} ||
1622 $ExtUtils::MM_Unix::Config_Override{lc $var} ||
1623 $Config{lc $var} || $Config{lc $var_no_install};
1626 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
1627 $path = $self->_prefixify_default($rprefix, $default);
1629 elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
1630 # do nothing if there's no prefix or if its relative
1632 elsif( $sprefix eq $rprefix ) {
1633 print STDERR " no new prefix.\n" if $Verbose >= 2;
1637 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
1638 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
1640 my($path_vol, $path_dirs) = $self->splitpath( $path );
1641 if( $path_vol eq $Config{vms_prefix}.':' ) {
1642 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
1644 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
1645 $path = $self->_catprefix($rprefix, $path_dirs);
1648 $path = $self->_prefixify_default($rprefix, $default);
1652 print " now $path\n" if $Verbose >= 2;
1653 return $self->{uc $var} = $path;
1657 sub _prefixify_default {
1658 my($self, $rprefix, $default) = @_;
1660 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
1663 print STDERR "No default!\n" if $Verbose >= 1;
1667 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
1671 return $self->_catprefix($rprefix, $default);
1675 my($self, $rprefix, $default) = @_;
1677 my($rvol, $rdirs) = $self->splitpath($rprefix);
1679 return $self->catpath($rvol,
1680 $self->catdir($rdirs, $default),
1685 return $self->catdir($rdirs, $default);
1695 my($self, $dir, @cmds) = @_;
1697 $dir = vmspath($dir);
1699 my $cmd = join "\n\t", map "$_", @cmds;
1701 # No leading tab makes it look right when embedded
1702 my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
1703 startdir = F$Environment("Default")
1706 Set Default 'startdir'
1709 # No trailing newline makes this easier to embed
1721 my($self, $cmd, $switches) = @_;
1722 $switches = [] unless defined $switches;
1724 # Strip leading and trailing newlines
1728 $cmd = $self->quote_literal($cmd);
1729 $cmd = $self->escape_newlines($cmd);
1731 # Switches must be quoted else they will be lowercased.
1732 $switches = join ' ', map { qq{"$_"} } @$switches;
1734 return qq{\$(ABSPERLRUN) $switches -e $cmd "--"};
1740 perl trips up on "<foo>" thinking it's an input redirect. So we use the
1741 native Write command instead. Besides, its faster.
1746 my($self, $text, $file, $appending) = @_;
1749 my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
1751 my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
1752 push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) }
1754 push @cmds, '$(NOECHO) Close MMECHOFILE';
1764 my($self, $text) = @_;
1766 # I believe this is all we should need.
1772 =item escape_newlines
1776 sub escape_newlines {
1777 my($self, $text) = @_;
1779 $text =~ s{\n}{-\n}g;
1793 return $self->{_MAX_EXEC_LEN} ||= 256;
1802 $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
1804 my $shr = $Config{dbgprefix} . 'PERLSHR';
1805 if ($self->{PERL_SRC}) {
1806 $self->{PERL_ARCHIVE} ||=
1807 $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
1810 $self->{PERL_ARCHIVE} ||=
1811 $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
1814 $self->{PERL_ARCHIVE_AFTER} ||= '';
1817 =item eliminate_macros
1819 Expands MM[KS]/Make macros in a text string, using the contents of
1820 identically named elements of C<%$self>, and returns the result
1821 as a file specification in Unix syntax.
1823 NOTE: This is the canonical version of the method. The version in
1824 File::Spec::VMS is deprecated.
1828 sub eliminate_macros {
1829 my($self,$path) = @_;
1830 return '' unless $path;
1831 $self = {} unless ref $self;
1833 if ($path =~ /\s/) {
1834 return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
1837 my($npath) = unixify($path);
1838 # sometimes unixify will return a string with an off-by-one trailing null
1842 my($head,$macro,$tail);
1844 # perform m##g in scalar context so it acts as an iterator
1845 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) {
1846 if (defined $self->{$2}) {
1847 ($head,$macro,$tail) = ($1,$2,$3);
1848 if (ref $self->{$macro}) {
1849 if (ref $self->{$macro} eq 'ARRAY') {
1850 $macro = join ' ', @{$self->{$macro}};
1853 print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
1854 "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
1855 $macro = "\cB$macro\cB";
1859 else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
1860 $npath = "$head$macro$tail";
1863 if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
1869 my $path = $mm->fixpath($path);
1870 my $path = $mm->fixpath($path, $is_dir);
1872 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
1873 in any directory specification, in order to avoid juxtaposing two
1874 VMS-syntax directories when MM[SK] is run. Also expands expressions which
1875 are all macro, so that we can tell how long the expansion is, and avoid
1876 overrunning DCL's command buffer when MM[KS] is running.
1878 fixpath() checks to see whether the result matches the name of a
1879 directory in the current default directory and returns a directory or
1880 file specification accordingly. C<$is_dir> can be set to true to
1881 force fixpath() to consider the path to be a directory or false to force
1884 NOTE: This is the canonical version of the method. The version in
1885 File::Spec::VMS is deprecated.
1890 my($self,$path,$force_path) = @_;
1891 return '' unless $path;
1892 $self = bless {}, $self unless ref $self;
1893 my($fixedpath,$prefix,$name);
1895 if ($path =~ /[ \t]/) {
1897 map { $self->fixpath($_,$force_path) }
1898 split /[ \t]+/, $path;
1901 if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) {
1902 if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
1903 $fixedpath = vmspath($self->eliminate_macros($path));
1906 $fixedpath = vmsify($self->eliminate_macros($path));
1909 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
1910 my($vmspre) = $self->eliminate_macros("\$($prefix)");
1911 # is it a dir or just a name?
1912 $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
1913 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
1914 $fixedpath = vmspath($fixedpath) if $force_path;
1918 $fixedpath = vmspath($fixedpath) if $force_path;
1920 # No hints, so we try to guess
1921 if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
1922 $fixedpath = vmspath($fixedpath) if -d $fixedpath;
1925 # Trim off root dirname if it's had other dirs inserted in front of it.
1926 $fixedpath =~ s/\.000000([\]>])/$1/;
1927 # Special case for VMS absolute directory specs: these will have had device
1928 # prepended during trip through Unix syntax in eliminate_macros(), since
1929 # Unix syntax has no way to express "absolute from the top of this device's
1931 if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
1952 Original author Charles Bailey F<bailey@newman.upenn.edu>
1954 Maintained by Michael G Schwern F<schwern@pobox.com>
1956 See L<ExtUtils::MakeMaker> for patching and contact information.