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 INSTALLPRIVLIB
426 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
427 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
428 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
429 SITELIBEXP SITEARCHEXP ] ) {
430 next unless defined $self->{$macro};
431 $self->{$macro} = $self->fixpath($self->{$macro},1);
433 $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS))
434 if ($self->{PERL_SRC});
439 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
440 next unless defined $self->{$macro};
441 $self->{$macro} = $self->fixpath($self->{$macro},0);
445 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
446 INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
447 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
448 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
449 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
450 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
451 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
452 FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST
453 PERL_CORE NOECHO NOOP
455 next unless defined $self->{$macro};
456 push @m, "$macro = $self->{$macro}\n";
461 VERSION_MACRO = VERSION
462 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
463 XS_VERSION_MACRO = XS_VERSION
464 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
466 MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
467 MM_VERSION = $ExtUtils::MakeMaker::VERSION
468 MM_REVISION = $ExtUtils::MakeMaker::Revision
469 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
471 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
472 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
473 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
474 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
478 FULLEXT VERSION_FROM OBJECT LDFROM
480 next unless defined $self->{$tmp};
481 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
485 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
487 next unless defined $self->{$tmp};
488 push @m, "$tmp = $self->{$tmp}\n";
491 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
492 # Where is the space coming from? --jhi
493 next unless $self ne " " && defined $self->{$tmp};
495 for $key (keys %{$self->{$tmp}}) {
496 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
498 $self->{$tmp} = \%tmp;
501 for my $tmp (qw/ C O_FILES H /) {
502 next unless defined $self->{$tmp};
504 for $val (@{$self->{$tmp}}) {
505 push(@tmp,$self->fixpath($val,0));
507 $self->{$tmp} = \@tmp;
512 # Handy lists of source code files:
513 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
514 C_FILES = ',$self->wraplist(@{$self->{C}}),'
515 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
516 H_FILES = ',$self->wraplist(@{$self->{H}}),'
517 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
518 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
523 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
525 next unless defined $self->{$tmp};
526 push @m, "$tmp = $self->{$tmp}\n";
534 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
536 # Here is the Config.pm that we are using/depend on
537 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
539 # Where to put things:
540 INST_LIBDIR = $self->{INST_LIBDIR}
541 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
543 INST_AUTODIR = $self->{INST_AUTODIR}
544 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
547 if ($self->has_link_code()) {
549 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
550 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
551 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
554 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
559 EXPORT_LIST = $(BASEEXT).opt
560 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
564 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
565 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
567 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
569 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
575 =item cflags (override)
577 Bypass shell script and produce qualifiers for CC directly (but warn
578 user if a shell script for this extension exists). Fold multiple
579 /Defines into one, since some C compilers pay attention to only one
580 instance of this qualifier on the command line.
585 my($self,$libperl) = @_;
586 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
587 my($definestr,$undefstr,$flagoptstr) = ('','','');
588 my($incstr) = '/Include=($(PERL_INC)';
591 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
592 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
593 " required to modify CC command for $self->{'BASEEXT'}\n"
596 if ($quals =~ / -[DIUOg]/) {
597 while ($quals =~ / -([Og])(\d*)\b/) {
598 my($type,$lvl) = ($1,$2);
599 $quals =~ s/ -$type$lvl\b\s*//;
600 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
601 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
603 while ($quals =~ / -([DIU])(\S+)/) {
604 my($type,$def) = ($1,$2);
605 $quals =~ s/ -$type$def\s*//;
607 if ($type eq 'D') { $definestr .= qq["$def",]; }
608 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
609 else { $undefstr .= qq["$def",]; }
612 if (length $quals and $quals !~ m!/!) {
613 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
616 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
617 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
618 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
619 # Deal with $self->{DEFINE} here since some C compilers pay attention
620 # to only one /Define clause on command line, so we have to
621 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
622 # ($self->{DEFINE} has already been VMSified in constants() above)
623 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
624 for my $type (qw(Def Undef)) {
626 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
628 $term =~ s:^\((.+)\)$:$1:;
631 if ($type eq 'Def') {
632 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
635 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
636 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
640 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
642 # Likewise with $self->{INC} and /Include
643 if ($self->{'INC'}) {
644 my(@includes) = split(/\s+/,$self->{INC});
645 foreach (@includes) {
647 $incstr .= ','.$self->fixpath($_,1);
650 $quals .= "$incstr)";
651 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
652 $self->{CCFLAGS} = $quals;
654 $self->{PERLTYPE} ||= '';
656 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
657 if ($self->{OPTIMIZE} !~ m!/!) {
658 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
659 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
660 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
663 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
664 $self->{OPTIMIZE} = '/Optimize';
668 return $self->{CFLAGS} = qq{
669 CCFLAGS = $self->{CCFLAGS}
670 OPTIMIZE = $self->{OPTIMIZE}
671 PERLTYPE = $self->{PERLTYPE}
677 =item const_cccmd (override)
679 Adds directives to point C preprocessor to the right place when
680 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
681 command line a bit differently than MM_Unix method.
686 my($self,$libperl) = @_;
689 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
690 return '' unless $self->needs_linking();
691 if ($Config{'vms_cc_type'} eq 'gcc') {
694 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
696 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
699 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
700 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
705 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
706 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
707 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
710 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
712 $self->{CONST_CCCMD} = join('',@m);
715 =item pm_to_blib (override)
717 DCL I<still> accepts a maximum of 255 characters on a command
718 line, so we write the (potentially) long list of file names
719 to a temp file, then persuade Perl to read it instead of the
720 command line to find args.
726 my($line,$from,$to,@m);
727 my($autodir) = File::Spec->catdir($self->{INST_LIB},'auto');
728 my(@files) = @{$self->{PM_TO_BLIB}};
732 # Dummy target to match Unix target name; we use pm_to_blib.ts as
733 # timestamp file to avoid repeated invocations under VMS
734 pm_to_blib : pm_to_blib.ts
737 # As always, keep under DCL's 255-char limit
738 pm_to_blib.ts : $(TO_INST_PM)
739 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
742 $line = ''; # avoid uninitialized var warning
743 while ($from = shift(@files),$to = shift(@files)) {
744 $line .= " $from $to";
745 if (length($line) > 128) {
746 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
750 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
752 push(@m,q[ $(PERLRUN) "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
754 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
755 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
761 =item tool_autosplit (override)
763 Use VMS-style quoting on command line.
768 my($self, %attribs) = @_;
770 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
772 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
773 AUTOSPLITFILE = $(PERLRUN) -e "use AutoSplit;}.$asl.q{autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
777 =item tool_sxubpp (override)
779 Use VMS-style quoting on xsubpp command line.
785 return '' unless $self->needs_linking;
786 my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils');
787 # drop back to old location if xsubpp is not in new location yet
788 $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp'));
789 my(@tmdeps) = '$(XSUBPPDIR)typemap';
790 if( $self->{TYPEMAPS} ){
792 foreach $typemap (@{$self->{TYPEMAPS}}){
794 warn "Typemap $typemap not found.\n";
797 push(@tmdeps, $self->fixpath($typemap,0));
801 push(@tmdeps, "typemap") if -f "typemap";
802 my(@tmargs) = map("-typemap $_", @tmdeps);
803 if( exists $self->{XSOPT} ){
804 unshift( @tmargs, $self->{XSOPT} );
807 if ($Config{'ldflags'} &&
808 $Config{'ldflags'} =~ m!/Debug!i &&
809 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
810 unshift(@tmargs,'-nolinenumbers');
812 my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp'));
814 # What are the correct thresholds for version 1 && 2 Paul?
815 if ( $xsubpp_version > 1.923 ){
816 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
818 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
819 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
820 Your version of xsubpp is $xsubpp_version and cannot handle this.
821 Please upgrade to a more recent version of xsubpp.
824 $self->{XSPROTOARG} = "";
830 XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
831 XSPROTOARG = $self->{XSPROTOARG}
837 =item xsubpp_version (override)
839 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
840 rather than Unix rules ($sts == 0 ==E<gt> good).
846 my($self,$xsubpp) = @_;
848 return '' unless $self->needs_linking;
850 # try to figure out the version number of the xsubpp on the system
852 # first try the -v flag, introduced in 1.921 & 2.000a2
854 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
855 print "Running: $command\n" if $Verbose;
856 $version = `$command` ;
859 warn "Running '$command' exits with status $?";
863 return $1 if $version =~ /^xsubpp version (.*)/ ;
865 # nope, then try something else
868 my ($file) = 'temp' ;
869 $counter++ while -e "$file$counter"; # don't overwrite anything
873 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
875 MODULE = fred PACKAGE = fred
884 $command = "$self->{PERLRUN} $xsubpp $file";
885 print "Running: $command\n" if $Verbose;
886 my $text = `$command` ;
889 warn "Running '$command' exits with status $?";
893 # gets 1.2 -> 1.92 and 2.000a1
894 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
896 # it is either 1.0 or 1.1
897 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
899 # none of the above, so 1.0
903 =item tools_other (override)
905 Adds a few MM[SK] macros, and shortens some the installatin commands,
906 in order to stay under DCL's 255-character limit. Also changes
907 EQUALIZE_TIMESTAMP to set revision date of target file to one second
908 later than source file, since MMK interprets precisely equal revision
909 dates for a source and target file as a sign that the target needs
917 # Assumes \$(MMS) invokes MMS or MMK
918 # (It is assumed in some cases later that the default makefile name
919 # (Descrip.MMS for MM[SK]) is used.)
920 USEMAKEFILE = /Descrip=
923 MAKEFILE = Descrip.MMS
925 TOUCH = $self->{TOUCH}
926 CHMOD = $self->{CHMOD}
930 RM_RF = $self->{RM_RF}
931 SAY = Write Sys\$Output
932 UMASK_NULL = $self->{UMASK_NULL}
933 MKPATH = Create/Directory
934 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
935 !. ($self->{PARENT} ? '' :
936 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
937 MOD_INSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
938 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]"
939 UNINSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
943 =item dist (override)
945 Provide VMSish defaults for some values, then hand off to
946 default MM_Unix method.
951 my($self, %attribs) = @_;
952 $attribs{VERSION} ||= $self->{VERSION_SYM};
953 $attribs{NAME} ||= $self->{DISTNAME};
954 $attribs{ZIPFLAGS} ||= '-Vu';
955 $attribs{COMPRESS} ||= 'gzip';
956 $attribs{SUFFIX} ||= '-gz';
957 $attribs{SHAR} ||= 'vms_share';
958 $attribs{DIST_DEFAULT} ||= 'zipdist';
960 # Sanitize these for use in $(DISTVNAME) filespec
961 $attribs{VERSION} =~ s/[^\w\$]/_/g;
962 $attribs{NAME} =~ s/[^\w\$]/-/g;
964 $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)';
966 return $self->SUPER::dist(%attribs);
971 Use VMS syntax on command line. In particular, $(DEFINE) and
972 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
978 return '' unless $self->needs_linking();
981 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
984 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
987 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
992 =item xs_c (override)
1000 return '' unless $self->needs_linking();
1003 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1007 =item xs_o (override)
1009 Use MM[SK] macros, and VMS command line for C compiler.
1013 sub xs_o { # many makes are too dumb to use xs_c then c_o
1015 return '' unless $self->needs_linking();
1018 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1019 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1023 =item top_targets (override)
1025 Path seperator differences.
1033 all :: pure_all manifypods
1036 pure_all :: config pm_to_blib subdirs linkext
1039 subdirs :: $(MYEXTLIB)
1042 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1045 config :: $(INST_ARCHAUTODIR).exists
1048 config :: $(INST_AUTODIR).exists
1052 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1053 if (%{$self->{MAN1PODS}}) {
1055 config :: $(INST_MAN1DIR).exists
1058 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1060 if (%{$self->{MAN3PODS}}) {
1062 config :: $(INST_MAN3DIR).exists
1065 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1069 $(O_FILES) : $(H_FILES)
1070 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1074 perldoc ExtUtils::MakeMaker
1080 =item dlsyms (override)
1082 Create VMS linker options files specifying universal symbols for this
1083 extension's shareable image, and listing other shareable images or
1084 libraries to which it should be linked.
1089 my($self,%attribs) = @_;
1091 return '' unless $self->needs_linking();
1093 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1094 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1095 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1098 unless ($self->{SKIPHASH}{'dynamic'}) {
1100 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1106 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1108 ') unless $self->{SKIPHASH}{'static'};
1111 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1112 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1114 $(BASEEXT).opt : Makefile.PL
1115 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
1116 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1117 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1118 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1120 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1121 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1122 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1123 push @m, ($Config{d_vms_case_sensitive_symbols}
1124 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1126 else { # We don't have a "main" object file, so pull 'em all in
1127 # Upcase module names if linker is being case-sensitive
1128 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1129 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1130 s[\$\(\w+_EXT\)][]; # even as a macro
1131 s/.*[:>\/\]]//; # Trim off dir spec
1132 $upcase ? uc($_) : $_;
1133 } split ' ', $self->eliminate_macros($self->{OBJECT});
1134 my($tmp,@lines,$elt) = '';
1135 $tmp = shift @omods;
1136 foreach $elt (@omods) {
1138 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1141 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1143 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1145 if (length $self->{LDLOADLIBS}) {
1146 my($lib); my($line) = '';
1147 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1148 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1149 if (length($line) + length($lib) > 160) {
1150 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1151 $line = $lib . '\n';
1153 else { $line .= $lib . '\n'; }
1155 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1162 =item dynamic_lib (override)
1164 Use VMS Link command.
1169 my($self, %attribs) = @_;
1170 return '' unless $self->needs_linking(); #might be because of a subdir
1172 return '' unless $self->has_link_code();
1174 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1175 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1176 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1180 OTHERLDFLAGS = $otherldflags
1181 INST_DYNAMIC_DEP = $inst_dynamic_dep
1185 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1186 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1187 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1188 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1191 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1195 =item dynamic_bs (override)
1197 Use VMS-style quoting on Mkbootstrap command line.
1202 my($self, %attribs) = @_;
1205 ' unless $self->has_link_code();
1207 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1209 # As MakeMaker mkbootstrap might not write a file (if none is required)
1210 # we use touch to prevent make continually trying to remake it.
1211 # The DynaLoader only reads a non-empty file.
1212 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1213 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1214 $(NOECHO) $(PERLRUN) -
1215 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1216 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1218 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1219 $(NOECHO) $(RM_RF) $(INST_BOOT)
1220 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1224 =item static_lib (override)
1226 Use VMS commands to manipulate object library.
1232 return '' unless $self->needs_linking();
1237 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1241 # Rely on suffix rule for update action
1242 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1244 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1246 # If this extension has its own library (eg SDBM_File)
1247 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1248 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1250 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1252 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1253 # 'cause it's a library and you can't stick them in other libraries.
1254 # In that case, we use $OBJECT instead and hope for the best
1255 if ($self->{MYEXTLIB}) {
1256 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1258 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1261 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1262 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1263 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1265 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1270 =item manifypods (override)
1272 Use VMS-style quoting on command line, and VMS logical name
1273 to specify fallback location at build time if we can't find pod2man.
1279 my($self, %attribs) = @_;
1280 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1283 if (defined $self->{PERL_SRC}) {
1284 $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
1286 $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
1288 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1289 # No pod2man but some MAN3PODS to be installed
1292 Warning: I could not locate your pod2man program. As a last choice,
1293 I will look for the file to which the logical name POD2MAN
1294 points when MMK is invoked.
1297 $pod2man_exe = "pod2man";
1301 qq[POD2MAN_EXE = $pod2man_exe\n],
1302 q[POD2MAN = $(PERLRUN) "-MPod::Man" -we "%m=@ARGV;for(keys %m){" -
1303 -e "Pod::Man->new->parse_from_file($_,$m{$_}) }"
1305 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1306 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1308 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1309 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1310 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1312 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1313 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1314 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1320 =item processPL (override)
1322 Use VMS-style quoting on command line.
1328 return "" unless $self->{PL_FILES};
1330 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1331 my $list = ref($self->{PL_FILES}->{$plfile})
1332 ? $self->{PL_FILES}->{$plfile}
1333 : [$self->{PL_FILES}->{$plfile}];
1334 foreach my $target (@$list) {
1335 my $vmsplfile = vmsify($plfile);
1336 my $vmsfile = vmsify($target);
1341 $vmsfile :: $vmsplfile
1342 ",' $(PERLRUNINST) '," $vmsplfile $vmsfile
1349 =item installbin (override)
1351 Stay under DCL's 255 character command line limit once again by
1352 splitting potentially long list of files across multiple lines
1353 in C<realclean> target.
1359 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1360 return '' unless @{$self->{EXE_FILES}};
1361 my(@m, $from, $to, %fromto, @to, $line);
1362 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1363 for $from (@exefiles) {
1364 my($path) = '$(INST_SCRIPT)' . basename($from);
1365 local($_) = $path; # backward compatibility
1366 $to = $self->libscan($path);
1367 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1368 $fromto{$from} = vmsify($to);
1370 @to = values %fromto;
1372 EXE_FILES = @exefiles
1376 $line = ''; #avoid unitialized var warning
1378 if (length($line) + length($to) > 80) {
1379 push @m, "\t\$(RM_F) $line\n";
1382 else { $line .= " $to"; }
1384 push @m, "\t\$(RM_F) $line\n\n" if $line;
1386 while (($from,$to) = each %fromto) {
1387 last unless defined $from;
1389 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1390 else { ($todir = $to) =~ s/[^\)]+$//; }
1391 $todir = $self->fixpath($todir,1);
1393 $to : $from \$(MAKEFILE) ${todir}.exists
1396 ", $self->dir_target($todir);
1401 =item subdir_x (override)
1403 Use VMS commands to change default directory.
1408 my($self, $subdir) = @_;
1410 $subdir = $self->fixpath($subdir,1);
1414 olddef = F$Environment("Default")
1415 Set Default ',$subdir,'
1416 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1417 Set Default \'olddef\'
1422 =item clean (override)
1424 Split potentially long list of files across multiple commands (in
1425 order to stay under the magic command line limit). Also use MM[SK]
1426 commands for handling subdirectories.
1431 my($self, %attribs) = @_;
1434 # Delete temporary files but do not touch installed files. We don\'t delete
1435 # the Descrip.MMS here so that a later make realclean still has it to use.
1438 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1439 my($vmsdir) = $self->fixpath($dir,1);
1440 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1441 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1443 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1446 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1447 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1448 # a list or a macro that expands to a list.
1449 if ($attribs{FILES}) {
1450 my($word,$key,@filist);
1451 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1452 else { @filist = split /\s+/, $attribs{FILES}; }
1453 foreach $word (@filist) {
1454 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1455 push(@otherfiles, @{$self->{$key}});
1457 else { push(@otherfiles, $word); }
1460 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1461 push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1463 $line = ''; #avoid unitialized var warning
1464 # Occasionally files are repeated several times from different sources
1465 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1467 foreach $file (@otherfiles) {
1468 $file = $self->fixpath($file);
1469 if (length($line) + length($file) > 80) {
1470 push @m, "\t\$(RM_RF) $line\n";
1473 else { $line .= " $file"; }
1475 push @m, "\t\$(RM_RF) $line\n" if $line;
1476 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1480 =item realclean (override)
1482 Guess what we're working around? Also, use MM[SK] for subdirectories.
1487 my($self, %attribs) = @_;
1490 # Delete temporary files (via clean) and also delete installed files
1493 foreach(@{$self->{DIR}}){
1494 my($vmsdir) = $self->fixpath($_,1);
1495 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1496 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1498 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1499 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
1500 # We can't expand several of the MMS macros here, since they don't have
1501 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1502 # combination of macros). In order to stay below DCL's 255 char limit,
1503 # we put only 2 on a line.
1504 my($file,$line,$fcnt);
1505 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1506 if ($self->has_link_code) {
1507 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1509 push(@files, values %{$self->{PM}});
1510 $line = ''; #avoid unitialized var warning
1511 # Occasionally files are repeated several times from different sources
1512 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1513 foreach $file (@files) {
1514 $file = $self->fixpath($file);
1515 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1516 push @m, "\t\$(RM_F) $line\n";
1520 else { $line .= " $file"; }
1522 push @m, "\t\$(RM_F) $line\n" if $line;
1523 if ($attribs{FILES}) {
1524 my($word,$key,@filist,@allfiles);
1525 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1526 else { @filist = split /\s+/, $attribs{FILES}; }
1527 foreach $word (@filist) {
1528 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1529 push(@allfiles, @{$self->{$key}});
1531 else { push(@allfiles, $word); }
1534 # Occasionally files are repeated several times from different sources
1535 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1536 foreach $file (@allfiles) {
1537 $file = $self->fixpath($file);
1538 if (length($line) + length($file) > 80) {
1539 push @m, "\t\$(RM_RF) $line\n";
1542 else { $line .= " $file"; }
1544 push @m, "\t\$(RM_RF) $line\n" if $line;
1546 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1551 =item dist_core (override)
1553 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1554 so C<shdist> target actions are VMS-specific.
1561 dist : $(DIST_DEFAULT)
1562 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1564 zipdist : $(DISTVNAME).zip
1567 tardist : $(DISTVNAME).tar$(SUFFIX)
1570 $(DISTVNAME).zip : distdir
1572 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1573 $(RM_RF) $(DISTVNAME)
1576 $(DISTVNAME).tar$(SUFFIX) : distdir
1579 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1580 $(RM_RF) $(DISTVNAME)
1581 $(COMPRESS) $(DISTVNAME).tar
1586 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1587 $(RM_RF) $(DISTVNAME)
1592 =item dist_test (override)
1594 Use VMS commands to change default directory, and use VMS-style
1595 quoting on command line.
1603 startdir = F$Environment("Default")
1604 Set Default [.$(DISTVNAME)]
1605 $(ABSPERLRUN) Makefile.PL
1606 $(MMS)$(MMSQUALIFIERS)
1607 $(MMS)$(MMSQUALIFIERS) test
1608 Set Default 'startdir'
1612 # --- Test and Installation Sections ---
1614 =item install (override)
1616 Work around DCL's 255 character limit several times,and use
1617 VMS-style command line quoting in a few cases.
1622 my($self, %attribs) = @_;
1625 if ($self->{EXE_FILES}) {
1626 my($line,$file) = ('','');
1627 foreach $file (@{$self->{EXE_FILES}}) {
1629 if (length($line) > 128) {
1630 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1634 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1638 install :: all pure_install doc_install
1641 install_perl :: all pure_perl_install doc_perl_install
1644 install_site :: all pure_site_install doc_site_install
1647 pure_install :: pure_$(INSTALLDIRS)_install
1650 doc_install :: doc_$(INSTALLDIRS)_install
1651 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1653 pure__install : pure_site_install
1654 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1656 doc__install : doc_site_install
1657 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1659 # This hack brought to you by DCL's 255-character command line limit
1660 pure_perl_install ::
1661 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1662 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1663 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1664 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1665 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1666 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1667 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1668 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1669 $(MOD_INSTALL) <.MM_tmp
1670 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1671 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
1674 pure_site_install ::
1675 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1676 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
1677 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1678 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.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->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1689 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1690 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1692 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1693 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1694 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1695 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1696 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1697 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1701 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1702 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1704 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1705 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1706 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1707 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1708 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
1709 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1714 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1717 uninstall_from_perldirs ::
1718 $(NOECHO) $(UNINSTALL) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
1719 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1720 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1721 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1723 uninstall_from_sitedirs ::
1724 $(NOECHO) $(UNINSTALL) ],File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[
1725 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1726 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1727 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1733 =item perldepend (override)
1735 Use VMS-style syntax for files; it's cheaper to just do it directly here
1736 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1737 we have to rebuild Config.pm, use MM[SK] to do it.
1746 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1747 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1748 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1749 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)fakethr.h, $(PERL_INC)form.h
1750 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1751 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1752 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1753 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)opnames.h, $(PERL_INC)patchlevel.h
1754 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlapi.h, $(PERL_INC)perlio.h
1755 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlsfio.h, $(PERL_INC)perlvars.h
1756 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1757 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1758 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1759 $(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h, $(PERL_INC)utf8.h
1760 $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h
1762 ' if $self->{OBJECT};
1764 if ($self->{PERL_SRC}) {
1766 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1767 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
1768 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1769 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1770 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1771 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1772 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1774 # Check for unpropagated config.sh changes. Should never happen.
1775 # We do NOT just update config.h because that is not sufficient.
1776 # An out of date config.h is not fatal but complains loudly!
1777 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1780 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1781 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1782 olddef = F$Environment("Default")
1783 Set Default $(PERL_SRC)
1784 $(MMS)],$mmsquals,);
1785 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1786 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1787 $target =~ s/\Q$prefix/[/;
1788 push(@m," $target");
1790 else { push(@m,' $(MMS$TARGET)'); }
1792 Set Default 'olddef'
1796 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1802 =item makefile (override)
1804 Use VMS commands and quoting.
1811 # We do not know what target was originally specified so we
1812 # must force a manual rerun to be sure. But as it should only
1813 # happen very rarely it is not a significant problem.
1815 $(OBJECT) : $(FIRST_MAKEFILE)
1816 ] if $self->{OBJECT};
1819 # We take a very conservative approach here, but it\'s worth it.
1820 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1821 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1822 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1823 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1824 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1825 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1826 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1827 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1828 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1834 =item test (override)
1836 Use VMS commands for handling subdirectories.
1841 my($self, %attribs) = @_;
1842 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1846 TEST_TYPE = test_\$(LINKTYPE)
1850 test :: \$(TEST_TYPE)
1853 testdb :: testdb_\$(LINKTYPE)
1857 foreach(@{$self->{DIR}}){
1858 my($vmsdir) = $self->fixpath($_,1);
1859 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1860 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1862 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1863 unless $tests or -f "test.pl" or @{$self->{DIR}};
1866 push(@m, "test_dynamic :: pure_all\n");
1867 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1868 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
1869 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1872 push(@m, "testdb_dynamic :: pure_all\n");
1873 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1876 # Occasionally we may face this degenerate target:
1877 push @m, "test_ : test_dynamic\n\n";
1879 if ($self->needs_linking()) {
1880 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1881 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1882 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1884 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1885 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1889 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1890 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1896 =item makeaperl (override)
1898 Undertake to build a new set of Perl images using VMS commands. Since
1899 VMS does dynamic loading, it's not necessary to statically link each
1900 extension into the Perl image, so this isn't the normal build path.
1901 Consequently, it hasn't really been tested, and may well be incomplete.
1908 my($self, %attribs) = @_;
1909 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1910 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1913 # --- MakeMaker makeaperl section ---
1914 MAP_TARGET = $target
1916 return join '', @m if $self->{PARENT};
1918 my($dir) = join ":", @{$self->{DIR}};
1920 unless ($self->{MAKEAPERL}) {
1922 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
1923 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
1924 $(NOECHO) $(PERLRUNINST) \
1925 Makefile.PL DIR=}, $dir, q{ \
1926 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
1927 MAKEAPERL=1 NORECURS=1 };
1929 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
1931 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
1932 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
1940 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1943 # The front matter of the linkcommand...
1944 $linkcmd = join ' ', $Config{'ld'},
1945 grep($_, @Config{qw(large split ldflags ccdlflags)});
1946 $linkcmd =~ s/\s+/ /g;
1948 # Which *.olb files could we make use of...
1949 local(%olbs); # XXX can this be lexical?
1950 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
1952 File::Find::find(sub {
1953 return unless m/\Q$self->{LIB_EXT}\E$/;
1954 return if m/^libperl/;
1956 if( exists $self->{INCLUDE_EXT} ){
1961 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1965 # Throw away anything not explicitly marked for inclusion.
1966 # DynaLoader is implied.
1967 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1973 return unless $found;
1975 elsif( exists $self->{EXCLUDE_EXT} ){
1979 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1983 # Throw away anything explicitly marked for exclusion
1984 foreach $excl (@{$self->{EXCLUDE_EXT}}){
1985 return if( $xx eq $excl );
1989 $olbs{$ENV{DEFAULT}} = $_;
1990 }, grep( -d $_, @{$searchdirs || []}));
1992 # We trust that what has been handed in as argument will be buildable
1993 $static = [] unless $static;
1994 @olbs{@{$static}} = (1) x @{$static};
1996 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1997 # Sort the object libraries in inverse order of
1998 # filespec length to try to insure that dependent extensions
1999 # will appear before their parents, so the linker will
2000 # search the parent library to resolve references.
2001 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2002 # references from [.intuit.dwim]dwim.obj can be found
2003 # in [.intuit]intuit.olb).
2004 for (sort { length($a) <=> length($b) } keys %olbs) {
2005 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2006 my($dir) = $self->fixpath($_,1);
2007 my($extralibs) = $dir . "extralibs.ld";
2008 my($extopt) = $dir . $olbs{$_};
2009 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2010 push @optlibs, "$dir$olbs{$_}";
2011 # Get external libraries this extension will need
2012 if (-f $extralibs ) {
2014 open LIST,$extralibs or warn $!,next;
2017 # Include a library in the link only once, unless it's mentioned
2018 # multiple times within a single extension's options file, in which
2019 # case we assume the builder needed to search it again later in the
2021 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2022 $libseen{$_}++; $seenthis{$_}++;
2028 # Get full name of extension for ExtUtils::Miniperl
2030 open OPT,$extopt or die $!;
2032 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2035 push @staticpkgs,$pkg;
2039 # Place all of the external libraries after all of the Perl extension
2040 # libraries in the final link, in order to maximize the opportunity
2041 # for XS code from multiple extensions to resolve symbols against the
2042 # same external library while only including that library once.
2043 push @optlibs, @$extra;
2045 $target = "Perl$Config{'exe_ext'}" unless $target;
2047 ($shrtarget,$targdir) = fileparse($target);
2048 $shrtarget =~ s/^([^.]*)/$1Shr/;
2049 $shrtarget = $targdir . $shrtarget;
2050 $target = "Perlshr.$Config{'dlext'}" unless $target;
2051 $tmp = "[]" unless $tmp;
2052 $tmp = $self->fixpath($tmp,1);
2053 if (@optlibs) { $extralist = join(' ',@optlibs); }
2054 else { $extralist = ''; }
2055 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2056 # that's what we're building here).
2057 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2059 unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2060 print STDOUT "Warning: $libperl not found\n";
2065 if (defined $self->{PERL_SRC}) {
2066 $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2067 } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2069 print STDOUT "Warning: $libperl not found
2070 If you're going to build a static perl binary, make sure perl is installed
2071 otherwise ignore this warning\n";
2074 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2077 # Fill in the target you want to produce if it\'s not perl
2078 MAP_TARGET = ',$self->fixpath($target,0),'
2079 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2080 MAP_LINKCMD = $linkcmd
2081 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2082 MAP_EXTRA = $extralist
2083 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2087 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2088 foreach (@optlibs) {
2089 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2091 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2092 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2095 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2096 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2097 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2098 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2099 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2100 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2101 $(NOECHO) $(SAY) "To remove the intermediate files, say
2102 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2104 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2105 push @m, "# More from the 255-char line length limit\n";
2106 foreach (@staticpkgs) {
2107 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2110 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2111 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2114 # Still more from the 255-char line length limit
2116 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2117 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2118 $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2119 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2120 $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2121 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2125 inst_perl : pure_inst_perl doc_inst_perl
2128 pure_inst_perl : \$(MAP_TARGET)
2129 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2130 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2136 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2137 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2143 # --- Output postprocessing section ---
2145 =item nicetext (override)
2147 Insure that colons marking targets are preceded by space, in order
2148 to distinguish the target delimiter from a colon appearing as
2155 my($self,$text) = @_;
2156 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;