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 if ($Config{'ldflags'} &&
885 $Config{'ldflags'} =~ m!/Debug!i &&
886 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
887 unshift(@tmargs,'-nolinenumbers');
889 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
891 # What are the correct thresholds for version 1 && 2 Paul?
892 if ( $xsubpp_version > 1.923 ){
893 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
895 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
896 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
897 Your version of xsubpp is $xsubpp_version and cannot handle this.
898 Please upgrade to a more recent version of xsubpp.
901 $self->{XSPROTOARG} = "";
907 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
908 XSPROTOARG = $self->{XSPROTOARG}
914 =item xsubpp_version (override)
916 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
917 rather than Unix rules ($sts == 0 ==E<gt> good).
923 my($self,$xsubpp) = @_;
925 return '' unless $self->needs_linking;
927 # try to figure out the version number of the xsubpp on the system
929 # first try the -v flag, introduced in 1.921 & 2.000a2
931 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
932 print "Running: $command\n" if $Verbose;
933 $version = `$command` ;
936 warn "Running '$command' exits with status $?";
940 return $1 if $version =~ /^xsubpp version (.*)/ ;
942 # nope, then try something else
945 my ($file) = 'temp' ;
946 $counter++ while -e "$file$counter"; # don't overwrite anything
950 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
952 MODULE = fred PACKAGE = fred
961 $command = "$self->{PERL} $xsubpp $file";
962 print "Running: $command\n" if $Verbose;
963 my $text = `$command` ;
966 warn "Running '$command' exits with status $?";
970 # gets 1.2 -> 1.92 and 2.000a1
971 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
973 # it is either 1.0 or 1.1
974 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
976 # none of the above, so 1.0
980 =item tools_other (override)
982 Adds a few MM[SK] macros, and shortens some the installatin commands,
983 in order to stay under DCL's 255-character limit. Also changes
984 EQUALIZE_TIMESTAMP to set revision date of target file to one second
985 later than source file, since MMK interprets precisely equal revision
986 dates for a source and target file as a sign that the target needs
994 # Assumes \$(MMS) invokes MMS or MMK
995 # (It is assumed in some cases later that the default makefile name
996 # (Descrip.MMS for MM[SK]) is used.)
997 USEMAKEFILE = /Descrip=
1000 MAKEFILE = Descrip.MMS
1002 TOUCH = $self->{TOUCH}
1003 CHMOD = $self->{CHMOD}
1006 RM_F = $self->{RM_F}
1007 RM_RF = $self->{RM_RF}
1008 SAY = Write Sys\$Output
1009 UMASK_NULL = $self->{UMASK_NULL}
1010 NOOP = $self->{NOOP}
1011 NOECHO = $self->{NOECHO}
1012 MKPATH = Create/Directory
1013 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1014 !. ($self->{PARENT} ? '' :
1015 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1016 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1017 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]"
1018 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1022 =item dist (override)
1024 Provide VMSish defaults for some values, then hand off to
1025 default MM_Unix method.
1030 my($self, %attribs) = @_;
1031 $attribs{VERSION} ||= $self->{VERSION_SYM};
1032 $attribs{NAME} ||= $self->{DISTNAME};
1033 $attribs{ZIPFLAGS} ||= '-Vu';
1034 $attribs{COMPRESS} ||= 'gzip';
1035 $attribs{SUFFIX} ||= '-gz';
1036 $attribs{SHAR} ||= 'vms_share';
1037 $attribs{DIST_DEFAULT} ||= 'zipdist';
1039 # Sanitize these for use in $(DISTVNAME) filespec
1040 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1041 $attribs{NAME} =~ s/[^\w\$]/-/g;
1043 return ExtUtils::MM_Unix::dist($self,%attribs);
1046 =item c_o (override)
1048 Use VMS syntax on command line. In particular, $(DEFINE) and
1049 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1055 return '' unless $self->needs_linking();
1058 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1061 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1064 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1069 =item xs_c (override)
1077 return '' unless $self->needs_linking();
1080 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1084 =item xs_o (override)
1086 Use MM[SK] macros, and VMS command line for C compiler.
1090 sub xs_o { # many makes are too dumb to use xs_c then c_o
1092 return '' unless $self->needs_linking();
1095 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1096 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1100 =item top_targets (override)
1102 Use VMS quoting on command line for Version_check.
1110 all :: pure_all manifypods
1113 pure_all :: config pm_to_blib subdirs linkext
1116 subdirs :: $(MYEXTLIB)
1119 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1122 config :: $(INST_ARCHAUTODIR).exists
1125 config :: $(INST_AUTODIR).exists
1129 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1130 if (%{$self->{MAN1PODS}}) {
1132 config :: $(INST_MAN1DIR).exists
1135 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1137 if (%{$self->{MAN3PODS}}) {
1139 config :: $(INST_MAN3DIR).exists
1142 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1146 $(O_FILES) : $(H_FILES)
1147 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1151 perldoc ExtUtils::MakeMaker
1156 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1157 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1163 =item dlsyms (override)
1165 Create VMS linker options files specifying universal symbols for this
1166 extension's shareable image, and listing other shareable images or
1167 libraries to which it should be linked.
1172 my($self,%attribs) = @_;
1174 return '' unless $self->needs_linking();
1176 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1177 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1178 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1181 unless ($self->{SKIPHASH}{'dynamic'}) {
1183 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1189 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1191 ') unless $self->{SKIPHASH}{'static'};
1194 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1195 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1197 $(BASEEXT).opt : Makefile.PL
1198 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1199 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1200 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1201 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1203 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1204 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1205 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1206 push @m, ($Config{d_vms_case_sensitive_symbols}
1207 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1209 else { # We don't have a "main" object file, so pull 'em all in
1210 # Upcase module names if linker is being case-sensitive
1211 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1212 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1213 s[\$\(\w+_EXT\)][]; # even as a macro
1214 s/.*[:>\/\]]//; # Trim off dir spec
1215 $upcase ? uc($_) : $_;
1216 } split ' ', $self->eliminate_macros($self->{OBJECT});
1217 my($tmp,@lines,$elt) = '';
1218 $tmp = shift @omods;
1219 foreach $elt (@omods) {
1221 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1224 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1226 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1228 if (length $self->{LDLOADLIBS}) {
1229 my($lib); my($line) = '';
1230 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1231 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1232 if (length($line) + length($lib) > 160) {
1233 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1234 $line = $lib . '\n';
1236 else { $line .= $lib . '\n'; }
1238 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1245 =item dynamic_lib (override)
1247 Use VMS Link command.
1252 my($self, %attribs) = @_;
1253 return '' unless $self->needs_linking(); #might be because of a subdir
1255 return '' unless $self->has_link_code();
1257 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1258 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1259 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1263 OTHERLDFLAGS = $otherldflags
1264 INST_DYNAMIC_DEP = $inst_dynamic_dep
1268 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1269 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1270 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1271 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1274 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1278 =item dynamic_bs (override)
1280 Use VMS-style quoting on Mkbootstrap command line.
1285 my($self, %attribs) = @_;
1288 ' unless $self->has_link_code();
1290 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1292 # As MakeMaker mkbootstrap might not write a file (if none is required)
1293 # we use touch to prevent make continually trying to remake it.
1294 # The DynaLoader only reads a non-empty file.
1295 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1296 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1297 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1298 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1299 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1301 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1302 $(NOECHO) $(RM_RF) $(INST_BOOT)
1303 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1307 =item static_lib (override)
1309 Use VMS commands to manipulate object library.
1315 return '' unless $self->needs_linking();
1320 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1324 # Rely on suffix rule for update action
1325 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1327 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1329 # If this extension has it's own library (eg SDBM_File)
1330 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1331 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1333 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1335 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1336 # 'cause it's a library and you can't stick them in other libraries.
1337 # In that case, we use $OBJECT instead and hope for the best
1338 if ($self->{MYEXTLIB}) {
1339 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1341 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1344 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1345 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1346 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1348 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1353 =item manifypods (override)
1355 Use VMS-style quoting on command line, and VMS logical name
1356 to specify fallback location at build time if we can't find pod2man.
1362 my($self, %attribs) = @_;
1363 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1366 if (defined $self->{PERL_SRC}) {
1367 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1369 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1371 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1372 # No pod2man but some MAN3PODS to be installed
1375 Warning: I could not locate your pod2man program. As a last choice,
1376 I will look for the file to which the logical name POD2MAN
1377 points when MMK is invoked.
1380 $pod2man_exe = "pod2man";
1384 qq[POD2MAN_EXE = $pod2man_exe\n],
1385 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1386 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1388 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1389 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1391 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1392 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1393 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1395 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1396 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1397 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1403 =item processPL (override)
1405 Use VMS-style quoting on command line.
1411 return "" unless $self->{PL_FILES};
1413 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1414 my $list = ref($self->{PL_FILES}->{$plfile})
1415 ? $self->{PL_FILES}->{$plfile}
1416 : [$self->{PL_FILES}->{$plfile}];
1417 foreach $target (@$list) {
1418 my $vmsplfile = vmsify($plfile);
1419 my $vmsfile = vmsify($target);
1424 $vmsfile :: $vmsplfile
1425 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1432 =item installbin (override)
1434 Stay under DCL's 255 character command line limit once again by
1435 splitting potentially long list of files across multiple lines
1436 in C<realclean> target.
1442 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1443 return '' unless @{$self->{EXE_FILES}};
1444 my(@m, $from, $to, %fromto, @to, $line);
1445 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1446 for $from (@exefiles) {
1447 my($path) = '$(INST_SCRIPT)' . basename($from);
1448 local($_) = $path; # backward compatibility
1449 $to = $self->libscan($path);
1450 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1451 $fromto{$from} = vmsify($to);
1453 @to = values %fromto;
1455 EXE_FILES = @exefiles
1462 $line = ''; #avoid unitialized var warning
1464 if (length($line) + length($to) > 80) {
1465 push @m, "\t\$(RM_F) $line\n";
1468 else { $line .= " $to"; }
1470 push @m, "\t\$(RM_F) $line\n\n" if $line;
1472 while (($from,$to) = each %fromto) {
1473 last unless defined $from;
1475 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1476 else { ($todir = $to) =~ s/[^\)]+$//; }
1477 $todir = $self->fixpath($todir,1);
1479 $to : $from \$(MAKEFILE) ${todir}.exists
1482 ", $self->dir_target($todir);
1487 =item subdir_x (override)
1489 Use VMS commands to change default directory.
1494 my($self, $subdir) = @_;
1496 $subdir = $self->fixpath($subdir,1);
1500 olddef = F$Environment("Default")
1501 Set Default ',$subdir,'
1502 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1503 Set Default \'olddef\'
1508 =item clean (override)
1510 Split potentially long list of files across multiple commands (in
1511 order to stay under the magic command line limit). Also use MM[SK]
1512 commands for handling subdirectories.
1517 my($self, %attribs) = @_;
1520 # Delete temporary files but do not touch installed files. We don\'t delete
1521 # the Descrip.MMS here so that a later make realclean still has it to use.
1524 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1525 my($vmsdir) = $self->fixpath($dir,1);
1526 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1527 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1529 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1532 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1533 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1534 # a list or a macro that expands to a list.
1535 if ($attribs{FILES}) {
1536 my($word,$key,@filist);
1537 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1538 else { @filist = split /\s+/, $attribs{FILES}; }
1539 foreach $word (@filist) {
1540 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1541 push(@otherfiles, @{$self->{$key}});
1543 else { push(@otherfiles, $word); }
1546 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1547 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1549 $line = ''; #avoid unitialized var warning
1550 # Occasionally files are repeated several times from different sources
1551 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1553 foreach $file (@otherfiles) {
1554 $file = $self->fixpath($file);
1555 if (length($line) + length($file) > 80) {
1556 push @m, "\t\$(RM_RF) $line\n";
1559 else { $line .= " $file"; }
1561 push @m, "\t\$(RM_RF) $line\n" if $line;
1562 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1566 =item realclean (override)
1568 Guess what we're working around? Also, use MM[SK] for subdirectories.
1573 my($self, %attribs) = @_;
1576 # Delete temporary files (via clean) and also delete installed files
1579 foreach(@{$self->{DIR}}){
1580 my($vmsdir) = $self->fixpath($_,1);
1581 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1582 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1584 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1586 # We can't expand several of the MMS macros here, since they don't have
1587 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1588 # combination of macros). In order to stay below DCL's 255 char limit,
1589 # we put only 2 on a line.
1590 my($file,$line,$fcnt);
1591 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1592 if ($self->has_link_code) {
1593 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1595 push(@files, values %{$self->{PM}});
1596 $line = ''; #avoid unitialized var warning
1597 # Occasionally files are repeated several times from different sources
1598 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1599 foreach $file (@files) {
1600 $file = $self->fixpath($file);
1601 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1602 push @m, "\t\$(RM_F) $line\n";
1606 else { $line .= " $file"; }
1608 push @m, "\t\$(RM_F) $line\n" if $line;
1609 if ($attribs{FILES}) {
1610 my($word,$key,@filist,@allfiles);
1611 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1612 else { @filist = split /\s+/, $attribs{FILES}; }
1613 foreach $word (@filist) {
1614 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1615 push(@allfiles, @{$self->{$key}});
1617 else { push(@allfiles, $word); }
1620 # Occasionally files are repeated several times from different sources
1621 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1622 foreach $file (@allfiles) {
1623 $file = $self->fixpath($file);
1624 if (length($line) + length($file) > 80) {
1625 push @m, "\t\$(RM_RF) $line\n";
1628 else { $line .= " $file"; }
1630 push @m, "\t\$(RM_RF) $line\n" if $line;
1632 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1636 =item dist_basics (override)
1638 Use VMS-style quoting on command line.
1645 distclean :: realclean distcheck
1649 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1652 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1655 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1659 =item dist_core (override)
1661 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1662 so C<shdist> target actions are VMS-specific.
1669 dist : $(DIST_DEFAULT)
1670 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1672 zipdist : $(DISTVNAME).zip
1675 tardist : $(DISTVNAME).tar$(SUFFIX)
1678 $(DISTVNAME).zip : distdir
1680 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1681 $(RM_RF) $(DISTVNAME)
1684 $(DISTVNAME).tar$(SUFFIX) : distdir
1687 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1688 $(RM_RF) $(DISTVNAME)
1689 $(COMPRESS) $(DISTVNAME).tar
1694 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1695 $(RM_RF) $(DISTVNAME)
1700 =item dist_dir (override)
1702 Use VMS-style quoting on command line.
1710 $(RM_RF) $(DISTVNAME)
1711 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1712 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1716 =item dist_test (override)
1718 Use VMS commands to change default directory, and use VMS-style
1719 quoting on command line.
1727 startdir = F$Environment("Default")
1728 Set Default [.$(DISTVNAME)]
1729 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1730 $(MMS)$(MMSQUALIFIERS)
1731 $(MMS)$(MMSQUALIFIERS) test
1732 Set Default 'startdir'
1736 # --- Test and Installation Sections ---
1738 =item install (override)
1740 Work around DCL's 255 character limit several times,and use
1741 VMS-style command line quoting in a few cases.
1746 my($self, %attribs) = @_;
1749 if ($self->{EXE_FILES}) {
1750 my($line,$file) = ('','');
1751 foreach $file (@{$self->{EXE_FILES}}) {
1753 if (length($line) > 128) {
1754 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1758 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1762 install :: all pure_install doc_install
1765 install_perl :: all pure_perl_install doc_perl_install
1768 install_site :: all pure_site_install doc_site_install
1771 install_ :: install_site
1772 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1774 pure_install :: pure_$(INSTALLDIRS)_install
1777 doc_install :: doc_$(INSTALLDIRS)_install
1778 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1780 pure__install : pure_site_install
1781 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1783 doc__install : doc_site_install
1784 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1786 # This hack brought to you by DCL's 255-character command line limit
1787 pure_perl_install ::
1788 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1789 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1790 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1791 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1792 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1793 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1794 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1795 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1796 $(MOD_INSTALL) <.MM_tmp
1797 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1798 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1801 pure_site_install ::
1802 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1803 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1804 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1805 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1806 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1807 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1808 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1809 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1810 $(MOD_INSTALL) <.MM_tmp
1811 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1812 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1816 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1817 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1819 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1820 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1821 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1822 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1823 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1824 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1828 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1829 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1831 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1832 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1833 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1834 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1835 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1836 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1841 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1844 uninstall_from_perldirs ::
1845 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1846 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1847 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1848 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1850 uninstall_from_sitedirs ::
1851 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1852 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1853 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1854 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1860 =item perldepend (override)
1862 Use VMS-style syntax for files; it's cheaper to just do it directly here
1863 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1864 we have to rebuild Config.pm, use MM[SK] to do it.
1873 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1874 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1875 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1876 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1877 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1878 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1879 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1880 $(OBJECT) : $(PERL_INC)iperlsys.h
1882 ' if $self->{OBJECT};
1884 if ($self->{PERL_SRC}) {
1886 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1887 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1888 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1889 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1890 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1891 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1892 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1894 # Check for unpropagated config.sh changes. Should never happen.
1895 # We do NOT just update config.h because that is not sufficient.
1896 # An out of date config.h is not fatal but complains loudly!
1897 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1900 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1901 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1902 olddef = F$Environment("Default")
1903 Set Default $(PERL_SRC)
1904 $(MMS)],$mmsquals,);
1905 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1906 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1907 $target =~ s/\Q$prefix/[/;
1908 push(@m," $target");
1910 else { push(@m,' $(MMS$TARGET)'); }
1912 Set Default 'olddef'
1916 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1922 =item makefile (override)
1924 Use VMS commands and quoting.
1931 # We do not know what target was originally specified so we
1932 # must force a manual rerun to be sure. But as it should only
1933 # happen very rarely it is not a significant problem.
1935 $(OBJECT) : $(FIRST_MAKEFILE)
1936 ] if $self->{OBJECT};
1939 # We take a very conservative approach here, but it\'s worth it.
1940 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1941 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1942 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1943 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1944 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1945 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1946 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1947 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1948 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1954 =item test (override)
1956 Use VMS commands for handling subdirectories.
1961 my($self, %attribs) = @_;
1962 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1966 TEST_TYPE = test_\$(LINKTYPE)
1970 test :: \$(TEST_TYPE)
1973 testdb :: testdb_\$(LINKTYPE)
1977 foreach(@{$self->{DIR}}){
1978 my($vmsdir) = $self->fixpath($_,1);
1979 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1980 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1982 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1983 unless $tests or -f "test.pl" or @{$self->{DIR}};
1986 push(@m, "test_dynamic :: pure_all\n");
1987 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1988 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1989 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1992 push(@m, "testdb_dynamic :: pure_all\n");
1993 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1996 # Occasionally we may face this degenerate target:
1997 push @m, "test_ : test_dynamic\n\n";
1999 if ($self->needs_linking()) {
2000 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2001 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2002 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2004 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2005 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2009 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2010 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2016 =item test_via_harness (override)
2018 Use VMS-style quoting on command line.
2022 sub test_via_harness {
2023 my($self,$perl,$tests) = @_;
2024 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2025 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2028 =item test_via_script (override)
2030 Use VMS-style quoting on command line.
2034 sub test_via_script {
2035 my($self,$perl,$script) = @_;
2036 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2040 =item makeaperl (override)
2042 Undertake to build a new set of Perl images using VMS commands. Since
2043 VMS does dynamic loading, it's not necessary to statically link each
2044 extension into the Perl image, so this isn't the normal build path.
2045 Consequently, it hasn't really been tested, and may well be incomplete.
2050 my($self, %attribs) = @_;
2051 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2052 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2055 # --- MakeMaker makeaperl section ---
2056 MAP_TARGET = $target
2058 return join '', @m if $self->{PARENT};
2060 my($dir) = join ":", @{$self->{DIR}};
2062 unless ($self->{MAKEAPERL}) {
2064 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2065 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2066 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2067 Makefile.PL DIR=}, $dir, q{ \
2068 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2069 MAKEAPERL=1 NORECURS=1 };
2071 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2073 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2074 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2082 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2085 # The front matter of the linkcommand...
2086 $linkcmd = join ' ', $Config{'ld'},
2087 grep($_, @Config{qw(large split ldflags ccdlflags)});
2088 $linkcmd =~ s/\s+/ /g;
2090 # Which *.olb files could we make use of...
2092 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2094 File::Find::find(sub {
2095 return unless m/\Q$self->{LIB_EXT}\E$/;
2096 return if m/^libperl/;
2098 if( exists $self->{INCLUDE_EXT} ){
2103 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2107 # Throw away anything not explicitly marked for inclusion.
2108 # DynaLoader is implied.
2109 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2115 return unless $found;
2117 elsif( exists $self->{EXCLUDE_EXT} ){
2121 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2125 # Throw away anything explicitly marked for exclusion
2126 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2127 return if( $xx eq $excl );
2131 $olbs{$ENV{DEFAULT}} = $_;
2132 }, grep( -d $_, @{$searchdirs || []}));
2134 # We trust that what has been handed in as argument will be buildable
2135 $static = [] unless $static;
2136 @olbs{@{$static}} = (1) x @{$static};
2138 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2139 # Sort the object libraries in inverse order of
2140 # filespec length to try to insure that dependent extensions
2141 # will appear before their parents, so the linker will
2142 # search the parent library to resolve references.
2143 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2144 # references from [.intuit.dwim]dwim.obj can be found
2145 # in [.intuit]intuit.olb).
2146 for (sort { length($a) <=> length($b) } keys %olbs) {
2147 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2148 my($dir) = $self->fixpath($_,1);
2149 my($extralibs) = $dir . "extralibs.ld";
2150 my($extopt) = $dir . $olbs{$_};
2151 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2152 push @optlibs, "$dir$olbs{$_}";
2153 # Get external libraries this extension will need
2154 if (-f $extralibs ) {
2156 open LIST,$extralibs or warn $!,next;
2159 # Include a library in the link only once, unless it's mentioned
2160 # multiple times within a single extension's options file, in which
2161 # case we assume the builder needed to search it again later in the
2163 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2164 $libseen{$_}++; $seenthis{$_}++;
2170 # Get full name of extension for ExtUtils::Miniperl
2172 open OPT,$extopt or die $!;
2174 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2177 push @staticpkgs,$pkg;
2181 # Place all of the external libraries after all of the Perl extension
2182 # libraries in the final link, in order to maximize the opportunity
2183 # for XS code from multiple extensions to resolve symbols against the
2184 # same external library while only including that library once.
2185 push @optlibs, @$extra;
2187 $target = "Perl$Config{'exe_ext'}" unless $target;
2188 ($shrtarget,$targdir) = fileparse($target);
2189 $shrtarget =~ s/^([^.]*)/$1Shr/;
2190 $shrtarget = $targdir . $shrtarget;
2191 $target = "Perlshr.$Config{'dlext'}" unless $target;
2192 $tmp = "[]" unless $tmp;
2193 $tmp = $self->fixpath($tmp,1);
2194 if (@optlibs) { $extralist = join(' ',@optlibs); }
2195 else { $extralist = ''; }
2196 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2197 # that's what we're building here).
2198 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2200 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2201 print STDOUT "Warning: $libperl not found\n";
2206 if (defined $self->{PERL_SRC}) {
2207 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2208 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2210 print STDOUT "Warning: $libperl not found
2211 If you're going to build a static perl binary, make sure perl is installed
2212 otherwise ignore this warning\n";
2215 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2218 # Fill in the target you want to produce if it\'s not perl
2219 MAP_TARGET = ',$self->fixpath($target,0),'
2220 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2221 MAP_LINKCMD = $linkcmd
2222 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2223 MAP_EXTRA = $extralist
2224 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2228 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2229 foreach (@optlibs) {
2230 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2232 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2233 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2236 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2237 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2238 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2239 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2240 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2241 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2242 $(NOECHO) $(SAY) "To remove the intermediate files, say
2243 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2245 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2246 push @m, "# More from the 255-char line length limit\n";
2247 foreach (@staticpkgs) {
2248 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2251 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2252 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2255 # Still more from the 255-char line length limit
2257 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2258 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2259 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2260 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2261 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2262 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2266 inst_perl : pure_inst_perl doc_inst_perl
2269 pure_inst_perl : \$(MAP_TARGET)
2270 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2271 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2277 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2278 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2284 # --- Output postprocessing section ---
2286 =item nicetext (override)
2288 Insure that colons marking targets are preceded by space, in order
2289 to distinguish the target delimiter from a colon appearing as
2296 my($self,$text) = @_;
2297 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;