2 # MakeMaker default methods for VMS
3 # This package is inserted into @ISA of MakeMaker's MM before the
4 # built-in ExtUtils::MM_Unix methods if MakeMaker.pm is run under VMS.
6 # Author: Charles Bailey bailey@newman.upenn.edu
8 package ExtUtils::MM_VMS;
18 our($Revision, @ISA, $VERSION, $Verbose);
19 # All on one line so MakeMaker can see it.
20 ($VERSION) = ($Revision = '5.56 (27-Apr-1999)') =~ /^([\d.]+)/;
22 unshift @MM::ISA, 'ExtUtils::MM_VMS';
24 require ExtUtils::MakeMaker;
25 ExtUtils::MakeMaker->import('$Verbose', '&neatvalue');
29 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
33 use ExtUtils::MM_VMS; # Done internally by ExtUtils::MakeMaker if needed
37 See ExtUtils::MM_Unix for a documentation of the methods provided
38 there. This package overrides the implementation of these methods, not
41 =head2 Methods always loaded
47 Converts a list into a string wrapped at approximately 80 columns.
53 my($line,$hlen) = ('',0);
57 # Perl bug -- seems to occasionally insert extra elements when
58 # traversing array (scalar(@array) doesn't show them, but
59 # foreach(@array) does) (5.00307)
60 next unless $word =~ /\w/;
61 $line .= ' ' if length($line);
62 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
64 $hlen += length($word) + 2;
69 =item rootdir (override)
71 Returns a string representing of the root directory.
76 return File::Spec->rootdir();'
79 package ExtUtils::MM_VMS;
81 sub ExtUtils::MM_VMS::ext;
82 sub ExtUtils::MM_VMS::guess_name;
83 sub ExtUtils::MM_VMS::find_perl;
84 sub ExtUtils::MM_VMS::path;
85 sub ExtUtils::MM_VMS::maybe_command;
86 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
87 sub ExtUtils::MM_VMS::perl_script;
88 sub ExtUtils::MM_VMS::file_name_is_absolute;
89 sub ExtUtils::MM_VMS::replace_manpage_separator;
90 sub ExtUtils::MM_VMS::init_others;
91 sub ExtUtils::MM_VMS::constants;
92 sub ExtUtils::MM_VMS::cflags;
93 sub ExtUtils::MM_VMS::const_cccmd;
94 sub ExtUtils::MM_VMS::pm_to_blib;
95 sub ExtUtils::MM_VMS::tool_autosplit;
96 sub ExtUtils::MM_VMS::tool_xsubpp;
97 sub ExtUtils::MM_VMS::xsubpp_version;
98 sub ExtUtils::MM_VMS::tools_other;
99 sub ExtUtils::MM_VMS::dist;
100 sub ExtUtils::MM_VMS::c_o;
101 sub ExtUtils::MM_VMS::xs_c;
102 sub ExtUtils::MM_VMS::xs_o;
103 sub ExtUtils::MM_VMS::top_targets;
104 sub ExtUtils::MM_VMS::dlsyms;
105 sub ExtUtils::MM_VMS::dynamic_lib;
106 sub ExtUtils::MM_VMS::dynamic_bs;
107 sub ExtUtils::MM_VMS::static_lib;
108 sub ExtUtils::MM_VMS::manifypods;
109 sub ExtUtils::MM_VMS::processPL;
110 sub ExtUtils::MM_VMS::installbin;
111 sub ExtUtils::MM_VMS::subdir_x;
112 sub ExtUtils::MM_VMS::clean;
113 sub ExtUtils::MM_VMS::realclean;
114 sub ExtUtils::MM_VMS::dist_basics;
115 sub ExtUtils::MM_VMS::dist_core;
116 sub ExtUtils::MM_VMS::dist_dir;
117 sub ExtUtils::MM_VMS::dist_test;
118 sub ExtUtils::MM_VMS::install;
119 sub ExtUtils::MM_VMS::perldepend;
120 sub ExtUtils::MM_VMS::makefile;
121 sub ExtUtils::MM_VMS::test;
122 sub ExtUtils::MM_VMS::test_via_harness;
123 sub ExtUtils::MM_VMS::test_via_script;
124 sub ExtUtils::MM_VMS::makeaperl;
125 sub ExtUtils::MM_VMS::ext;
126 sub ExtUtils::MM_VMS::nicetext;
131 if (defined fileno(DATA)) {
132 my $fh = select DATA;
133 my $o = $/; # For future reads from the file.
145 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
147 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
156 # This isn't really an override. It's just here because ExtUtils::MM_VMS
157 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
158 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
159 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
161 require ExtUtils::Liblist;
162 ExtUtils::Liblist::Kid::ext(@_);
167 =head2 SelfLoaded methods
169 Those methods which override default MM_Unix methods are marked
170 "(override)", while methods unique to MM_VMS are marked "(specific)".
171 For overridden methods, documentation is limited to an explanation
172 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
173 documentation for more details.
177 =item guess_name (override)
179 Try to determine name of extension being built. We begin with the name
180 of the current directory. Since VMS filenames are case-insensitive,
181 however, we look for a F<.pm> file whose name matches that of the current
182 directory (presumably the 'main' F<.pm> file for this extension), and try
183 to find a C<package> statement from which to obtain the Mixed::Case
190 my($defname,$defpm,@pm,%xs,$pm);
193 $defname = basename(fileify($ENV{'DEFAULT'}));
194 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
196 # Fallback in case for some reason a user has copied the files for an
197 # extension into a working directory whose name doesn't reflect the
198 # extension's name. We'll use the name of a unique .pm file, or the
199 # first .pm file with a matching .xs file.
200 if (not -e "${defpm}.pm") {
201 @pm = map { s/.pm$//; $_ } glob('*.pm');
202 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
204 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
205 if (%xs) { foreach $pm (@pm) { $defpm = $pm, last if exists $xs{$pm}; } }
208 if (open(PM,"${defpm}.pm")){
210 if (/^\s*package\s+([^;]+)/i) {
215 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
216 "defaulting package name to $defname\n"
221 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
222 "defaulting package name to $defname\n";
224 $defname =~ s#[\d.\-_]+$##;
228 =item find_perl (override)
230 Use VMS file specification syntax and CLI commands to find and
236 my($self, $ver, $names, $dirs, $trace) = @_;
237 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
241 # Check in relative directories first, so we pick up the current
242 # version of Perl if we're running MakeMaker as part of the main build.
243 @sdirs = sort { my($absa) = File::Spec->file_name_is_absolute($a);
244 my($absb) = File::Spec->file_name_is_absolute($b);
245 if ($absa && $absb) { return $a cmp $b }
246 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
248 # Check miniperl before perl, and check names likely to contain
249 # version numbers before "generic" names, so we pick up an
250 # executable that's less likely to be from an old installation.
251 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
252 my($bb) = $b =~ m!([^:>\]/]+)$!;
253 my($ahasdir) = (length($a) - length($ba) > 0);
254 my($bhasdir) = (length($b) - length($bb) > 0);
255 if ($ahasdir and not $bhasdir) { return 1; }
256 elsif ($bhasdir and not $ahasdir) { return -1; }
257 else { $bb =~ /\d/ <=> $ba =~ /\d/
258 or substr($ba,0,1) cmp substr($bb,0,1)
259 or length($bb) <=> length($ba) } } @$names;
260 # Image names containing Perl version use '_' instead of '.' under VMS
261 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
263 print "Looking for perl $ver by these names:\n";
264 print "\t@snames,\n";
265 print "in these dirs:\n";
268 foreach $dir (@sdirs){
269 next unless defined $dir; # $self->{PERL_SRC} may be undefined
270 $inabs++ if File::Spec->file_name_is_absolute($dir);
272 # We've covered relative dirs; everything else is an absolute
273 # dir (probably an installed location). First, we'll try potential
274 # command names, to see whether we can avoid a long MCR expression.
275 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
276 $inabs++; # Should happen above in next $dir, but just in case . . .
278 foreach $name (@snames){
279 if ($name !~ m![/:>\]]!) { push(@cand,File::Spec->catfile($dir,$name)); }
280 else { push(@cand,$self->fixpath($name,0)); }
283 foreach $name (@cand) {
284 print "Checking $name\n" if ($trace >= 2);
285 # If it looks like a potential command, try it without the MCR
286 if ($name =~ /^[\w\-\$]+$/) {
287 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
288 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
289 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
291 $rslt = `\@temp_mmvms.com` ;
292 unlink('temp_mmvms.com');
293 if ($rslt =~ /VER_OK/) {
294 print "Using PERL=$name\n" if $trace;
298 next unless $vmsfile = $self->maybe_command($name);
299 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
300 print "Executing $vmsfile\n" if ($trace >= 2);
301 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
302 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
303 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
305 $rslt = `\@temp_mmvms.com`;
306 unlink('temp_mmvms.com');
307 if ($rslt =~ /VER_OK/) {
308 print "Using PERL=MCR $vmsfile\n" if $trace;
309 return "MCR $vmsfile";
312 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
313 0; # false and not empty
316 =item path (override)
318 Translate logical name DCL$PATH as a searchlist, rather than trying
319 to C<split> string value of C<$ENV{'PATH'}>.
324 return File::Spec->path();
327 =item maybe_command (override)
329 Follows VMS naming conventions for executable files.
330 If the name passed in doesn't exactly match an executable file,
331 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
332 to check for DCL procedure. If this fails, checks directories in DCL$PATH
333 and finally F<Sys$System:> for an executable file having the name specified,
334 with or without the F<.Exe>-equivalent suffix.
339 my($self,$file) = @_;
340 return $file if -x $file && ! -d _;
342 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
344 if ($file !~ m![/:>\]]!) {
345 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
346 $dir = $ENV{"DCL\$PATH;$i"};
347 $dir .= ':' unless $dir =~ m%[\]:]$%;
350 push(@dirs,'Sys$System:');
351 foreach $dir (@dirs) {
352 my $sysfile = "$dir$file";
353 foreach $ext (@exts) {
354 return $file if -x "$sysfile$ext" && ! -d _;
361 =item maybe_command_in_dirs (override)
363 Uses DCL argument quoting on test command line.
367 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
368 my($self, $names, $dirs, $trace, $ver) = @_;
370 foreach $dir (@$dirs){
371 next unless defined $dir; # $self->{PERL_SRC} may be undefined
372 foreach $name (@$names){
374 if (File::Spec->file_name_is_absolute($name)) {
377 $abs = File::Spec->catfile($dir, $name);
379 print "Checking $abs for $name\n" if ($trace >= 2);
380 next unless $tryabs = $self->maybe_command($abs);
381 print "Substituting $tryabs instead of $abs\n"
382 if ($trace >= 2 and $tryabs ne $abs);
385 print "Executing $abs\n" if ($trace >= 2);
386 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
387 print "Using $abs\n" if $trace;
390 } else { # Do not look for perl
397 =item perl_script (override)
399 If name passed in doesn't specify a readable file, appends F<.com> or
400 F<.pl> and tries again, since it's customary to have file types on all files
406 my($self,$file) = @_;
407 return $file if -r $file && ! -d _;
408 return "$file.com" if -r "$file.com";
409 return "$file.pl" if -r "$file.pl";
413 =item file_name_is_absolute (override)
415 Checks for VMS directory spec as well as Unix separators.
419 sub file_name_is_absolute {
421 return File::Spec->file_name_is_absolute(@_);
424 =item replace_manpage_separator
426 Use as separator a character which is legal in a VMS-syntax file name.
430 sub replace_manpage_separator {
432 $man = unixify($man);
437 =item init_others (override)
439 Provide VMS-specific forms of various utility commands, then hand
440 off to the default MM_Unix method.
447 $self->{NOOP} = 'Continue';
448 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
449 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
450 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
451 $self->{NOECHO} ||= '@ ';
452 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
453 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
454 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
455 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
456 $self->{CP} = 'Copy/NoConfirm';
457 $self->{MV} = 'Rename/NoConfirm';
458 $self->{UMASK_NULL} = '! ';
459 &ExtUtils::MM_Unix::init_others;
462 =item constants (override)
464 Fixes up numerous file and directory macros to insure VMS syntax
465 regardless of input syntax. Also adds a few VMS-specific macros
466 and makes lists of files comma-separated.
474 # Be kind about case for pollution
475 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
477 if ($self->{DEFINE} ne '') {
478 my(@terms) = split(/\s+/,$self->{DEFINE});
480 foreach $def (@terms) {
483 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
484 if ($1 eq 'U') { $targ = \@udefs; }
485 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
486 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
489 $def =~ s/"/""/g; # Protect existing " from DCL
490 $def = qq["$def"]; # and quote to prevent parsing of =
494 $self->{DEFINE} = '';
495 if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; }
496 if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; }
499 if ($self->{OBJECT} =~ /\s/) {
500 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
501 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
503 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
506 # Fix up directory specs
507 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
509 foreach $macro ( qw [
510 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
511 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
512 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
513 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
514 SITELIBEXP SITEARCHEXP ] ) {
515 next unless defined $self->{$macro};
516 $self->{$macro} = $self->fixpath($self->{$macro},1);
518 $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS))
519 if ($self->{PERL_SRC});
524 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
525 next unless defined $self->{$macro};
526 $self->{$macro} = $self->fixpath($self->{$macro},0);
530 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
531 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
532 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
533 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
534 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
535 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
536 PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS
539 next unless defined $self->{$macro};
540 push @m, "$macro = $self->{$macro}\n";
545 VERSION_MACRO = VERSION
546 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
547 XS_VERSION_MACRO = XS_VERSION
548 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
550 MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
551 MM_VERSION = $ExtUtils::MakeMaker::VERSION
552 MM_REVISION = $ExtUtils::MakeMaker::Revision
553 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
555 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
556 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
557 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
558 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
562 FULLEXT VERSION_FROM OBJECT LDFROM
564 next unless defined $self->{$tmp};
565 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
569 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
571 next unless defined $self->{$tmp};
572 push @m, "$tmp = $self->{$tmp}\n";
575 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
576 # Where is the space coming from? --jhi
577 next unless $self ne " " && defined $self->{$tmp};
579 for $key (keys %{$self->{$tmp}}) {
580 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
582 $self->{$tmp} = \%tmp;
585 for my $tmp (qw/ C O_FILES H /) {
586 next unless defined $self->{$tmp};
588 for $val (@{$self->{$tmp}}) {
589 push(@tmp,$self->fixpath($val,0));
591 $self->{$tmp} = \@tmp;
596 # Handy lists of source code files:
597 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
598 C_FILES = ',$self->wraplist(@{$self->{C}}),'
599 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
600 H_FILES = ',$self->wraplist(@{$self->{H}}),'
601 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
602 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
607 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
609 next unless defined $self->{$tmp};
610 push @m, "$tmp = $self->{$tmp}\n";
615 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
617 # Here is the Config.pm that we are using/depend on
618 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
620 # Where to put things:
621 INST_LIBDIR = $self->{INST_LIBDIR}
622 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
624 INST_AUTODIR = $self->{INST_AUTODIR}
625 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
628 if ($self->has_link_code()) {
630 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
631 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
632 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
635 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
640 EXPORT_LIST = $(BASEEXT).opt
641 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
645 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
646 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
648 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
650 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
656 =item cflags (override)
658 Bypass shell script and produce qualifiers for CC directly (but warn
659 user if a shell script for this extension exists). Fold multiple
660 /Defines into one, since some C compilers pay attention to only one
661 instance of this qualifier on the command line.
666 my($self,$libperl) = @_;
667 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
668 my($definestr,$undefstr,$flagoptstr) = ('','','');
669 my($incstr) = '/Include=($(PERL_INC)';
672 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
673 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
674 " required to modify CC command for $self->{'BASEEXT'}\n"
677 if ($quals =~ / -[DIUOg]/) {
678 while ($quals =~ / -([Og])(\d*)\b/) {
679 my($type,$lvl) = ($1,$2);
680 $quals =~ s/ -$type$lvl\b\s*//;
681 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
682 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
684 while ($quals =~ / -([DIU])(\S+)/) {
685 my($type,$def) = ($1,$2);
686 $quals =~ s/ -$type$def\s*//;
688 if ($type eq 'D') { $definestr .= qq["$def",]; }
689 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
690 else { $undefstr .= qq["$def",]; }
693 if (length $quals and $quals !~ m!/!) {
694 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
697 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
698 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
699 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
700 # Deal with $self->{DEFINE} here since some C compilers pay attention
701 # to only one /Define clause on command line, so we have to
702 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
703 # ($self->{DEFINE} has already been VMSified in constants() above)
704 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
705 for my $type (qw(Def Undef)) {
707 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
709 $term =~ s:^\((.+)\)$:$1:;
712 if ($type eq 'Def') {
713 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
716 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
717 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
721 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
723 # Likewise with $self->{INC} and /Include
724 if ($self->{'INC'}) {
725 my(@includes) = split(/\s+/,$self->{INC});
726 foreach (@includes) {
728 $incstr .= ','.$self->fixpath($_,1);
731 $quals .= "$incstr)";
732 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
733 $self->{CCFLAGS} = $quals;
735 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
736 if ($self->{OPTIMIZE} !~ m!/!) {
737 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
738 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
739 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
742 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
743 $self->{OPTIMIZE} = '/Optimize';
747 return $self->{CFLAGS} = qq{
748 CCFLAGS = $self->{CCFLAGS}
749 OPTIMIZE = $self->{OPTIMIZE}
750 PERLTYPE = $self->{PERLTYPE}
756 =item const_cccmd (override)
758 Adds directives to point C preprocessor to the right place when
759 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
760 command line a bit differently than MM_Unix method.
765 my($self,$libperl) = @_;
768 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
769 return '' unless $self->needs_linking();
770 if ($Config{'vms_cc_type'} eq 'gcc') {
773 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
775 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
778 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
779 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
784 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
785 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
786 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
789 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
791 $self->{CONST_CCCMD} = join('',@m);
794 =item pm_to_blib (override)
796 DCL I<still> accepts a maximum of 255 characters on a command
797 line, so we write the (potentially) long list of file names
798 to a temp file, then persuade Perl to read it instead of the
799 command line to find args.
805 my($line,$from,$to,@m);
806 my($autodir) = File::Spec->catdir('$(INST_LIB)','auto');
807 my(@files) = @{$self->{PM_TO_BLIB}};
811 # Dummy target to match Unix target name; we use pm_to_blib.ts as
812 # timestamp file to avoid repeated invocations under VMS
813 pm_to_blib : pm_to_blib.ts
816 # As always, keep under DCL's 255-char limit
817 pm_to_blib.ts : $(TO_INST_PM)
818 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
821 $line = ''; # avoid uninitialized var warning
822 while ($from = shift(@files),$to = shift(@files)) {
823 $line .= " $from $to";
824 if (length($line) > 128) {
825 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
829 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
831 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
833 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
834 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
840 =item tool_autosplit (override)
842 Use VMS-style quoting on command line.
847 my($self, %attribs) = @_;
849 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
851 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
852 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
856 =item tool_sxubpp (override)
858 Use VMS-style quoting on xsubpp command line.
864 return '' unless $self->needs_linking;
865 my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils');
866 # drop back to old location if xsubpp is not in new location yet
867 $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp'));
868 my(@tmdeps) = '$(XSUBPPDIR)typemap';
869 if( $self->{TYPEMAPS} ){
871 foreach $typemap (@{$self->{TYPEMAPS}}){
873 warn "Typemap $typemap not found.\n";
876 push(@tmdeps, $self->fixpath($typemap,0));
880 push(@tmdeps, "typemap") if -f "typemap";
881 my(@tmargs) = map("-typemap $_", @tmdeps);
882 if( exists $self->{XSOPT} ){
883 unshift( @tmargs, $self->{XSOPT} );
886 if ($Config{'ldflags'} &&
887 $Config{'ldflags'} =~ m!/Debug!i &&
888 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
889 unshift(@tmargs,'-nolinenumbers');
891 my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp'));
893 # What are the correct thresholds for version 1 && 2 Paul?
894 if ( $xsubpp_version > 1.923 ){
895 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
897 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
898 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
899 Your version of xsubpp is $xsubpp_version and cannot handle this.
900 Please upgrade to a more recent version of xsubpp.
903 $self->{XSPROTOARG} = "";
909 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
910 XSPROTOARG = $self->{XSPROTOARG}
916 =item xsubpp_version (override)
918 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
919 rather than Unix rules ($sts == 0 ==E<gt> good).
925 my($self,$xsubpp) = @_;
927 return '' unless $self->needs_linking;
929 # try to figure out the version number of the xsubpp on the system
931 # first try the -v flag, introduced in 1.921 & 2.000a2
933 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
934 print "Running: $command\n" if $Verbose;
935 $version = `$command` ;
938 warn "Running '$command' exits with status $?";
942 return $1 if $version =~ /^xsubpp version (.*)/ ;
944 # nope, then try something else
947 my ($file) = 'temp' ;
948 $counter++ while -e "$file$counter"; # don't overwrite anything
952 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
954 MODULE = fred PACKAGE = fred
963 $command = "$self->{PERL} $xsubpp $file";
964 print "Running: $command\n" if $Verbose;
965 my $text = `$command` ;
968 warn "Running '$command' exits with status $?";
972 # gets 1.2 -> 1.92 and 2.000a1
973 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
975 # it is either 1.0 or 1.1
976 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
978 # none of the above, so 1.0
982 =item tools_other (override)
984 Adds a few MM[SK] macros, and shortens some the installatin commands,
985 in order to stay under DCL's 255-character limit. Also changes
986 EQUALIZE_TIMESTAMP to set revision date of target file to one second
987 later than source file, since MMK interprets precisely equal revision
988 dates for a source and target file as a sign that the target needs
996 # Assumes \$(MMS) invokes MMS or MMK
997 # (It is assumed in some cases later that the default makefile name
998 # (Descrip.MMS for MM[SK]) is used.)
999 USEMAKEFILE = /Descrip=
1000 USEMACROS = /Macro=(
1002 MAKEFILE = Descrip.MMS
1004 TOUCH = $self->{TOUCH}
1005 CHMOD = $self->{CHMOD}
1008 RM_F = $self->{RM_F}
1009 RM_RF = $self->{RM_RF}
1010 SAY = Write Sys\$Output
1011 UMASK_NULL = $self->{UMASK_NULL}
1012 NOOP = $self->{NOOP}
1013 NOECHO = $self->{NOECHO}
1014 MKPATH = Create/Directory
1015 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1016 !. ($self->{PARENT} ? '' :
1017 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1018 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1019 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]"
1020 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1024 =item dist (override)
1026 Provide VMSish defaults for some values, then hand off to
1027 default MM_Unix method.
1032 my($self, %attribs) = @_;
1033 $attribs{VERSION} ||= $self->{VERSION_SYM};
1034 $attribs{NAME} ||= $self->{DISTNAME};
1035 $attribs{ZIPFLAGS} ||= '-Vu';
1036 $attribs{COMPRESS} ||= 'gzip';
1037 $attribs{SUFFIX} ||= '-gz';
1038 $attribs{SHAR} ||= 'vms_share';
1039 $attribs{DIST_DEFAULT} ||= 'zipdist';
1041 # Sanitize these for use in $(DISTVNAME) filespec
1042 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1043 $attribs{NAME} =~ s/[^\w\$]/-/g;
1045 return ExtUtils::MM_Unix::dist($self,%attribs);
1048 =item c_o (override)
1050 Use VMS syntax on command line. In particular, $(DEFINE) and
1051 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1057 return '' unless $self->needs_linking();
1060 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1063 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1066 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1071 =item xs_c (override)
1079 return '' unless $self->needs_linking();
1082 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1086 =item xs_o (override)
1088 Use MM[SK] macros, and VMS command line for C compiler.
1092 sub xs_o { # many makes are too dumb to use xs_c then c_o
1094 return '' unless $self->needs_linking();
1097 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1098 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1102 =item top_targets (override)
1104 Use VMS quoting on command line for Version_check.
1112 all :: pure_all manifypods
1115 pure_all :: config pm_to_blib subdirs linkext
1118 subdirs :: $(MYEXTLIB)
1121 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1124 config :: $(INST_ARCHAUTODIR).exists
1127 config :: $(INST_AUTODIR).exists
1131 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1132 if (%{$self->{MAN1PODS}}) {
1134 config :: $(INST_MAN1DIR).exists
1137 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1139 if (%{$self->{MAN3PODS}}) {
1141 config :: $(INST_MAN3DIR).exists
1144 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1148 $(O_FILES) : $(H_FILES)
1149 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1153 perldoc ExtUtils::MakeMaker
1158 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1159 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1165 =item dlsyms (override)
1167 Create VMS linker options files specifying universal symbols for this
1168 extension's shareable image, and listing other shareable images or
1169 libraries to which it should be linked.
1174 my($self,%attribs) = @_;
1176 return '' unless $self->needs_linking();
1178 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1179 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1180 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1183 unless ($self->{SKIPHASH}{'dynamic'}) {
1185 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1191 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1193 ') unless $self->{SKIPHASH}{'static'};
1196 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1197 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1199 $(BASEEXT).opt : Makefile.PL
1200 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1201 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1202 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1203 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1205 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1206 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1207 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1208 push @m, ($Config{d_vms_case_sensitive_symbols}
1209 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1211 else { # We don't have a "main" object file, so pull 'em all in
1212 # Upcase module names if linker is being case-sensitive
1213 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1214 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1215 s[\$\(\w+_EXT\)][]; # even as a macro
1216 s/.*[:>\/\]]//; # Trim off dir spec
1217 $upcase ? uc($_) : $_;
1218 } split ' ', $self->eliminate_macros($self->{OBJECT});
1219 my($tmp,@lines,$elt) = '';
1220 $tmp = shift @omods;
1221 foreach $elt (@omods) {
1223 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1226 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1228 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1230 if (length $self->{LDLOADLIBS}) {
1231 my($lib); my($line) = '';
1232 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1233 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1234 if (length($line) + length($lib) > 160) {
1235 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1236 $line = $lib . '\n';
1238 else { $line .= $lib . '\n'; }
1240 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1247 =item dynamic_lib (override)
1249 Use VMS Link command.
1254 my($self, %attribs) = @_;
1255 return '' unless $self->needs_linking(); #might be because of a subdir
1257 return '' unless $self->has_link_code();
1259 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1260 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1261 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1265 OTHERLDFLAGS = $otherldflags
1266 INST_DYNAMIC_DEP = $inst_dynamic_dep
1270 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1271 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1272 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1273 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1276 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1280 =item dynamic_bs (override)
1282 Use VMS-style quoting on Mkbootstrap command line.
1287 my($self, %attribs) = @_;
1290 ' unless $self->has_link_code();
1292 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1294 # As MakeMaker mkbootstrap might not write a file (if none is required)
1295 # we use touch to prevent make continually trying to remake it.
1296 # The DynaLoader only reads a non-empty file.
1297 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1298 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1299 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1300 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1301 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1303 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1304 $(NOECHO) $(RM_RF) $(INST_BOOT)
1305 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1309 =item static_lib (override)
1311 Use VMS commands to manipulate object library.
1317 return '' unless $self->needs_linking();
1322 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1326 # Rely on suffix rule for update action
1327 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1329 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1331 # If this extension has its own library (eg SDBM_File)
1332 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1333 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1335 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1337 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1338 # 'cause it's a library and you can't stick them in other libraries.
1339 # In that case, we use $OBJECT instead and hope for the best
1340 if ($self->{MYEXTLIB}) {
1341 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1343 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1346 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1347 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1348 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1350 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1355 =item manifypods (override)
1357 Use VMS-style quoting on command line, and VMS logical name
1358 to specify fallback location at build time if we can't find pod2man.
1364 my($self, %attribs) = @_;
1365 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1368 if (defined $self->{PERL_SRC}) {
1369 $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
1371 $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
1373 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1374 # No pod2man but some MAN3PODS to be installed
1377 Warning: I could not locate your pod2man program. As a last choice,
1378 I will look for the file to which the logical name POD2MAN
1379 points when MMK is invoked.
1382 $pod2man_exe = "pod2man";
1386 qq[POD2MAN_EXE = $pod2man_exe\n],
1387 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1388 -e "system(qq/MCR $^X ""-I$(PERL_ARCHLIB)"" ""-I$(PERL_LIB)"" $(POD2MAN_EXE) $_ >$m{$_}/);}"
1390 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1391 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1393 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1394 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1395 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1397 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1398 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1399 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1405 =item processPL (override)
1407 Use VMS-style quoting on command line.
1413 return "" unless $self->{PL_FILES};
1415 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1416 my $list = ref($self->{PL_FILES}->{$plfile})
1417 ? $self->{PL_FILES}->{$plfile}
1418 : [$self->{PL_FILES}->{$plfile}];
1419 foreach my $target (@$list) {
1420 my $vmsplfile = vmsify($plfile);
1421 my $vmsfile = vmsify($target);
1426 $vmsfile :: $vmsplfile
1427 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1434 =item installbin (override)
1436 Stay under DCL's 255 character command line limit once again by
1437 splitting potentially long list of files across multiple lines
1438 in C<realclean> target.
1444 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1445 return '' unless @{$self->{EXE_FILES}};
1446 my(@m, $from, $to, %fromto, @to, $line);
1447 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1448 for $from (@exefiles) {
1449 my($path) = '$(INST_SCRIPT)' . basename($from);
1450 local($_) = $path; # backward compatibility
1451 $to = $self->libscan($path);
1452 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1453 $fromto{$from} = vmsify($to);
1455 @to = values %fromto;
1457 EXE_FILES = @exefiles
1464 $line = ''; #avoid unitialized var warning
1466 if (length($line) + length($to) > 80) {
1467 push @m, "\t\$(RM_F) $line\n";
1470 else { $line .= " $to"; }
1472 push @m, "\t\$(RM_F) $line\n\n" if $line;
1474 while (($from,$to) = each %fromto) {
1475 last unless defined $from;
1477 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1478 else { ($todir = $to) =~ s/[^\)]+$//; }
1479 $todir = $self->fixpath($todir,1);
1481 $to : $from \$(MAKEFILE) ${todir}.exists
1484 ", $self->dir_target($todir);
1489 =item subdir_x (override)
1491 Use VMS commands to change default directory.
1496 my($self, $subdir) = @_;
1498 $subdir = $self->fixpath($subdir,1);
1502 olddef = F$Environment("Default")
1503 Set Default ',$subdir,'
1504 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1505 Set Default \'olddef\'
1510 =item clean (override)
1512 Split potentially long list of files across multiple commands (in
1513 order to stay under the magic command line limit). Also use MM[SK]
1514 commands for handling subdirectories.
1519 my($self, %attribs) = @_;
1522 # Delete temporary files but do not touch installed files. We don\'t delete
1523 # the Descrip.MMS here so that a later make realclean still has it to use.
1526 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1527 my($vmsdir) = $self->fixpath($dir,1);
1528 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1529 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1531 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1534 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1535 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1536 # a list or a macro that expands to a list.
1537 if ($attribs{FILES}) {
1538 my($word,$key,@filist);
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(@otherfiles, @{$self->{$key}});
1545 else { push(@otherfiles, $word); }
1548 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1549 push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1551 $line = ''; #avoid unitialized var warning
1552 # Occasionally files are repeated several times from different sources
1553 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1555 foreach $file (@otherfiles) {
1556 $file = $self->fixpath($file);
1557 if (length($line) + length($file) > 80) {
1558 push @m, "\t\$(RM_RF) $line\n";
1561 else { $line .= " $file"; }
1563 push @m, "\t\$(RM_RF) $line\n" if $line;
1564 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1568 =item realclean (override)
1570 Guess what we're working around? Also, use MM[SK] for subdirectories.
1575 my($self, %attribs) = @_;
1578 # Delete temporary files (via clean) and also delete installed files
1581 foreach(@{$self->{DIR}}){
1582 my($vmsdir) = $self->fixpath($_,1);
1583 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1584 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1586 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1588 # We can't expand several of the MMS macros here, since they don't have
1589 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1590 # combination of macros). In order to stay below DCL's 255 char limit,
1591 # we put only 2 on a line.
1592 my($file,$line,$fcnt);
1593 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1594 if ($self->has_link_code) {
1595 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1597 push(@files, values %{$self->{PM}});
1598 $line = ''; #avoid unitialized var warning
1599 # Occasionally files are repeated several times from different sources
1600 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1601 foreach $file (@files) {
1602 $file = $self->fixpath($file);
1603 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1604 push @m, "\t\$(RM_F) $line\n";
1608 else { $line .= " $file"; }
1610 push @m, "\t\$(RM_F) $line\n" if $line;
1611 if ($attribs{FILES}) {
1612 my($word,$key,@filist,@allfiles);
1613 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1614 else { @filist = split /\s+/, $attribs{FILES}; }
1615 foreach $word (@filist) {
1616 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1617 push(@allfiles, @{$self->{$key}});
1619 else { push(@allfiles, $word); }
1622 # Occasionally files are repeated several times from different sources
1623 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1624 foreach $file (@allfiles) {
1625 $file = $self->fixpath($file);
1626 if (length($line) + length($file) > 80) {
1627 push @m, "\t\$(RM_RF) $line\n";
1630 else { $line .= " $file"; }
1632 push @m, "\t\$(RM_RF) $line\n" if $line;
1634 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1638 =item dist_basics (override)
1640 Use VMS-style quoting on command line.
1647 distclean :: realclean distcheck
1651 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1654 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1657 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1661 =item dist_core (override)
1663 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1664 so C<shdist> target actions are VMS-specific.
1671 dist : $(DIST_DEFAULT)
1672 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1674 zipdist : $(DISTVNAME).zip
1677 tardist : $(DISTVNAME).tar$(SUFFIX)
1680 $(DISTVNAME).zip : distdir
1682 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1683 $(RM_RF) $(DISTVNAME)
1686 $(DISTVNAME).tar$(SUFFIX) : distdir
1689 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1690 $(RM_RF) $(DISTVNAME)
1691 $(COMPRESS) $(DISTVNAME).tar
1696 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1697 $(RM_RF) $(DISTVNAME)
1702 =item dist_dir (override)
1704 Use VMS-style quoting on command line.
1712 $(RM_RF) $(DISTVNAME)
1713 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1714 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1718 =item dist_test (override)
1720 Use VMS commands to change default directory, and use VMS-style
1721 quoting on command line.
1729 startdir = F$Environment("Default")
1730 Set Default [.$(DISTVNAME)]
1731 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1732 $(MMS)$(MMSQUALIFIERS)
1733 $(MMS)$(MMSQUALIFIERS) test
1734 Set Default 'startdir'
1738 # --- Test and Installation Sections ---
1740 =item install (override)
1742 Work around DCL's 255 character limit several times,and use
1743 VMS-style command line quoting in a few cases.
1748 my($self, %attribs) = @_;
1751 if ($self->{EXE_FILES}) {
1752 my($line,$file) = ('','');
1753 foreach $file (@{$self->{EXE_FILES}}) {
1755 if (length($line) > 128) {
1756 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1760 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1764 install :: all pure_install doc_install
1767 install_perl :: all pure_perl_install doc_perl_install
1770 install_site :: all pure_site_install doc_site_install
1773 install_ :: install_site
1774 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1776 pure_install :: pure_$(INSTALLDIRS)_install
1779 doc_install :: doc_$(INSTALLDIRS)_install
1780 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1782 pure__install : pure_site_install
1783 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1785 doc__install : doc_site_install
1786 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1788 # This hack brought to you by DCL's 255-character command line limit
1789 pure_perl_install ::
1790 $(NOECHO) $(PERL) -e "print 'read ].File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1791 $(NOECHO) $(PERL) -e "print 'write ].File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1792 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1793 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1794 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1795 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1796 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1797 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1798 $(MOD_INSTALL) <.MM_tmp
1799 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1800 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1803 pure_site_install ::
1804 $(NOECHO) $(PERL) -e "print 'read ].File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1805 $(NOECHO) $(PERL) -e "print 'write ].File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1806 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1807 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1808 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1809 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1810 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1811 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1812 $(MOD_INSTALL) <.MM_tmp
1813 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1814 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1818 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1819 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1821 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1822 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1823 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1824 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1825 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1826 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1830 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1831 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1833 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1834 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1835 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1836 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1837 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1838 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1843 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1846 uninstall_from_perldirs ::
1847 $(NOECHO) $(UNINSTALL) ].File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1848 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1849 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1850 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1852 uninstall_from_sitedirs ::
1853 $(NOECHO) $(UNINSTALL) ],File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1854 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1855 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1856 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1862 =item perldepend (override)
1864 Use VMS-style syntax for files; it's cheaper to just do it directly here
1865 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1866 we have to rebuild Config.pm, use MM[SK] to do it.
1875 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1876 $(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1877 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1878 $(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)fakethr.h, $(PERL_INC)form.h
1879 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1880 $(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1881 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1882 $(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)opnames.h, $(PERL_INC)patchlevel.h
1883 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlapi.h, $(PERL_INC)perlio.h
1884 $(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlsfio.h, $(PERL_INC)perlvars.h
1885 $(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1886 $(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1887 $(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1888 $(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h, $(PERL_INC)utf8.h
1889 $(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h
1891 ' if $self->{OBJECT};
1893 if ($self->{PERL_SRC}) {
1895 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1896 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1897 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1898 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1899 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1900 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1901 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1903 # Check for unpropagated config.sh changes. Should never happen.
1904 # We do NOT just update config.h because that is not sufficient.
1905 # An out of date config.h is not fatal but complains loudly!
1906 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1909 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1910 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1911 olddef = F$Environment("Default")
1912 Set Default $(PERL_SRC)
1913 $(MMS)],$mmsquals,);
1914 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1915 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1916 $target =~ s/\Q$prefix/[/;
1917 push(@m," $target");
1919 else { push(@m,' $(MMS$TARGET)'); }
1921 Set Default 'olddef'
1925 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1931 =item makefile (override)
1933 Use VMS commands and quoting.
1940 # We do not know what target was originally specified so we
1941 # must force a manual rerun to be sure. But as it should only
1942 # happen very rarely it is not a significant problem.
1944 $(OBJECT) : $(FIRST_MAKEFILE)
1945 ] if $self->{OBJECT};
1948 # We take a very conservative approach here, but it\'s worth it.
1949 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1950 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1951 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1952 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1953 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1954 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1955 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1956 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1957 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1963 =item test (override)
1965 Use VMS commands for handling subdirectories.
1970 my($self, %attribs) = @_;
1971 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1975 TEST_TYPE = test_\$(LINKTYPE)
1979 test :: \$(TEST_TYPE)
1982 testdb :: testdb_\$(LINKTYPE)
1986 foreach(@{$self->{DIR}}){
1987 my($vmsdir) = $self->fixpath($_,1);
1988 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1989 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1991 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1992 unless $tests or -f "test.pl" or @{$self->{DIR}};
1995 push(@m, "test_dynamic :: pure_all\n");
1996 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1997 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1998 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
2001 push(@m, "testdb_dynamic :: pure_all\n");
2002 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
2005 # Occasionally we may face this degenerate target:
2006 push @m, "test_ : test_dynamic\n\n";
2008 if ($self->needs_linking()) {
2009 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2010 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2011 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2013 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2014 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2018 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2019 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2025 =item test_via_harness (override)
2027 Use VMS-style quoting on command line.
2031 sub test_via_harness {
2032 my($self,$perl,$tests) = @_;
2033 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2034 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2037 =item test_via_script (override)
2039 Use VMS-style quoting on command line.
2043 sub test_via_script {
2044 my($self,$perl,$script) = @_;
2045 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2049 =item makeaperl (override)
2051 Undertake to build a new set of Perl images using VMS commands. Since
2052 VMS does dynamic loading, it's not necessary to statically link each
2053 extension into the Perl image, so this isn't the normal build path.
2054 Consequently, it hasn't really been tested, and may well be incomplete.
2061 my($self, %attribs) = @_;
2062 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2063 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2066 # --- MakeMaker makeaperl section ---
2067 MAP_TARGET = $target
2069 return join '', @m if $self->{PARENT};
2071 my($dir) = join ":", @{$self->{DIR}};
2073 unless ($self->{MAKEAPERL}) {
2075 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2076 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2077 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2078 Makefile.PL DIR=}, $dir, q{ \
2079 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2080 MAKEAPERL=1 NORECURS=1 };
2082 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2084 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2085 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2093 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2096 # The front matter of the linkcommand...
2097 $linkcmd = join ' ', $Config{'ld'},
2098 grep($_, @Config{qw(large split ldflags ccdlflags)});
2099 $linkcmd =~ s/\s+/ /g;
2101 # Which *.olb files could we make use of...
2102 local(%olbs); # XXX can this be lexical?
2103 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2105 File::Find::find(sub {
2106 return unless m/\Q$self->{LIB_EXT}\E$/;
2107 return if m/^libperl/;
2109 if( exists $self->{INCLUDE_EXT} ){
2114 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2118 # Throw away anything not explicitly marked for inclusion.
2119 # DynaLoader is implied.
2120 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2126 return unless $found;
2128 elsif( exists $self->{EXCLUDE_EXT} ){
2132 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2136 # Throw away anything explicitly marked for exclusion
2137 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2138 return if( $xx eq $excl );
2142 $olbs{$ENV{DEFAULT}} = $_;
2143 }, grep( -d $_, @{$searchdirs || []}));
2145 # We trust that what has been handed in as argument will be buildable
2146 $static = [] unless $static;
2147 @olbs{@{$static}} = (1) x @{$static};
2149 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2150 # Sort the object libraries in inverse order of
2151 # filespec length to try to insure that dependent extensions
2152 # will appear before their parents, so the linker will
2153 # search the parent library to resolve references.
2154 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2155 # references from [.intuit.dwim]dwim.obj can be found
2156 # in [.intuit]intuit.olb).
2157 for (sort { length($a) <=> length($b) } keys %olbs) {
2158 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2159 my($dir) = $self->fixpath($_,1);
2160 my($extralibs) = $dir . "extralibs.ld";
2161 my($extopt) = $dir . $olbs{$_};
2162 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2163 push @optlibs, "$dir$olbs{$_}";
2164 # Get external libraries this extension will need
2165 if (-f $extralibs ) {
2167 open LIST,$extralibs or warn $!,next;
2170 # Include a library in the link only once, unless it's mentioned
2171 # multiple times within a single extension's options file, in which
2172 # case we assume the builder needed to search it again later in the
2174 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2175 $libseen{$_}++; $seenthis{$_}++;
2181 # Get full name of extension for ExtUtils::Miniperl
2183 open OPT,$extopt or die $!;
2185 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2188 push @staticpkgs,$pkg;
2192 # Place all of the external libraries after all of the Perl extension
2193 # libraries in the final link, in order to maximize the opportunity
2194 # for XS code from multiple extensions to resolve symbols against the
2195 # same external library while only including that library once.
2196 push @optlibs, @$extra;
2198 $target = "Perl$Config{'exe_ext'}" unless $target;
2200 ($shrtarget,$targdir) = fileparse($target);
2201 $shrtarget =~ s/^([^.]*)/$1Shr/;
2202 $shrtarget = $targdir . $shrtarget;
2203 $target = "Perlshr.$Config{'dlext'}" unless $target;
2204 $tmp = "[]" unless $tmp;
2205 $tmp = $self->fixpath($tmp,1);
2206 if (@optlibs) { $extralist = join(' ',@optlibs); }
2207 else { $extralist = ''; }
2208 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2209 # that's what we're building here).
2210 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2212 unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2213 print STDOUT "Warning: $libperl not found\n";
2218 if (defined $self->{PERL_SRC}) {
2219 $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2220 } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2222 print STDOUT "Warning: $libperl not found
2223 If you're going to build a static perl binary, make sure perl is installed
2224 otherwise ignore this warning\n";
2227 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2230 # Fill in the target you want to produce if it\'s not perl
2231 MAP_TARGET = ',$self->fixpath($target,0),'
2232 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2233 MAP_LINKCMD = $linkcmd
2234 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2235 MAP_EXTRA = $extralist
2236 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2240 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2241 foreach (@optlibs) {
2242 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2244 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2245 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2248 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2249 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2250 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2251 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2252 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2253 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2254 $(NOECHO) $(SAY) "To remove the intermediate files, say
2255 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2257 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2258 push @m, "# More from the 255-char line length limit\n";
2259 foreach (@staticpkgs) {
2260 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2263 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2264 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2267 # Still more from the 255-char line length limit
2269 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2270 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2271 $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2272 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2273 $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2274 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2278 inst_perl : pure_inst_perl doc_inst_perl
2281 pure_inst_perl : \$(MAP_TARGET)
2282 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2283 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2289 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2290 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2296 # --- Output postprocessing section ---
2298 =item nicetext (override)
2300 Insure that colons marking targets are preceded by space, in order
2301 to distinguish the target delimiter from a colon appearing as
2308 my($self,$text) = @_;
2309 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;