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;
17 $Revision = '5.56 (27-Apr-1999)';
19 @ISA = qw( File::Spec );
20 unshift @MM::ISA, 'ExtUtils::MM_VMS';
22 Exporter::import('ExtUtils::MakeMaker', '$Verbose', '&neatvalue');
26 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
30 use ExtUtils::MM_VMS; # Done internally by ExtUtils::MakeMaker if needed
34 See ExtUtils::MM_Unix for a documentation of the methods provided
35 there. This package overrides the implementation of these methods, not
38 =head2 Methods always loaded
44 Converts a list into a string wrapped at approximately 80 columns.
50 my($line,$hlen) = ('',0);
54 # Perl bug -- seems to occasionally insert extra elements when
55 # traversing array (scalar(@array) doesn't show them, but
56 # foreach(@array) does) (5.00307)
57 next unless $word =~ /\w/;
58 $line .= ' ' if length($line);
59 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
61 $hlen += length($word) + 2;
66 =item rootdir (override)
68 Returns a string representing of the root directory.
76 package ExtUtils::MM_VMS;
78 sub ExtUtils::MM_VMS::ext;
79 sub ExtUtils::MM_VMS::guess_name;
80 sub ExtUtils::MM_VMS::find_perl;
81 sub ExtUtils::MM_VMS::path;
82 sub ExtUtils::MM_VMS::maybe_command;
83 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
84 sub ExtUtils::MM_VMS::perl_script;
85 sub ExtUtils::MM_VMS::file_name_is_absolute;
86 sub ExtUtils::MM_VMS::replace_manpage_separator;
87 sub ExtUtils::MM_VMS::init_others;
88 sub ExtUtils::MM_VMS::constants;
89 sub ExtUtils::MM_VMS::cflags;
90 sub ExtUtils::MM_VMS::const_cccmd;
91 sub ExtUtils::MM_VMS::pm_to_blib;
92 sub ExtUtils::MM_VMS::tool_autosplit;
93 sub ExtUtils::MM_VMS::tool_xsubpp;
94 sub ExtUtils::MM_VMS::xsubpp_version;
95 sub ExtUtils::MM_VMS::tools_other;
96 sub ExtUtils::MM_VMS::dist;
97 sub ExtUtils::MM_VMS::c_o;
98 sub ExtUtils::MM_VMS::xs_c;
99 sub ExtUtils::MM_VMS::xs_o;
100 sub ExtUtils::MM_VMS::top_targets;
101 sub ExtUtils::MM_VMS::dlsyms;
102 sub ExtUtils::MM_VMS::dynamic_lib;
103 sub ExtUtils::MM_VMS::dynamic_bs;
104 sub ExtUtils::MM_VMS::static_lib;
105 sub ExtUtils::MM_VMS::manifypods;
106 sub ExtUtils::MM_VMS::processPL;
107 sub ExtUtils::MM_VMS::installbin;
108 sub ExtUtils::MM_VMS::subdir_x;
109 sub ExtUtils::MM_VMS::clean;
110 sub ExtUtils::MM_VMS::realclean;
111 sub ExtUtils::MM_VMS::dist_basics;
112 sub ExtUtils::MM_VMS::dist_core;
113 sub ExtUtils::MM_VMS::dist_dir;
114 sub ExtUtils::MM_VMS::dist_test;
115 sub ExtUtils::MM_VMS::install;
116 sub ExtUtils::MM_VMS::perldepend;
117 sub ExtUtils::MM_VMS::makefile;
118 sub ExtUtils::MM_VMS::test;
119 sub ExtUtils::MM_VMS::test_via_harness;
120 sub ExtUtils::MM_VMS::test_via_script;
121 sub ExtUtils::MM_VMS::makeaperl;
122 sub ExtUtils::MM_VMS::ext;
123 sub ExtUtils::MM_VMS::nicetext;
128 if (defined fileno(DATA)) {
129 my $fh = select DATA;
130 my $o = $/; # For future reads from the file.
142 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
144 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
153 # This isn't really an override. It's just here because ExtUtils::MM_VMS
154 # appears in @MM::ISA before ExtUtils::Liblist, so if there isn't an ext()
155 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
156 # mimic inheritance here and hand off to ExtUtils::Liblist.
158 ExtUtils::Liblist::ext(@_);
163 =head2 SelfLoaded methods
165 Those methods which override default MM_Unix methods are marked
166 "(override)", while methods unique to MM_VMS are marked "(specific)".
167 For overridden methods, documentation is limited to an explanation
168 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
169 documentation for more details.
173 =item guess_name (override)
175 Try to determine name of extension being built. We begin with the name
176 of the current directory. Since VMS filenames are case-insensitive,
177 however, we look for a F<.pm> file whose name matches that of the current
178 directory (presumably the 'main' F<.pm> file for this extension), and try
179 to find a C<package> statement from which to obtain the Mixed::Case
186 my($defname,$defpm,@pm,%xs,$pm);
189 $defname = basename(fileify($ENV{'DEFAULT'}));
190 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
192 # Fallback in case for some reason a user has copied the files for an
193 # extension into a working directory whose name doesn't reflect the
194 # extension's name. We'll use the name of a unique .pm file, or the
195 # first .pm file with a matching .xs file.
196 if (not -e "${defpm}.pm") {
197 @pm = map { s/.pm$//; $_ } glob('*.pm');
198 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
200 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
201 if (%xs) { foreach $pm (@pm) { $defpm = $pm, last if exists $xs{$pm}; } }
204 if (open(PM,"${defpm}.pm")){
206 if (/^\s*package\s+([^;]+)/i) {
211 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
212 "defaulting package name to $defname\n"
217 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
218 "defaulting package name to $defname\n";
220 $defname =~ s#[\d.\-_]+$##;
224 =item find_perl (override)
226 Use VMS file specification syntax and CLI commands to find and
232 my($self, $ver, $names, $dirs, $trace) = @_;
233 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
237 # Check in relative directories first, so we pick up the current
238 # version of Perl if we're running MakeMaker as part of the main build.
239 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
240 my($absb) = $self->file_name_is_absolute($b);
241 if ($absa && $absb) { return $a cmp $b }
242 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
244 # Check miniperl before perl, and check names likely to contain
245 # version numbers before "generic" names, so we pick up an
246 # executable that's less likely to be from an old installation.
247 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
248 my($bb) = $b =~ m!([^:>\]/]+)$!;
249 my($ahasdir) = (length($a) - length($ba) > 0);
250 my($bhasdir) = (length($b) - length($bb) > 0);
251 if ($ahasdir and not $bhasdir) { return 1; }
252 elsif ($bhasdir and not $ahasdir) { return -1; }
253 else { $bb =~ /\d/ <=> $ba =~ /\d/
254 or substr($ba,0,1) cmp substr($bb,0,1)
255 or length($bb) <=> length($ba) } } @$names;
256 # Image names containing Perl version use '_' instead of '.' under VMS
257 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
259 print "Looking for perl $ver by these names:\n";
260 print "\t@snames,\n";
261 print "in these dirs:\n";
264 foreach $dir (@sdirs){
265 next unless defined $dir; # $self->{PERL_SRC} may be undefined
266 $inabs++ if $self->file_name_is_absolute($dir);
268 # We've covered relative dirs; everything else is an absolute
269 # dir (probably an installed location). First, we'll try potential
270 # command names, to see whether we can avoid a long MCR expression.
271 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
272 $inabs++; # Should happen above in next $dir, but just in case . . .
274 foreach $name (@snames){
275 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
276 else { push(@cand,$self->fixpath($name,0)); }
279 foreach $name (@cand) {
280 print "Checking $name\n" if ($trace >= 2);
281 # If it looks like a potential command, try it without the MCR
282 if ($name =~ /^[\w\-\$]+$/) {
283 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
284 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
285 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
287 $rslt = `\@temp_mmvms.com` ;
288 unlink('temp_mmvms.com');
289 if ($rslt =~ /VER_OK/) {
290 print "Using PERL=$name\n" if $trace;
294 next unless $vmsfile = $self->maybe_command($name);
295 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
296 print "Executing $vmsfile\n" if ($trace >= 2);
297 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
298 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
299 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
301 $rslt = `\@temp_mmvms.com`;
302 unlink('temp_mmvms.com');
303 if ($rslt =~ /VER_OK/) {
304 print "Using PERL=MCR $vmsfile\n" if $trace;
305 return "MCR $vmsfile";
308 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
309 0; # false and not empty
312 =item path (override)
314 Translate logical name DCL$PATH as a searchlist, rather than trying
315 to C<split> string value of C<$ENV{'PATH'}>.
321 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
325 =item maybe_command (override)
327 Follows VMS naming conventions for executable files.
328 If the name passed in doesn't exactly match an executable file,
329 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
330 to check for DCL procedure. If this fails, checks directories in DCL$PATH
331 and finally F<Sys$System:> for an executable file having the name specified,
332 with or without the F<.Exe>-equivalent suffix.
337 my($self,$file) = @_;
338 return $file if -x $file && ! -d _;
340 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
342 if ($file !~ m![/:>\]]!) {
343 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
344 $dir = $ENV{"DCL\$PATH;$i"};
345 $dir .= ':' unless $dir =~ m%[\]:]$%;
348 push(@dirs,'Sys$System:');
349 foreach $dir (@dirs) {
350 my $sysfile = "$dir$file";
351 foreach $ext (@exts) {
352 return $file if -x "$sysfile$ext" && ! -d _;
359 =item maybe_command_in_dirs (override)
361 Uses DCL argument quoting on test command line.
365 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
366 my($self, $names, $dirs, $trace, $ver) = @_;
368 foreach $dir (@$dirs){
369 next unless defined $dir; # $self->{PERL_SRC} may be undefined
370 foreach $name (@$names){
372 if ($self->file_name_is_absolute($name)) {
375 $abs = $self->catfile($dir, $name);
377 print "Checking $abs for $name\n" if ($trace >= 2);
378 next unless $tryabs = $self->maybe_command($abs);
379 print "Substituting $tryabs instead of $abs\n"
380 if ($trace >= 2 and $tryabs ne $abs);
383 print "Executing $abs\n" if ($trace >= 2);
384 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
385 print "Using $abs\n" if $trace;
388 } else { # Do not look for perl
395 =item perl_script (override)
397 If name passed in doesn't specify a readable file, appends F<.com> or
398 F<.pl> and tries again, since it's customary to have file types on all files
404 my($self,$file) = @_;
405 return $file if -r $file && ! -d _;
406 return "$file.com" if -r "$file.com";
407 return "$file.pl" if -r "$file.pl";
411 =item file_name_is_absolute (override)
413 Checks for VMS directory spec as well as Unix separators.
417 sub file_name_is_absolute {
418 my($self,$file) = @_;
419 # If it's a logical name, expand it.
420 $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
421 $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
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} = $self->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
538 next unless defined $self->{$macro};
539 push @m, "$macro = $self->{$macro}\n";
544 VERSION_MACRO = VERSION
545 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
546 XS_VERSION_MACRO = XS_VERSION
547 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
549 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
550 MM_VERSION = $ExtUtils::MakeMaker::VERSION
551 MM_REVISION = $ExtUtils::MakeMaker::Revision
552 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
554 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
555 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
556 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
557 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
561 FULLEXT VERSION_FROM OBJECT LDFROM
563 next unless defined $self->{$tmp};
564 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
568 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
570 next unless defined $self->{$tmp};
571 push @m, "$tmp = $self->{$tmp}\n";
574 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
575 next unless defined $self->{$tmp};
577 for $key (keys %{$self->{$tmp}}) {
578 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
580 $self->{$tmp} = \%tmp;
583 for $tmp (qw/ C O_FILES H /) {
584 next unless defined $self->{$tmp};
586 for $val (@{$self->{$tmp}}) {
587 push(@tmp,$self->fixpath($val,0));
589 $self->{$tmp} = \@tmp;
594 # Handy lists of source code files:
595 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
596 C_FILES = ',$self->wraplist(@{$self->{C}}),'
597 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
598 H_FILES = ',$self->wraplist(@{$self->{H}}),'
599 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
600 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
605 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
607 next unless defined $self->{$tmp};
608 push @m, "$tmp = $self->{$tmp}\n";
613 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
615 # Here is the Config.pm that we are using/depend on
616 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
618 # Where to put things:
619 INST_LIBDIR = $self->{INST_LIBDIR}
620 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
622 INST_AUTODIR = $self->{INST_AUTODIR}
623 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
626 if ($self->has_link_code()) {
628 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
629 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
630 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
633 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
638 EXPORT_LIST = $(BASEEXT).opt
639 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
643 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
644 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
646 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
648 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
654 =item cflags (override)
656 Bypass shell script and produce qualifiers for CC directly (but warn
657 user if a shell script for this extension exists). Fold multiple
658 /Defines into one, since some C compilers pay attention to only one
659 instance of this qualifier on the command line.
664 my($self,$libperl) = @_;
665 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
666 my($definestr,$undefstr,$flagoptstr) = ('','','');
667 my($incstr) = '/Include=($(PERL_INC)';
670 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
671 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
672 " required to modify CC command for $self->{'BASEEXT'}\n"
675 if ($quals =~ / -[DIUOg]/) {
676 while ($quals =~ / -([Og])(\d*)\b/) {
677 my($type,$lvl) = ($1,$2);
678 $quals =~ s/ -$type$lvl\b\s*//;
679 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
680 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
682 while ($quals =~ / -([DIU])(\S+)/) {
683 my($type,$def) = ($1,$2);
684 $quals =~ s/ -$type$def\s*//;
686 if ($type eq 'D') { $definestr .= qq["$def",]; }
687 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
688 else { $undefstr .= qq["$def",]; }
691 if (length $quals and $quals !~ m!/!) {
692 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
695 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
696 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
697 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
698 # Deal with $self->{DEFINE} here since some C compilers pay attention
699 # to only one /Define clause on command line, so we have to
700 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
701 # ($self->{DEFINE} has already been VMSified in constants() above)
702 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
703 for $type (qw(Def Undef)) {
705 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
707 $term =~ s:^\((.+)\)$:$1:;
710 if ($type eq 'Def') {
711 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
714 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
715 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
719 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
721 # Likewise with $self->{INC} and /Include
722 if ($self->{'INC'}) {
723 my(@includes) = split(/\s+/,$self->{INC});
724 foreach (@includes) {
726 $incstr .= ','.$self->fixpath($_,1);
729 $quals .= "$incstr)";
730 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
731 $self->{CCFLAGS} = $quals;
733 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
734 if ($self->{OPTIMIZE} !~ m!/!) {
735 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
736 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
737 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
740 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
741 $self->{OPTIMIZE} = '/Optimize';
745 return $self->{CFLAGS} = qq{
746 CCFLAGS = $self->{CCFLAGS}
747 OPTIMIZE = $self->{OPTIMIZE}
748 PERLTYPE = $self->{PERLTYPE}
754 =item const_cccmd (override)
756 Adds directives to point C preprocessor to the right place when
757 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
758 command line a bit differently than MM_Unix method.
763 my($self,$libperl) = @_;
766 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
767 return '' unless $self->needs_linking();
768 if ($Config{'vms_cc_type'} eq 'gcc') {
771 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
773 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
776 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
777 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
782 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
783 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
784 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
787 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
789 $self->{CONST_CCCMD} = join('',@m);
792 =item pm_to_blib (override)
794 DCL I<still> accepts a maximum of 255 characters on a command
795 line, so we write the (potentially) long list of file names
796 to a temp file, then persuade Perl to read it instead of the
797 command line to find args.
803 my($line,$from,$to,@m);
804 my($autodir) = $self->catdir('$(INST_LIB)','auto');
805 my(@files) = @{$self->{PM_TO_BLIB}};
809 # Dummy target to match Unix target name; we use pm_to_blib.ts as
810 # timestamp file to avoid repeated invocations under VMS
811 pm_to_blib : pm_to_blib.ts
814 # As always, keep under DCL's 255-char limit
815 pm_to_blib.ts : $(TO_INST_PM)
816 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
819 $line = ''; # avoid uninitialized var warning
820 while ($from = shift(@files),$to = shift(@files)) {
821 $line .= " $from $to";
822 if (length($line) > 128) {
823 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
827 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
829 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
831 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
832 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
838 =item tool_autosplit (override)
840 Use VMS-style quoting on command line.
845 my($self, %attribs) = @_;
847 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
849 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
850 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
854 =item tool_sxubpp (override)
856 Use VMS-style quoting on xsubpp command line.
862 return '' unless $self->needs_linking;
863 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
864 # drop back to old location if xsubpp is not in new location yet
865 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
866 my(@tmdeps) = '$(XSUBPPDIR)typemap';
867 if( $self->{TYPEMAPS} ){
869 foreach $typemap (@{$self->{TYPEMAPS}}){
871 warn "Typemap $typemap not found.\n";
874 push(@tmdeps, $self->fixpath($typemap,0));
878 push(@tmdeps, "typemap") if -f "typemap";
879 my(@tmargs) = map("-typemap $_", @tmdeps);
880 if( exists $self->{XSOPT} ){
881 unshift( @tmargs, $self->{XSOPT} );
884 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
886 # What are the correct thresholds for version 1 && 2 Paul?
887 if ( $xsubpp_version > 1.923 ){
888 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
890 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
891 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
892 Your version of xsubpp is $xsubpp_version and cannot handle this.
893 Please upgrade to a more recent version of xsubpp.
896 $self->{XSPROTOARG} = "";
902 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
903 XSPROTOARG = $self->{XSPROTOARG}
909 =item xsubpp_version (override)
911 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
912 rather than Unix rules ($sts == 0 ==E<gt> good).
918 my($self,$xsubpp) = @_;
920 return '' unless $self->needs_linking;
922 # try to figure out the version number of the xsubpp on the system
924 # first try the -v flag, introduced in 1.921 & 2.000a2
926 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
927 print "Running: $command\n" if $Verbose;
928 $version = `$command` ;
931 warn "Running '$command' exits with status $?";
935 return $1 if $version =~ /^xsubpp version (.*)/ ;
937 # nope, then try something else
940 my ($file) = 'temp' ;
941 $counter++ while -e "$file$counter"; # don't overwrite anything
945 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
947 MODULE = fred PACKAGE = fred
956 $command = "$self->{PERL} $xsubpp $file";
957 print "Running: $command\n" if $Verbose;
958 my $text = `$command` ;
961 warn "Running '$command' exits with status $?";
965 # gets 1.2 -> 1.92 and 2.000a1
966 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
968 # it is either 1.0 or 1.1
969 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
971 # none of the above, so 1.0
975 =item tools_other (override)
977 Adds a few MM[SK] macros, and shortens some the installatin commands,
978 in order to stay under DCL's 255-character limit. Also changes
979 EQUALIZE_TIMESTAMP to set revision date of target file to one second
980 later than source file, since MMK interprets precisely equal revision
981 dates for a source and target file as a sign that the target needs
989 # Assumes \$(MMS) invokes MMS or MMK
990 # (It is assumed in some cases later that the default makefile name
991 # (Descrip.MMS for MM[SK]) is used.)
992 USEMAKEFILE = /Descrip=
995 MAKEFILE = Descrip.MMS
997 TOUCH = $self->{TOUCH}
998 CHMOD = $self->{CHMOD}
1001 RM_F = $self->{RM_F}
1002 RM_RF = $self->{RM_RF}
1003 SAY = Write Sys\$Output
1004 UMASK_NULL = $self->{UMASK_NULL}
1005 NOOP = $self->{NOOP}
1006 NOECHO = $self->{NOECHO}
1007 MKPATH = Create/Directory
1008 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1009 !. ($self->{PARENT} ? '' :
1010 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1011 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1012 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]"
1013 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1017 =item dist (override)
1019 Provide VMSish defaults for some values, then hand off to
1020 default MM_Unix method.
1025 my($self, %attribs) = @_;
1026 $attribs{VERSION} ||= $self->{VERSION_SYM};
1027 $attribs{NAME} ||= $self->{DISTNAME};
1028 $attribs{ZIPFLAGS} ||= '-Vu';
1029 $attribs{COMPRESS} ||= 'gzip';
1030 $attribs{SUFFIX} ||= '-gz';
1031 $attribs{SHAR} ||= 'vms_share';
1032 $attribs{DIST_DEFAULT} ||= 'zipdist';
1034 # Sanitize these for use in $(DISTVNAME) filespec
1035 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1036 $attribs{NAME} =~ s/[^\w\$]/-/g;
1038 return ExtUtils::MM_Unix::dist($self,%attribs);
1041 =item c_o (override)
1043 Use VMS syntax on command line. In particular, $(DEFINE) and
1044 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1050 return '' unless $self->needs_linking();
1053 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1056 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1059 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1064 =item xs_c (override)
1072 return '' unless $self->needs_linking();
1075 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1079 =item xs_o (override)
1081 Use MM[SK] macros, and VMS command line for C compiler.
1085 sub xs_o { # many makes are too dumb to use xs_c then c_o
1087 return '' unless $self->needs_linking();
1090 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1091 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1095 =item top_targets (override)
1097 Use VMS quoting on command line for Version_check.
1105 all :: pure_all manifypods
1108 pure_all :: config pm_to_blib subdirs linkext
1111 subdirs :: $(MYEXTLIB)
1114 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1117 config :: $(INST_ARCHAUTODIR).exists
1120 config :: $(INST_AUTODIR).exists
1124 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1125 if (%{$self->{MAN1PODS}}) {
1127 config :: $(INST_MAN1DIR).exists
1130 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1132 if (%{$self->{MAN3PODS}}) {
1134 config :: $(INST_MAN3DIR).exists
1137 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1141 $(O_FILES) : $(H_FILES)
1142 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1146 perldoc ExtUtils::MakeMaker
1151 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1152 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1158 =item dlsyms (override)
1160 Create VMS linker options files specifying universal symbols for this
1161 extension's shareable image, and listing other shareable images or
1162 libraries to which it should be linked.
1167 my($self,%attribs) = @_;
1169 return '' unless $self->needs_linking();
1171 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1172 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1173 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1176 unless ($self->{SKIPHASH}{'dynamic'}) {
1178 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1184 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1186 ') unless $self->{SKIPHASH}{'static'};
1189 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1190 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1192 $(BASEEXT).opt : Makefile.PL
1193 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1194 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1195 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1196 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1198 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1199 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1200 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1201 push @m, ($Config{d_vms_case_sensitive_symbols}
1202 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1204 else { # We don't have a "main" object file, so pull 'em all in
1205 # Upcase module names if linker is being case-sensitive
1206 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1207 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1208 s[\$\(\w+_EXT\)][]; # even as a macro
1209 s/.*[:>\/\]]//; # Trim off dir spec
1210 $upcase ? uc($_) : $_;
1211 } split ' ', $self->eliminate_macros($self->{OBJECT});
1212 my($tmp, @lines,$elt) = '';
1213 $tmp = shift @omods;
1214 foreach $elt (@omods) {
1216 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1219 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1221 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1223 if (length $self->{LDLOADLIBS}) {
1224 my($lib); my($line) = '';
1225 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1226 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1227 if (length($line) + length($lib) > 160) {
1228 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1229 $line = $lib . '\n';
1231 else { $line .= $lib . '\n'; }
1233 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1240 =item dynamic_lib (override)
1242 Use VMS Link command.
1247 my($self, %attribs) = @_;
1248 return '' unless $self->needs_linking(); #might be because of a subdir
1250 return '' unless $self->has_link_code();
1252 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1253 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1254 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1258 OTHERLDFLAGS = $otherldflags
1259 INST_DYNAMIC_DEP = $inst_dynamic_dep
1263 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1264 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1265 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1266 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1269 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1273 =item dynamic_bs (override)
1275 Use VMS-style quoting on Mkbootstrap command line.
1280 my($self, %attribs) = @_;
1283 ' unless $self->has_link_code();
1285 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1287 # As MakeMaker mkbootstrap might not write a file (if none is required)
1288 # we use touch to prevent make continually trying to remake it.
1289 # The DynaLoader only reads a non-empty file.
1290 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1291 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1292 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1293 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1294 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1296 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1297 $(NOECHO) $(RM_RF) $(INST_BOOT)
1298 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1302 =item static_lib (override)
1304 Use VMS commands to manipulate object library.
1310 return '' unless $self->needs_linking();
1315 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1319 # Rely on suffix rule for update action
1320 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1322 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1324 # If this extension has it's own library (eg SDBM_File)
1325 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1326 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1328 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1330 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1331 # 'cause it's a library and you can't stick them in other libraries.
1332 # In that case, we use $OBJECT instead and hope for the best
1333 if ($self->{MYEXTLIB}) {
1334 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1336 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1339 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1340 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1341 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1343 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1348 =item manifypods (override)
1350 Use VMS-style quoting on command line, and VMS logical name
1351 to specify fallback location at build time if we can't find pod2man.
1357 my($self, %attribs) = @_;
1358 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1361 if (defined $self->{PERL_SRC}) {
1362 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1364 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1366 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1367 # No pod2man but some MAN3PODS to be installed
1370 Warning: I could not locate your pod2man program. As a last choice,
1371 I will look for the file to which the logical name POD2MAN
1372 points when MMK is invoked.
1375 $pod2man_exe = "pod2man";
1379 qq[POD2MAN_EXE = $pod2man_exe\n],
1380 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1381 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1383 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1384 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1386 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1387 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1388 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1390 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1391 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1392 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1398 =item processPL (override)
1400 Use VMS-style quoting on command line.
1406 return "" unless $self->{PL_FILES};
1408 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1409 my $list = ref($self->{PL_FILES}->{$plfile})
1410 ? $self->{PL_FILES}->{$plfile}
1411 : [$self->{PL_FILES}->{$plfile}];
1412 foreach $target (@$list) {
1413 my $vmsplfile = vmsify($plfile);
1414 my $vmsfile = vmsify($target);
1419 $vmsfile :: $vmsplfile
1420 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1427 =item installbin (override)
1429 Stay under DCL's 255 character command line limit once again by
1430 splitting potentially long list of files across multiple lines
1431 in C<realclean> target.
1437 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1438 return '' unless @{$self->{EXE_FILES}};
1439 my(@m, $from, $to, %fromto, @to, $line);
1440 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1441 for $from (@exefiles) {
1442 my($path) = '$(INST_SCRIPT)' . basename($from);
1443 local($_) = $path; # backward compatibility
1444 $to = $self->libscan($path);
1445 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1446 $fromto{$from} = vmsify($to);
1448 @to = values %fromto;
1450 EXE_FILES = @exefiles
1457 $line = ''; #avoid unitialized var warning
1459 if (length($line) + length($to) > 80) {
1460 push @m, "\t\$(RM_F) $line\n";
1463 else { $line .= " $to"; }
1465 push @m, "\t\$(RM_F) $line\n\n" if $line;
1467 while (($from,$to) = each %fromto) {
1468 last unless defined $from;
1470 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1471 else { ($todir = $to) =~ s/[^\)]+$//; }
1472 $todir = $self->fixpath($todir,1);
1474 $to : $from \$(MAKEFILE) ${todir}.exists
1477 ", $self->dir_target($todir);
1482 =item subdir_x (override)
1484 Use VMS commands to change default directory.
1489 my($self, $subdir) = @_;
1491 $subdir = $self->fixpath($subdir,1);
1495 olddef = F$Environment("Default")
1496 Set Default ',$subdir,'
1497 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1498 Set Default \'olddef\'
1503 =item clean (override)
1505 Split potentially long list of files across multiple commands (in
1506 order to stay under the magic command line limit). Also use MM[SK]
1507 commands for handling subdirectories.
1512 my($self, %attribs) = @_;
1515 # Delete temporary files but do not touch installed files. We don\'t delete
1516 # the Descrip.MMS here so that a later make realclean still has it to use.
1519 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1520 my($vmsdir) = $self->fixpath($dir,1);
1521 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1522 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1524 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1527 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1528 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1529 # a list or a macro that expands to a list.
1530 if ($attribs{FILES}) {
1531 my($word,$key,@filist);
1532 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1533 else { @filist = split /\s+/, $attribs{FILES}; }
1534 foreach $word (@filist) {
1535 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1536 push(@otherfiles, @{$self->{$key}});
1538 else { push(@otherfiles, $word); }
1541 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1542 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1544 $line = ''; #avoid unitialized var warning
1545 # Occasionally files are repeated several times from different sources
1546 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1548 foreach $file (@otherfiles) {
1549 $file = $self->fixpath($file);
1550 if (length($line) + length($file) > 80) {
1551 push @m, "\t\$(RM_RF) $line\n";
1554 else { $line .= " $file"; }
1556 push @m, "\t\$(RM_RF) $line\n" if $line;
1557 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1561 =item realclean (override)
1563 Guess what we're working around? Also, use MM[SK] for subdirectories.
1568 my($self, %attribs) = @_;
1571 # Delete temporary files (via clean) and also delete installed files
1574 foreach(@{$self->{DIR}}){
1575 my($vmsdir) = $self->fixpath($_,1);
1576 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1577 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1579 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1581 # We can't expand several of the MMS macros here, since they don't have
1582 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1583 # combination of macros). In order to stay below DCL's 255 char limit,
1584 # we put only 2 on a line.
1585 my($file,$line,$fcnt);
1586 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1587 if ($self->has_link_code) {
1588 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1590 push(@files, values %{$self->{PM}});
1591 $line = ''; #avoid unitialized var warning
1592 # Occasionally files are repeated several times from different sources
1593 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1594 foreach $file (@files) {
1595 $file = $self->fixpath($file);
1596 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1597 push @m, "\t\$(RM_F) $line\n";
1601 else { $line .= " $file"; }
1603 push @m, "\t\$(RM_F) $line\n" if $line;
1604 if ($attribs{FILES}) {
1605 my($word,$key,@filist,@allfiles);
1606 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1607 else { @filist = split /\s+/, $attribs{FILES}; }
1608 foreach $word (@filist) {
1609 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1610 push(@allfiles, @{$self->{$key}});
1612 else { push(@allfiles, $word); }
1615 # Occasionally files are repeated several times from different sources
1616 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1617 foreach $file (@allfiles) {
1618 $file = $self->fixpath($file);
1619 if (length($line) + length($file) > 80) {
1620 push @m, "\t\$(RM_RF) $line\n";
1623 else { $line .= " $file"; }
1625 push @m, "\t\$(RM_RF) $line\n" if $line;
1627 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1631 =item dist_basics (override)
1633 Use VMS-style quoting on command line.
1640 distclean :: realclean distcheck
1644 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1647 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1650 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1654 =item dist_core (override)
1656 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1657 so C<shdist> target actions are VMS-specific.
1664 dist : $(DIST_DEFAULT)
1665 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1667 zipdist : $(DISTVNAME).zip
1670 tardist : $(DISTVNAME).tar$(SUFFIX)
1673 $(DISTVNAME).zip : distdir
1675 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1676 $(RM_RF) $(DISTVNAME)
1679 $(DISTVNAME).tar$(SUFFIX) : distdir
1682 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1683 $(RM_RF) $(DISTVNAME)
1684 $(COMPRESS) $(DISTVNAME).tar
1689 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1690 $(RM_RF) $(DISTVNAME)
1695 =item dist_dir (override)
1697 Use VMS-style quoting on command line.
1705 $(RM_RF) $(DISTVNAME)
1706 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1707 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1711 =item dist_test (override)
1713 Use VMS commands to change default directory, and use VMS-style
1714 quoting on command line.
1722 startdir = F$Environment("Default")
1723 Set Default [.$(DISTVNAME)]
1724 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1725 $(MMS)$(MMSQUALIFIERS)
1726 $(MMS)$(MMSQUALIFIERS) test
1727 Set Default 'startdir'
1731 # --- Test and Installation Sections ---
1733 =item install (override)
1735 Work around DCL's 255 character limit several times,and use
1736 VMS-style command line quoting in a few cases.
1741 my($self, %attribs) = @_;
1744 if ($self->{EXE_FILES}) {
1745 my($line,$file) = ('','');
1746 foreach $file (@{$self->{EXE_FILES}}) {
1748 if (length($line) > 128) {
1749 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1753 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1757 install :: all pure_install doc_install
1760 install_perl :: all pure_perl_install doc_perl_install
1763 install_site :: all pure_site_install doc_site_install
1766 install_ :: install_site
1767 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1769 pure_install :: pure_$(INSTALLDIRS)_install
1772 doc_install :: doc_$(INSTALLDIRS)_install
1773 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1775 pure__install : pure_site_install
1776 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1778 doc__install : doc_site_install
1779 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1781 # This hack brought to you by DCL's 255-character command line limit
1782 pure_perl_install ::
1783 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1784 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1785 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1786 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1787 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1788 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1789 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1790 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1791 $(MOD_INSTALL) <.MM_tmp
1792 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1793 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1796 pure_site_install ::
1797 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1798 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1799 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1800 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1801 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1802 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1803 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1804 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1805 $(MOD_INSTALL) <.MM_tmp
1806 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1807 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1811 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1812 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1814 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1815 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1816 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1817 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1818 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1819 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1823 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1824 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1826 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1827 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1828 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1829 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1830 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1831 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1836 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1839 uninstall_from_perldirs ::
1840 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1841 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1842 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1843 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1845 uninstall_from_sitedirs ::
1846 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1847 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1848 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1849 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1855 =item perldepend (override)
1857 Use VMS-style syntax for files; it's cheaper to just do it directly here
1858 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1859 we have to rebuild Config.pm, use MM[SK] to do it.
1868 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1869 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1870 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1871 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1872 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1873 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1874 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1875 $(OBJECT) : $(PERL_INC)iperlsys.h
1877 ' if $self->{OBJECT};
1879 if ($self->{PERL_SRC}) {
1881 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1882 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1883 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1884 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1885 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1886 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1887 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1889 # Check for unpropagated config.sh changes. Should never happen.
1890 # We do NOT just update config.h because that is not sufficient.
1891 # An out of date config.h is not fatal but complains loudly!
1892 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1895 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1896 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1897 olddef = F$Environment("Default")
1898 Set Default $(PERL_SRC)
1899 $(MMS)],$mmsquals,);
1900 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1901 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1902 $target =~ s/\Q$prefix/[/;
1903 push(@m," $target");
1905 else { push(@m,' $(MMS$TARGET)'); }
1907 Set Default 'olddef'
1911 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1917 =item makefile (override)
1919 Use VMS commands and quoting.
1926 # We do not know what target was originally specified so we
1927 # must force a manual rerun to be sure. But as it should only
1928 # happen very rarely it is not a significant problem.
1930 $(OBJECT) : $(FIRST_MAKEFILE)
1931 ] if $self->{OBJECT};
1934 # We take a very conservative approach here, but it\'s worth it.
1935 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1936 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1937 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1938 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1939 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1940 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1941 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1942 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1943 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1949 =item test (override)
1951 Use VMS commands for handling subdirectories.
1956 my($self, %attribs) = @_;
1957 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1961 TEST_TYPE = test_\$(LINKTYPE)
1965 test :: \$(TEST_TYPE)
1968 testdb :: testdb_\$(LINKTYPE)
1972 foreach(@{$self->{DIR}}){
1973 my($vmsdir) = $self->fixpath($_,1);
1974 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1975 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1977 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1978 unless $tests or -f "test.pl" or @{$self->{DIR}};
1981 push(@m, "test_dynamic :: pure_all\n");
1982 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1983 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1984 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1987 push(@m, "testdb_dynamic :: pure_all\n");
1988 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1991 # Occasionally we may face this degenerate target:
1992 push @m, "test_ : test_dynamic\n\n";
1994 if ($self->needs_linking()) {
1995 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1996 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1997 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1999 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2000 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2004 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2005 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2011 =item test_via_harness (override)
2013 Use VMS-style quoting on command line.
2017 sub test_via_harness {
2018 my($self,$perl,$tests) = @_;
2019 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2020 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2023 =item test_via_script (override)
2025 Use VMS-style quoting on command line.
2029 sub test_via_script {
2030 my($self,$perl,$script) = @_;
2031 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2035 =item makeaperl (override)
2037 Undertake to build a new set of Perl images using VMS commands. Since
2038 VMS does dynamic loading, it's not necessary to statically link each
2039 extension into the Perl image, so this isn't the normal build path.
2040 Consequently, it hasn't really been tested, and may well be incomplete.
2045 my($self, %attribs) = @_;
2046 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2047 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2050 # --- MakeMaker makeaperl section ---
2051 MAP_TARGET = $target
2053 return join '', @m if $self->{PARENT};
2055 my($dir) = join ":", @{$self->{DIR}};
2057 unless ($self->{MAKEAPERL}) {
2059 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2060 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2061 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2062 Makefile.PL DIR=}, $dir, q{ \
2063 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2064 MAKEAPERL=1 NORECURS=1 };
2066 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2068 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2069 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2077 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2080 # The front matter of the linkcommand...
2081 $linkcmd = join ' ', $Config{'ld'},
2082 grep($_, @Config{qw(large split ldflags ccdlflags)});
2083 $linkcmd =~ s/\s+/ /g;
2085 # Which *.olb files could we make use of...
2087 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2089 File::Find::find(sub {
2090 return unless m/\Q$self->{LIB_EXT}\E$/;
2091 return if m/^libperl/;
2093 if( exists $self->{INCLUDE_EXT} ){
2098 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2102 # Throw away anything not explicitly marked for inclusion.
2103 # DynaLoader is implied.
2104 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2110 return unless $found;
2112 elsif( exists $self->{EXCLUDE_EXT} ){
2116 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2120 # Throw away anything explicitly marked for exclusion
2121 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2122 return if( $xx eq $excl );
2126 $olbs{$ENV{DEFAULT}} = $_;
2127 }, grep( -d $_, @{$searchdirs || []}));
2129 # We trust that what has been handed in as argument will be buildable
2130 $static = [] unless $static;
2131 @olbs{@{$static}} = (1) x @{$static};
2133 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2134 # Sort the object libraries in inverse order of
2135 # filespec length to try to insure that dependent extensions
2136 # will appear before their parents, so the linker will
2137 # search the parent library to resolve references.
2138 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2139 # references from [.intuit.dwim]dwim.obj can be found
2140 # in [.intuit]intuit.olb).
2141 for (sort { length($a) <=> length($b) } keys %olbs) {
2142 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2143 my($dir) = $self->fixpath($_,1);
2144 my($extralibs) = $dir . "extralibs.ld";
2145 my($extopt) = $dir . $olbs{$_};
2146 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2147 push @optlibs, "$dir$olbs{$_}";
2148 # Get external libraries this extension will need
2149 if (-f $extralibs ) {
2151 open LIST,$extralibs or warn $!,next;
2154 # Include a library in the link only once, unless it's mentioned
2155 # multiple times within a single extension's options file, in which
2156 # case we assume the builder needed to search it again later in the
2158 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2159 $libseen{$_}++; $seenthis{$_}++;
2165 # Get full name of extension for ExtUtils::Miniperl
2167 open OPT,$extopt or die $!;
2169 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2172 push @staticpkgs,$pkg;
2176 # Place all of the external libraries after all of the Perl extension
2177 # libraries in the final link, in order to maximize the opportunity
2178 # for XS code from multiple extensions to resolve symbols against the
2179 # same external library while only including that library once.
2180 push @optlibs, @$extra;
2182 $target = "Perl$Config{'exe_ext'}" unless $target;
2183 ($shrtarget,$targdir) = fileparse($target);
2184 $shrtarget =~ s/^([^.]*)/$1Shr/;
2185 $shrtarget = $targdir . $shrtarget;
2186 $target = "Perlshr.$Config{'dlext'}" unless $target;
2187 $tmp = "[]" unless $tmp;
2188 $tmp = $self->fixpath($tmp,1);
2189 if (@optlibs) { $extralist = join(' ',@optlibs); }
2190 else { $extralist = ''; }
2191 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2192 # that's what we're building here).
2193 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2195 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2196 print STDOUT "Warning: $libperl not found\n";
2201 if (defined $self->{PERL_SRC}) {
2202 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2203 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2205 print STDOUT "Warning: $libperl not found
2206 If you're going to build a static perl binary, make sure perl is installed
2207 otherwise ignore this warning\n";
2210 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2213 # Fill in the target you want to produce if it\'s not perl
2214 MAP_TARGET = ',$self->fixpath($target,0),'
2215 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2216 MAP_LINKCMD = $linkcmd
2217 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2218 MAP_EXTRA = $extralist
2219 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2223 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2224 foreach (@optlibs) {
2225 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2227 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2228 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2231 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2232 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2233 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2234 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2235 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2236 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2237 $(NOECHO) $(SAY) "To remove the intermediate files, say
2238 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2240 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2241 push @m, "# More from the 255-char line length limit\n";
2242 foreach (@staticpkgs) {
2243 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2246 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2247 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2250 # Still more from the 255-char line length limit
2252 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2253 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2254 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2255 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2256 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2257 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2261 inst_perl : pure_inst_perl doc_inst_perl
2264 pure_inst_perl : \$(MAP_TARGET)
2265 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2266 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2272 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2273 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2279 # --- Output postprocessing section ---
2281 =item nicetext (override)
2283 Insure that colons marking targets are preceded by space, in order
2284 to distinguish the target delimiter from a colon appearing as
2291 my($self,$text) = @_;
2292 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;