2 # MakeMaker default methods for VMS
4 # Author: Charles Bailey bailey@newman.upenn.edu
6 package ExtUtils::MM_VMS;
16 use vars qw($Revision @ISA $VERSION);
17 ($VERSION) = $Revision = '5.63_01';
19 require ExtUtils::MM_Any;
20 require ExtUtils::MM_Unix;
21 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix File::Spec );
23 use ExtUtils::MakeMaker qw($Verbose neatvalue);
28 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
32 Do not use this directly.
33 Instead, use ExtUtils::MM and it will figure out which MM_*
38 See ExtUtils::MM_Unix for a documentation of the methods provided
39 there. This package overrides the implementation of these methods, not
42 =head2 Methods always loaded
48 Converts a list into a string wrapped at approximately 80 columns.
54 my($line,$hlen) = ('',0);
58 # Perl bug -- seems to occasionally insert extra elements when
59 # traversing array (scalar(@array) doesn't show them, but
60 # foreach(@array) does) (5.00307)
61 next unless $word =~ /\w/;
62 $line .= ' ' if length($line);
63 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
65 $hlen += length($word) + 2;
71 # This isn't really an override. It's just here because ExtUtils::MM_VMS
72 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
73 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
74 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
75 # XXX This hackery will die soon. --Schwern
77 require ExtUtils::Liblist::Kid;
78 goto &ExtUtils::Liblist::Kid::ext;
85 Those methods which override default MM_Unix methods are marked
86 "(override)", while methods unique to MM_VMS are marked "(specific)".
87 For overridden methods, documentation is limited to an explanation
88 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
89 documentation for more details.
93 =item guess_name (override)
95 Try to determine name of extension being built. We begin with the name
96 of the current directory. Since VMS filenames are case-insensitive,
97 however, we look for a F<.pm> file whose name matches that of the current
98 directory (presumably the 'main' F<.pm> file for this extension), and try
99 to find a C<package> statement from which to obtain the Mixed::Case
106 my($defname,$defpm,@pm,%xs,$pm);
109 $defname = basename(fileify($ENV{'DEFAULT'}));
110 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
112 # Fallback in case for some reason a user has copied the files for an
113 # extension into a working directory whose name doesn't reflect the
114 # extension's name. We'll use the name of a unique .pm file, or the
115 # first .pm file with a matching .xs file.
116 if (not -e "${defpm}.pm") {
117 @pm = map { s/.pm$//; $_ } glob('*.pm');
118 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
120 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
123 $defpm = $pm, last if exists $xs{$pm};
128 if (open(PM,"${defpm}.pm")){
130 if (/^\s*package\s+([^;]+)/i) {
135 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
136 "defaulting package name to $defname\n"
141 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
142 "defaulting package name to $defname\n";
144 $defname =~ s#[\d.\-_]+$##;
148 =item find_perl (override)
150 Use VMS file specification syntax and CLI commands to find and
156 my($self, $ver, $names, $dirs, $trace) = @_;
157 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
161 # Check in relative directories first, so we pick up the current
162 # version of Perl if we're running MakeMaker as part of the main build.
163 @sdirs = sort { my($absa) = File::Spec->file_name_is_absolute($a);
164 my($absb) = File::Spec->file_name_is_absolute($b);
165 if ($absa && $absb) { return $a cmp $b }
166 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
168 # Check miniperl before perl, and check names likely to contain
169 # version numbers before "generic" names, so we pick up an
170 # executable that's less likely to be from an old installation.
171 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
172 my($bb) = $b =~ m!([^:>\]/]+)$!;
173 my($ahasdir) = (length($a) - length($ba) > 0);
174 my($bhasdir) = (length($b) - length($bb) > 0);
175 if ($ahasdir and not $bhasdir) { return 1; }
176 elsif ($bhasdir and not $ahasdir) { return -1; }
177 else { $bb =~ /\d/ <=> $ba =~ /\d/
178 or substr($ba,0,1) cmp substr($bb,0,1)
179 or length($bb) <=> length($ba) } } @$names;
180 # Image names containing Perl version use '_' instead of '.' under VMS
181 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
183 print "Looking for perl $ver by these names:\n";
184 print "\t@snames,\n";
185 print "in these dirs:\n";
188 foreach $dir (@sdirs){
189 next unless defined $dir; # $self->{PERL_SRC} may be undefined
190 $inabs++ if File::Spec->file_name_is_absolute($dir);
192 # We've covered relative dirs; everything else is an absolute
193 # dir (probably an installed location). First, we'll try potential
194 # command names, to see whether we can avoid a long MCR expression.
195 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
196 $inabs++; # Should happen above in next $dir, but just in case . . .
198 foreach $name (@snames){
199 if ($name !~ m![/:>\]]!) { push(@cand,File::Spec->catfile($dir,$name)); }
200 else { push(@cand,$self->fixpath($name,0)); }
203 foreach $name (@cand) {
204 print "Checking $name\n" if ($trace >= 2);
205 # If it looks like a potential command, try it without the MCR
206 if ($name =~ /^[\w\-\$]+$/) {
207 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
208 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
209 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
211 $rslt = `\@temp_mmvms.com` ;
212 unlink('temp_mmvms.com');
213 if ($rslt =~ /VER_OK/) {
214 print "Using PERL=$name\n" if $trace;
218 next unless $vmsfile = $self->maybe_command($name);
219 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
220 print "Executing $vmsfile\n" if ($trace >= 2);
221 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
222 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
223 print TCF "\$ mcr $vmsfile -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=MCR $vmsfile\n" if $trace;
229 return "MCR $vmsfile";
232 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
233 0; # false and not empty
236 =item maybe_command (override)
238 Follows VMS naming conventions for executable files.
239 If the name passed in doesn't exactly match an executable file,
240 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
241 to check for DCL procedure. If this fails, checks directories in DCL$PATH
242 and finally F<Sys$System:> for an executable file having the name specified,
243 with or without the F<.Exe>-equivalent suffix.
248 my($self,$file) = @_;
249 return $file if -x $file && ! -d _;
251 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
253 if ($file !~ m![/:>\]]!) {
254 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
255 $dir = $ENV{"DCL\$PATH;$i"};
256 $dir .= ':' unless $dir =~ m%[\]:]$%;
259 push(@dirs,'Sys$System:');
260 foreach $dir (@dirs) {
261 my $sysfile = "$dir$file";
262 foreach $ext (@exts) {
263 return $file if -x "$sysfile$ext" && ! -d _;
270 =item maybe_command_in_dirs (override)
272 Uses DCL argument quoting on test command line.
276 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
277 my($self, $names, $dirs, $trace, $ver) = @_;
279 foreach $dir (@$dirs){
280 next unless defined $dir; # $self->{PERL_SRC} may be undefined
281 foreach $name (@$names){
283 if (File::Spec->file_name_is_absolute($name)) {
286 $abs = File::Spec->catfile($dir, $name);
288 print "Checking $abs for $name\n" if ($trace >= 2);
289 next unless $tryabs = $self->maybe_command($abs);
290 print "Substituting $tryabs instead of $abs\n"
291 if ($trace >= 2 and $tryabs ne $abs);
294 print "Executing $abs\n" if ($trace >= 2);
295 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
296 print "Using $abs\n" if $trace;
299 } else { # Do not look for perl
306 =item perl_script (override)
308 If name passed in doesn't specify a readable file, appends F<.com> or
309 F<.pl> and tries again, since it's customary to have file types on all files
315 my($self,$file) = @_;
316 return $file if -r $file && ! -d _;
317 return "$file.com" if -r "$file.com";
318 return "$file.pl" if -r "$file.pl";
322 =item replace_manpage_separator
324 Use as separator a character which is legal in a VMS-syntax file name.
328 sub replace_manpage_separator {
330 $man = unixify($man);
335 =item init_main (override)
337 Override DISTVNAME so it uses VERSION_SYM to avoid getting too many
345 $self->SUPER::init_main;
346 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
349 =item init_others (override)
351 Provide VMS-specific forms of various utility commands, then hand
352 off to the default MM_Unix method.
359 $self->{NOOP} = 'Continue';
360 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
361 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
362 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
363 $self->{NOECHO} ||= '@ ';
364 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
365 $self->{RM_RF} = '$(PERLRUN) -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
366 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
367 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
368 $self->{CP} = 'Copy/NoConfirm';
369 $self->{MV} = 'Rename/NoConfirm';
370 $self->{UMASK_NULL} = '! ';
372 $self->SUPER::init_others;
375 =item constants (override)
377 Fixes up numerous file and directory macros to insure VMS syntax
378 regardless of input syntax. Also adds a few VMS-specific macros
379 and makes lists of files comma-separated.
387 # Be kind about case for pollution
388 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
390 $self->{DEFINE} ||= '';
391 if ($self->{DEFINE} ne '') {
392 my(@terms) = split(/\s+/,$self->{DEFINE});
394 foreach $def (@terms) {
397 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
398 if ($1 eq 'U') { $targ = \@udefs; }
399 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
400 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
403 $def =~ s/"/""/g; # Protect existing " from DCL
404 $def = qq["$def"]; # and quote to prevent parsing of =
408 $self->{DEFINE} = '';
410 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
413 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
417 if ($self->{OBJECT} =~ /\s/) {
418 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
419 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
421 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
424 foreach $macro ( qw [
425 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
426 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
427 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
428 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
429 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
430 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
431 PERL_LIB PERL_ARCHLIB
432 PERL_INC PERL_SRC FULLEXT ] ) {
433 next unless defined $self->{$macro};
434 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
435 $self->{$macro} = $self->fixpath($self->{$macro},1);
437 $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS))
438 if ($self->{PERL_SRC});
443 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
444 next unless defined $self->{$macro};
445 $self->{$macro} = $self->fixpath($self->{$macro},0);
449 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM
451 INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
453 PREFIX SITEPREFIX VENDORPREFIX
454 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
455 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
456 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
457 PERL_LIB PERL_ARCHLIB
458 SITELIBEXP SITEARCHEXP
460 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
461 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
462 FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST
463 PERL_CORE NOECHO NOOP
465 next unless defined $self->{$macro};
466 push @m, "$macro = $self->{$macro}\n";
471 VERSION_MACRO = VERSION
472 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
473 XS_VERSION_MACRO = XS_VERSION
474 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
476 MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
477 MM_VERSION = $ExtUtils::MakeMaker::VERSION
478 MM_REVISION = $ExtUtils::MakeMaker::Revision
479 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
481 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
482 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
483 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
484 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
488 FULLEXT VERSION_FROM OBJECT LDFROM
490 next unless defined $self->{$tmp};
491 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
495 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
497 next unless defined $self->{$tmp};
498 push @m, "$tmp = $self->{$tmp}\n";
501 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
502 # Where is the space coming from? --jhi
503 next unless $self ne " " && defined $self->{$tmp};
505 for $key (keys %{$self->{$tmp}}) {
506 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
508 $self->{$tmp} = \%tmp;
511 for my $tmp (qw/ C O_FILES H /) {
512 next unless defined $self->{$tmp};
514 for $val (@{$self->{$tmp}}) {
515 push(@tmp,$self->fixpath($val,0));
517 $self->{$tmp} = \@tmp;
522 # Handy lists of source code files:
523 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
524 C_FILES = ',$self->wraplist(@{$self->{C}}),'
525 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
526 H_FILES = ',$self->wraplist(@{$self->{H}}),'
527 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
528 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
534 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
536 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
538 next unless defined $self->{$tmp};
539 push @m, "$tmp = $self->{$tmp}\n";
547 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
549 # Here is the Config.pm that we are using/depend on
550 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
552 # Where to put things:
553 INST_LIBDIR = $self->{INST_LIBDIR}
554 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
556 INST_AUTODIR = $self->{INST_AUTODIR}
557 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
560 if ($self->has_link_code()) {
562 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
563 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
564 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
567 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
572 EXPORT_LIST = $(BASEEXT).opt
573 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
577 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
578 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
580 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
582 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
588 =item cflags (override)
590 Bypass shell script and produce qualifiers for CC directly (but warn
591 user if a shell script for this extension exists). Fold multiple
592 /Defines into one, since some C compilers pay attention to only one
593 instance of this qualifier on the command line.
598 my($self,$libperl) = @_;
599 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
600 my($definestr,$undefstr,$flagoptstr) = ('','','');
601 my($incstr) = '/Include=($(PERL_INC)';
604 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
605 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
606 " required to modify CC command for $self->{'BASEEXT'}\n"
609 if ($quals =~ / -[DIUOg]/) {
610 while ($quals =~ / -([Og])(\d*)\b/) {
611 my($type,$lvl) = ($1,$2);
612 $quals =~ s/ -$type$lvl\b\s*//;
613 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
614 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
616 while ($quals =~ / -([DIU])(\S+)/) {
617 my($type,$def) = ($1,$2);
618 $quals =~ s/ -$type$def\s*//;
620 if ($type eq 'D') { $definestr .= qq["$def",]; }
621 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
622 else { $undefstr .= qq["$def",]; }
625 if (length $quals and $quals !~ m!/!) {
626 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
629 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
630 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
631 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
632 # Deal with $self->{DEFINE} here since some C compilers pay attention
633 # to only one /Define clause on command line, so we have to
634 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
635 # ($self->{DEFINE} has already been VMSified in constants() above)
636 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
637 for my $type (qw(Def Undef)) {
639 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
641 $term =~ s:^\((.+)\)$:$1:;
644 if ($type eq 'Def') {
645 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
648 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
649 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
653 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
655 # Likewise with $self->{INC} and /Include
656 if ($self->{'INC'}) {
657 my(@includes) = split(/\s+/,$self->{INC});
658 foreach (@includes) {
660 $incstr .= ','.$self->fixpath($_,1);
663 $quals .= "$incstr)";
664 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
665 $self->{CCFLAGS} = $quals;
667 $self->{PERLTYPE} ||= '';
669 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
670 if ($self->{OPTIMIZE} !~ m!/!) {
671 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
672 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
673 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
676 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
677 $self->{OPTIMIZE} = '/Optimize';
681 return $self->{CFLAGS} = qq{
682 CCFLAGS = $self->{CCFLAGS}
683 OPTIMIZE = $self->{OPTIMIZE}
684 PERLTYPE = $self->{PERLTYPE}
688 =item const_cccmd (override)
690 Adds directives to point C preprocessor to the right place when
691 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
692 command line a bit differently than MM_Unix method.
697 my($self,$libperl) = @_;
700 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
701 return '' unless $self->needs_linking();
702 if ($Config{'vms_cc_type'} eq 'gcc') {
705 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
707 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
710 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
711 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
716 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
717 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
718 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
721 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
723 $self->{CONST_CCCMD} = join('',@m);
726 =item pm_to_blib (override)
728 DCL I<still> accepts a maximum of 255 characters on a command
729 line, so we write the (potentially) long list of file names
730 to a temp file, then persuade Perl to read it instead of the
731 command line to find args.
737 my($line,$from,$to,@m);
738 my($autodir) = File::Spec->catdir($self->{INST_LIB},'auto');
739 my(@files) = @{$self->{PM_TO_BLIB}};
743 # Dummy target to match Unix target name; we use pm_to_blib.ts as
744 # timestamp file to avoid repeated invocations under VMS
745 pm_to_blib : pm_to_blib.ts
750 push @m, <<'MAKE_FRAG',
751 # As always, keep under DCL's 255-char limit
752 pm_to_blib.ts : $(TO_INST_PM)
753 $(NOECHO) $(RM_F) .MM_tmp
756 $line = ''; # avoid uninitialized var warning
757 while ($from = shift(@files),$to = shift(@files)) {
758 $line .= " $from $to";
759 if (length($line) > 128) {
760 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
764 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
766 push(@m,q[ $(PERLRUN) "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
768 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
769 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
775 =item tool_autosplit (override)
777 Use VMS-style quoting on command line.
782 my($self, %attribs) = @_;
784 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
786 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
787 AUTOSPLITFILE = $(PERLRUN) -e "use AutoSplit;}.$asl.q{autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
791 =item tool_sxubpp (override)
793 Use VMS-style quoting on xsubpp command line.
799 return '' unless $self->needs_linking;
800 my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils');
801 # drop back to old location if xsubpp is not in new location yet
802 $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp'));
803 my(@tmdeps) = '$(XSUBPPDIR)typemap';
804 if( $self->{TYPEMAPS} ){
806 foreach $typemap (@{$self->{TYPEMAPS}}){
808 warn "Typemap $typemap not found.\n";
811 push(@tmdeps, $self->fixpath($typemap,0));
815 push(@tmdeps, "typemap") if -f "typemap";
816 my(@tmargs) = map("-typemap $_", @tmdeps);
817 if( exists $self->{XSOPT} ){
818 unshift( @tmargs, $self->{XSOPT} );
821 if ($Config{'ldflags'} &&
822 $Config{'ldflags'} =~ m!/Debug!i &&
823 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
824 unshift(@tmargs,'-nolinenumbers');
826 my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp'));
828 # What are the correct thresholds for version 1 && 2 Paul?
829 if ( $xsubpp_version > 1.923 ){
830 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
832 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
833 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
834 Your version of xsubpp is $xsubpp_version and cannot handle this.
835 Please upgrade to a more recent version of xsubpp.
838 $self->{XSPROTOARG} = "";
844 XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
845 XSPROTOARG = $self->{XSPROTOARG}
851 =item xsubpp_version (override)
853 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
854 rather than Unix rules ($sts == 0 ==E<gt> good).
860 my($self,$xsubpp) = @_;
862 return '' unless $self->needs_linking;
864 # try to figure out the version number of the xsubpp on the system
866 # first try the -v flag, introduced in 1.921 & 2.000a2
868 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
869 print "Running: $command\n" if $Verbose;
870 $version = `$command` ;
873 warn "Running '$command' exits with status $?";
877 return $1 if $version =~ /^xsubpp version (.*)/ ;
879 # nope, then try something else
882 my ($file) = 'temp' ;
883 $counter++ while -e "$file$counter"; # don't overwrite anything
887 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
889 MODULE = fred PACKAGE = fred
898 $command = "$self->{PERLRUN} $xsubpp $file";
899 print "Running: $command\n" if $Verbose;
900 my $text = `$command` ;
903 warn "Running '$command' exits with status $?";
907 # gets 1.2 -> 1.92 and 2.000a1
908 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
910 # it is either 1.0 or 1.1
911 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
913 # none of the above, so 1.0
917 =item tools_other (override)
919 Adds a few MM[SK] macros, and shortens some the installatin commands,
920 in order to stay under DCL's 255-character limit. Also changes
921 EQUALIZE_TIMESTAMP to set revision date of target file to one second
922 later than source file, since MMK interprets precisely equal revision
923 dates for a source and target file as a sign that the target needs
931 # Assumes \$(MMS) invokes MMS or MMK
932 # (It is assumed in some cases later that the default makefile name
933 # (Descrip.MMS for MM[SK]) is used.)
934 USEMAKEFILE = /Descrip=
937 MAKEFILE = Descrip.MMS
939 TOUCH = $self->{TOUCH}
940 CHMOD = $self->{CHMOD}
944 RM_RF = $self->{RM_RF}
945 SAY = Write Sys\$Output
946 UMASK_NULL = $self->{UMASK_NULL}
947 MKPATH = Create/Directory
948 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
949 !. ($self->{PARENT} ? '' :
950 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
951 MOD_INSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
952 DOC_INSTALL = \$(PERL) -e "\@ARGV=split(/\\|/,<STDIN>);print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];while(\$key=shift && \$val=shift){print qq[=item *\\n\\nC<\$key: \$val>\\n\\n];}print qq[=back\\n\\n]"
953 UNINSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
957 =item dist (override)
959 Provide VMSish defaults for some values, then hand off to
960 default MM_Unix method.
965 my($self, %attribs) = @_;
966 $attribs{VERSION} ||= $self->{VERSION_SYM};
967 $attribs{NAME} ||= $self->{DISTNAME};
968 $attribs{ZIPFLAGS} ||= '-Vu';
969 $attribs{COMPRESS} ||= 'gzip';
970 $attribs{SUFFIX} ||= '-gz';
971 $attribs{SHAR} ||= 'vms_share';
972 $attribs{DIST_DEFAULT} ||= 'zipdist';
974 # Sanitize these for use in $(DISTVNAME) filespec
975 $attribs{VERSION} =~ s/[^\w\$]/_/g;
976 $attribs{NAME} =~ s/[^\w\$]/-/g;
978 $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)';
980 return $self->SUPER::dist(%attribs);
985 Use VMS syntax on command line. In particular, $(DEFINE) and
986 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
992 return '' unless $self->needs_linking();
995 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
998 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1001 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1006 =item xs_c (override)
1014 return '' unless $self->needs_linking();
1017 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1021 =item xs_o (override)
1023 Use MM[SK] macros, and VMS command line for C compiler.
1027 sub xs_o { # many makes are too dumb to use xs_c then c_o
1029 return '' unless $self->needs_linking();
1032 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1033 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1037 =item top_targets (override)
1039 Path seperator differences.
1047 all :: pure_all manifypods
1050 pure_all :: config pm_to_blib subdirs linkext
1053 subdirs :: $(MYEXTLIB)
1056 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1059 config :: $(INST_ARCHAUTODIR).exists
1062 config :: $(INST_AUTODIR).exists
1066 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1067 if (%{$self->{MAN1PODS}}) {
1069 config :: $(INST_MAN1DIR).exists
1072 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1074 if (%{$self->{MAN3PODS}}) {
1076 config :: $(INST_MAN3DIR).exists
1079 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1083 $(O_FILES) : $(H_FILES)
1084 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1088 perldoc ExtUtils::MakeMaker
1094 =item dlsyms (override)
1096 Create VMS linker options files specifying universal symbols for this
1097 extension's shareable image, and listing other shareable images or
1098 libraries to which it should be linked.
1103 my($self,%attribs) = @_;
1105 return '' unless $self->needs_linking();
1107 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1108 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1109 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1112 unless ($self->{SKIPHASH}{'dynamic'}) {
1114 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1120 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1122 ') unless $self->{SKIPHASH}{'static'};
1125 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1126 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1128 $(BASEEXT).opt : Makefile.PL
1129 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
1130 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1131 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1132 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1134 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1135 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1136 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1137 push @m, ($Config{d_vms_case_sensitive_symbols}
1138 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1140 else { # We don't have a "main" object file, so pull 'em all in
1141 # Upcase module names if linker is being case-sensitive
1142 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1143 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1144 s[\$\(\w+_EXT\)][]; # even as a macro
1145 s/.*[:>\/\]]//; # Trim off dir spec
1146 $upcase ? uc($_) : $_;
1147 } split ' ', $self->eliminate_macros($self->{OBJECT});
1148 my($tmp,@lines,$elt) = '';
1149 $tmp = shift @omods;
1150 foreach $elt (@omods) {
1152 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1155 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1157 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1159 if (length $self->{LDLOADLIBS}) {
1160 my($lib); my($line) = '';
1161 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1162 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1163 if (length($line) + length($lib) > 160) {
1164 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1165 $line = $lib . '\n';
1167 else { $line .= $lib . '\n'; }
1169 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1176 =item dynamic_lib (override)
1178 Use VMS Link command.
1183 my($self, %attribs) = @_;
1184 return '' unless $self->needs_linking(); #might be because of a subdir
1186 return '' unless $self->has_link_code();
1188 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1189 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1190 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1194 OTHERLDFLAGS = $otherldflags
1195 INST_DYNAMIC_DEP = $inst_dynamic_dep
1199 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1200 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1201 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1202 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1205 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1209 =item dynamic_bs (override)
1211 Use VMS-style quoting on Mkbootstrap command line.
1216 my($self, %attribs) = @_;
1219 ' unless $self->has_link_code();
1221 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1223 # As MakeMaker mkbootstrap might not write a file (if none is required)
1224 # we use touch to prevent make continually trying to remake it.
1225 # The DynaLoader only reads a non-empty file.
1226 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1227 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1228 $(NOECHO) $(PERLRUN) -
1229 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1230 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1232 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1233 $(NOECHO) $(RM_RF) $(INST_BOOT)
1234 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1238 =item static_lib (override)
1240 Use VMS commands to manipulate object library.
1246 return '' unless $self->needs_linking();
1251 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1255 # Rely on suffix rule for update action
1256 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1258 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1260 # If this extension has its own library (eg SDBM_File)
1261 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1262 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1264 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1266 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1267 # 'cause it's a library and you can't stick them in other libraries.
1268 # In that case, we use $OBJECT instead and hope for the best
1269 if ($self->{MYEXTLIB}) {
1270 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1272 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1275 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1276 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1277 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1279 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1284 =item manifypods (override)
1286 Use VMS-style quoting on command line, and VMS logical name
1287 to specify fallback location at build time if we can't find pod2man.
1293 my($self, %attribs) = @_;
1294 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1297 if (defined $self->{PERL_SRC}) {
1298 $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
1300 $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
1302 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1303 # No pod2man but some MAN3PODS to be installed
1306 Warning: I could not locate your pod2man program. As a last choice,
1307 I will look for the file to which the logical name POD2MAN
1308 points when MMK is invoked.
1311 $pod2man_exe = "pod2man";
1315 qq[POD2MAN_EXE = $pod2man_exe\n],
1316 q[POD2MAN = $(PERLRUN) "-MPod::Man" -we "%m=@ARGV;for(keys %m){" -
1317 -e "Pod::Man->new->parse_from_file($_,$m{$_}) }"
1319 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1320 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1322 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1323 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1324 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1326 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1327 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1328 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1334 =item processPL (override)
1336 Use VMS-style quoting on command line.
1342 return "" unless $self->{PL_FILES};
1344 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1345 my $list = ref($self->{PL_FILES}->{$plfile})
1346 ? $self->{PL_FILES}->{$plfile}
1347 : [$self->{PL_FILES}->{$plfile}];
1348 foreach my $target (@$list) {
1349 my $vmsplfile = vmsify($plfile);
1350 my $vmsfile = vmsify($target);
1355 $vmsfile :: $vmsplfile
1356 ",' $(PERLRUNINST) '," $vmsplfile $vmsfile
1363 =item installbin (override)
1365 Stay under DCL's 255 character command line limit once again by
1366 splitting potentially long list of files across multiple lines
1367 in C<realclean> target.
1373 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1374 return '' unless @{$self->{EXE_FILES}};
1375 my(@m, $from, $to, %fromto, @to, $line);
1376 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1377 for $from (@exefiles) {
1378 my($path) = '$(INST_SCRIPT)' . basename($from);
1379 local($_) = $path; # backward compatibility
1380 $to = $self->libscan($path);
1381 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1382 $fromto{$from} = vmsify($to);
1384 @to = values %fromto;
1386 EXE_FILES = @exefiles
1390 $line = ''; #avoid unitialized var warning
1392 if (length($line) + length($to) > 80) {
1393 push @m, "\t\$(RM_F) $line\n";
1396 else { $line .= " $to"; }
1398 push @m, "\t\$(RM_F) $line\n\n" if $line;
1400 while (($from,$to) = each %fromto) {
1401 last unless defined $from;
1403 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1404 else { ($todir = $to) =~ s/[^\)]+$//; }
1405 $todir = $self->fixpath($todir,1);
1407 $to : $from \$(MAKEFILE) ${todir}.exists
1410 ", $self->dir_target($todir);
1415 =item subdir_x (override)
1417 Use VMS commands to change default directory.
1422 my($self, $subdir) = @_;
1424 $subdir = $self->fixpath($subdir,1);
1428 olddef = F$Environment("Default")
1429 Set Default ',$subdir,'
1430 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1431 Set Default \'olddef\'
1436 =item clean (override)
1438 Split potentially long list of files across multiple commands (in
1439 order to stay under the magic command line limit). Also use MM[SK]
1440 commands for handling subdirectories.
1445 my($self, %attribs) = @_;
1448 # Delete temporary files but do not touch installed files. We don\'t delete
1449 # the Descrip.MMS here so that a later make realclean still has it to use.
1452 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1453 my($vmsdir) = $self->fixpath($dir,1);
1454 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1455 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1457 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1460 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1461 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1462 # a list or a macro that expands to a list.
1463 if ($attribs{FILES}) {
1464 my($word,$key,@filist);
1465 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1466 else { @filist = split /\s+/, $attribs{FILES}; }
1467 foreach $word (@filist) {
1468 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1469 push(@otherfiles, @{$self->{$key}});
1471 else { push(@otherfiles, $word); }
1474 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1475 push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1477 $line = ''; #avoid unitialized var warning
1478 # Occasionally files are repeated several times from different sources
1479 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1481 foreach $file (@otherfiles) {
1482 $file = $self->fixpath($file);
1483 if (length($line) + length($file) > 80) {
1484 push @m, "\t\$(RM_RF) $line\n";
1487 else { $line .= " $file"; }
1489 push @m, "\t\$(RM_RF) $line\n" if $line;
1490 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1494 =item realclean (override)
1496 Guess what we're working around? Also, use MM[SK] for subdirectories.
1501 my($self, %attribs) = @_;
1504 # Delete temporary files (via clean) and also delete installed files
1507 foreach(@{$self->{DIR}}){
1508 my($vmsdir) = $self->fixpath($_,1);
1509 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1510 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1512 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1513 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
1514 # We can't expand several of the MMS macros here, since they don't have
1515 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1516 # combination of macros). In order to stay below DCL's 255 char limit,
1517 # we put only 2 on a line.
1518 my($file,$line,$fcnt);
1519 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1520 if ($self->has_link_code) {
1521 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1523 push(@files, values %{$self->{PM}});
1524 $line = ''; #avoid unitialized var warning
1525 # Occasionally files are repeated several times from different sources
1526 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1527 foreach $file (@files) {
1528 $file = $self->fixpath($file);
1529 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1530 push @m, "\t\$(RM_F) $line\n";
1534 else { $line .= " $file"; }
1536 push @m, "\t\$(RM_F) $line\n" if $line;
1537 if ($attribs{FILES}) {
1538 my($word,$key,@filist,@allfiles);
1539 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1540 else { @filist = split /\s+/, $attribs{FILES}; }
1541 foreach $word (@filist) {
1542 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1543 push(@allfiles, @{$self->{$key}});
1545 else { push(@allfiles, $word); }
1548 # Occasionally files are repeated several times from different sources
1549 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1550 foreach $file (@allfiles) {
1551 $file = $self->fixpath($file);
1552 if (length($line) + length($file) > 80) {
1553 push @m, "\t\$(RM_RF) $line\n";
1556 else { $line .= " $file"; }
1558 push @m, "\t\$(RM_RF) $line\n" if $line;
1560 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1565 =item dist_core (override)
1567 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1568 so C<shdist> target actions are VMS-specific.
1575 dist : $(DIST_DEFAULT)
1576 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1578 zipdist : $(DISTVNAME).zip
1581 tardist : $(DISTVNAME).tar$(SUFFIX)
1584 $(DISTVNAME).zip : distdir
1586 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1587 $(RM_RF) $(DISTVNAME)
1590 $(DISTVNAME).tar$(SUFFIX) : distdir
1593 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1594 $(RM_RF) $(DISTVNAME)
1595 $(COMPRESS) $(DISTVNAME).tar
1600 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1601 $(RM_RF) $(DISTVNAME)
1606 =item dist_test (override)
1608 Use VMS commands to change default directory, and use VMS-style
1609 quoting on command line.
1617 startdir = F$Environment("Default")
1618 Set Default [.$(DISTVNAME)]
1619 $(ABSPERLRUN) Makefile.PL
1620 $(MMS)$(MMSQUALIFIERS)
1621 $(MMS)$(MMSQUALIFIERS) test
1622 Set Default 'startdir'
1626 # --- Test and Installation Sections ---
1628 =item install (override)
1630 Work around DCL's 255 character limit several times,and use
1631 VMS-style command line quoting in a few cases.
1636 my($self, %attribs) = @_;
1639 if ($self->{EXE_FILES}) {
1640 my($line,$file) = ('','');
1641 foreach $file (@{$self->{EXE_FILES}}) {
1643 if (length($line) > 128) {
1644 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1648 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1652 install :: all pure_install doc_install
1655 install_perl :: all pure_perl_install doc_perl_install
1658 install_site :: all pure_site_install doc_site_install
1661 pure_install :: pure_$(INSTALLDIRS)_install
1664 doc_install :: doc_$(INSTALLDIRS)_install
1665 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1667 pure__install : pure_site_install
1668 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1670 doc__install : doc_site_install
1671 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1673 # This hack brought to you by DCL's 255-character command line limit
1674 pure_perl_install ::
1675 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1676 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1677 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1678 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1679 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1680 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1681 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1682 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1683 $(MOD_INSTALL) <.MM_tmp
1684 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1685 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1688 pure_site_install ::
1689 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1690 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1691 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1692 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1693 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLSITEBIN) '" >>.MM_tmp
1694 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1695 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) '" >>.MM_tmp
1696 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) '" >>.MM_tmp
1697 $(MOD_INSTALL) <.MM_tmp
1698 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1699 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1701 pure_vendor_install ::
1702 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLVENDORLIB) '" >>.MM_tmp
1703 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLVENDORARCH) '" >>.MM_tmp
1704 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLVENDORBIN) '" >>.MM_tmp
1705 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1706 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) '" >>.MM_tmp
1707 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) '" >>.MM_tmp
1708 $(MOD_INSTALL) <.MM_tmp
1709 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1713 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1714 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1716 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1717 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1718 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1719 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1720 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1721 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1725 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1726 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1728 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1729 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1730 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1731 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1732 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1733 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1735 doc_vendor_install ::
1740 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1743 uninstall_from_perldirs ::
1744 $(NOECHO) $(UNINSTALL) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1745 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1746 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1747 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1749 uninstall_from_sitedirs ::
1750 $(NOECHO) $(UNINSTALL) ],File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[
1751 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1752 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1753 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1759 =item perldepend (override)
1761 Use VMS-style syntax for files; it's cheaper to just do it directly here
1762 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1763 we have to rebuild Config.pm, use MM[SK] to do it.
1772 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1773 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1774 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1775 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)fakethr.h, $(PERL_INC)form.h
1776 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1777 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1778 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1779 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)opnames.h, $(PERL_INC)patchlevel.h
1780 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlapi.h, $(PERL_INC)perlio.h
1781 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlsfio.h, $(PERL_INC)perlvars.h
1782 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1783 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1784 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1785 $(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h, $(PERL_INC)utf8.h
1786 $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h
1788 ' if $self->{OBJECT};
1790 if ($self->{PERL_SRC}) {
1792 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1793 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1794 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1795 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1796 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1797 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1798 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1800 # Check for unpropagated config.sh changes. Should never happen.
1801 # We do NOT just update config.h because that is not sufficient.
1802 # An out of date config.h is not fatal but complains loudly!
1803 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1806 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1807 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1808 olddef = F$Environment("Default")
1809 Set Default $(PERL_SRC)
1810 $(MMS)],$mmsquals,);
1811 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1812 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1813 $target =~ s/\Q$prefix/[/;
1814 push(@m," $target");
1816 else { push(@m,' $(MMS$TARGET)'); }
1818 Set Default 'olddef'
1822 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1828 =item makefile (override)
1830 Use VMS commands and quoting.
1837 # We do not know what target was originally specified so we
1838 # must force a manual rerun to be sure. But as it should only
1839 # happen very rarely it is not a significant problem.
1841 $(OBJECT) : $(FIRST_MAKEFILE)
1842 ] if $self->{OBJECT};
1845 # We take a very conservative approach here, but it\'s worth it.
1846 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1847 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1848 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1849 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1850 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1851 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1852 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1853 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1854 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1860 =item find_tests (override)
1866 return -d 't' ? 't/*.t' : '';
1869 =item test (override)
1871 Use VMS commands for handling subdirectories.
1876 my($self, %attribs) = @_;
1877 my($tests) = $attribs{TESTS} || $self->find_tests;
1881 TEST_TYPE = test_\$(LINKTYPE)
1885 test :: \$(TEST_TYPE)
1888 testdb :: testdb_\$(LINKTYPE)
1892 foreach(@{$self->{DIR}}){
1893 my($vmsdir) = $self->fixpath($_,1);
1894 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1895 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1897 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1898 unless $tests or -f "test.pl" or @{$self->{DIR}};
1901 push(@m, "test_dynamic :: pure_all\n");
1902 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1903 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
1904 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1907 push(@m, "testdb_dynamic :: pure_all\n");
1908 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1911 # Occasionally we may face this degenerate target:
1912 push @m, "test_ : test_dynamic\n\n";
1914 if ($self->needs_linking()) {
1915 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1916 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1917 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1919 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1920 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1924 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1925 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1931 =item makeaperl (override)
1933 Undertake to build a new set of Perl images using VMS commands. Since
1934 VMS does dynamic loading, it's not necessary to statically link each
1935 extension into the Perl image, so this isn't the normal build path.
1936 Consequently, it hasn't really been tested, and may well be incomplete.
1943 my($self, %attribs) = @_;
1944 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1945 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1948 # --- MakeMaker makeaperl section ---
1949 MAP_TARGET = $target
1951 return join '', @m if $self->{PARENT};
1953 my($dir) = join ":", @{$self->{DIR}};
1955 unless ($self->{MAKEAPERL}) {
1957 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1958 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1959 $(NOECHO) $(PERLRUNINST) \
1960 Makefile.PL DIR=}, $dir, q{ \
1961 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1962 MAKEAPERL=1 NORECURS=1 };
1964 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1966 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1967 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1975 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1978 # The front matter of the linkcommand...
1979 $linkcmd = join ' ', $Config{'ld'},
1980 grep($_, @Config{qw(large split ldflags ccdlflags)});
1981 $linkcmd =~ s/\s+/ /g;
1983 # Which *.olb files could we make use of...
1984 local(%olbs); # XXX can this be lexical?
1985 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1987 File::Find::find(sub {
1988 return unless m/\Q$self->{LIB_EXT}\E$/;
1989 return if m/^libperl/;
1991 if( exists $self->{INCLUDE_EXT} ){
1996 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2000 # Throw away anything not explicitly marked for inclusion.
2001 # DynaLoader is implied.
2002 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2008 return unless $found;
2010 elsif( exists $self->{EXCLUDE_EXT} ){
2014 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2018 # Throw away anything explicitly marked for exclusion
2019 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2020 return if( $xx eq $excl );
2024 $olbs{$ENV{DEFAULT}} = $_;
2025 }, grep( -d $_, @{$searchdirs || []}));
2027 # We trust that what has been handed in as argument will be buildable
2028 $static = [] unless $static;
2029 @olbs{@{$static}} = (1) x @{$static};
2031 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2032 # Sort the object libraries in inverse order of
2033 # filespec length to try to insure that dependent extensions
2034 # will appear before their parents, so the linker will
2035 # search the parent library to resolve references.
2036 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2037 # references from [.intuit.dwim]dwim.obj can be found
2038 # in [.intuit]intuit.olb).
2039 for (sort { length($a) <=> length($b) } keys %olbs) {
2040 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2041 my($dir) = $self->fixpath($_,1);
2042 my($extralibs) = $dir . "extralibs.ld";
2043 my($extopt) = $dir . $olbs{$_};
2044 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2045 push @optlibs, "$dir$olbs{$_}";
2046 # Get external libraries this extension will need
2047 if (-f $extralibs ) {
2049 open LIST,$extralibs or warn $!,next;
2052 # Include a library in the link only once, unless it's mentioned
2053 # multiple times within a single extension's options file, in which
2054 # case we assume the builder needed to search it again later in the
2056 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2057 $libseen{$_}++; $seenthis{$_}++;
2063 # Get full name of extension for ExtUtils::Miniperl
2065 open OPT,$extopt or die $!;
2067 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2070 push @staticpkgs,$pkg;
2074 # Place all of the external libraries after all of the Perl extension
2075 # libraries in the final link, in order to maximize the opportunity
2076 # for XS code from multiple extensions to resolve symbols against the
2077 # same external library while only including that library once.
2078 push @optlibs, @$extra;
2080 $target = "Perl$Config{'exe_ext'}" unless $target;
2082 ($shrtarget,$targdir) = fileparse($target);
2083 $shrtarget =~ s/^([^.]*)/$1Shr/;
2084 $shrtarget = $targdir . $shrtarget;
2085 $target = "Perlshr.$Config{'dlext'}" unless $target;
2086 $tmp = "[]" unless $tmp;
2087 $tmp = $self->fixpath($tmp,1);
2088 if (@optlibs) { $extralist = join(' ',@optlibs); }
2089 else { $extralist = ''; }
2090 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2091 # that's what we're building here).
2092 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2094 unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2095 print STDOUT "Warning: $libperl not found\n";
2100 if (defined $self->{PERL_SRC}) {
2101 $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2102 } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2104 print STDOUT "Warning: $libperl not found
2105 If you're going to build a static perl binary, make sure perl is installed
2106 otherwise ignore this warning\n";
2109 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2112 # Fill in the target you want to produce if it\'s not perl
2113 MAP_TARGET = ',$self->fixpath($target,0),'
2114 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2115 MAP_LINKCMD = $linkcmd
2116 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2117 MAP_EXTRA = $extralist
2118 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2122 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2123 foreach (@optlibs) {
2124 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2126 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2127 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2130 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2131 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2132 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2133 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2134 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2135 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2136 $(NOECHO) $(SAY) "To remove the intermediate files, say
2137 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2139 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2140 push @m, "# More from the 255-char line length limit\n";
2141 foreach (@staticpkgs) {
2142 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2145 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2146 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2149 # Still more from the 255-char line length limit
2151 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2152 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2153 $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2154 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2155 $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2156 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2160 inst_perl : pure_inst_perl doc_inst_perl
2163 pure_inst_perl : \$(MAP_TARGET)
2164 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2165 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2171 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2172 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2178 # --- Output postprocessing section ---
2180 =item nicetext (override)
2182 Insure that colons marking targets are preceded by space, in order
2183 to distinguish the target delimiter from a colon appearing as
2189 my($self,$text) = @_;
2190 return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
2191 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
2195 =item prefixify (override)
2197 prefixifying on VMS is simple. Each should simply be:
2199 perl_root:[some.dir]
2201 which can just be converted to:
2203 volume:[your.prefix.some.dir]
2205 otherwise you get the default layout.
2207 In effect, your search prefix is ignored and $Config{vms_prefix} is
2213 my($self, $var, $sprefix, $rprefix, $default) = @_;
2214 $default = VMS::Filespec::vmsify($default)
2215 unless $default =~ /\[.*\]/;
2217 (my $var_no_install = $var) =~ s/^install//;
2218 my $path = $self->{uc $var} || $Config{lc $var} ||
2219 $Config{lc $var_no_install};
2222 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
2223 $path = $self->_prefixify_default($rprefix, $default);
2225 elsif( $sprefix eq $rprefix ) {
2226 print STDERR " no new prefix.\n" if $Verbose >= 2;
2230 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
2231 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
2233 my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
2234 if( $path_vol eq $Config{vms_prefix}.':' ) {
2235 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
2237 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
2238 $path = $self->_catprefix($rprefix, $path_dirs);
2241 $path = $self->_prefixify_default($rprefix, $default);
2245 print " now $path\n" if $Verbose >= 2;
2246 return $self->{uc $var} = $path;
2250 sub _prefixify_default {
2251 my($self, $rprefix, $default) = @_;
2253 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
2256 print STDERR "No default!\n" if $Verbose >= 1;
2260 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
2264 return $self->_catprefix($rprefix, $default);
2268 my($self, $rprefix, $default) = @_;
2270 my($rvol, $rdirs) = File::Spec->splitpath($rprefix);
2272 return File::Spec->catpath($rvol,
2273 File::Spec->catdir($rdirs, $default),
2278 return File::Spec->catdir($rdirs, $default);