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;
16 use vars qw($Revision @ISA);
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);
235 # Check in relative directories first, so we pick up the current
236 # version of Perl if we're running MakeMaker as part of the main build.
237 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
238 my($absb) = $self->file_name_is_absolute($b);
239 if ($absa && $absb) { return $a cmp $b }
240 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
242 # Check miniperl before perl, and check names likely to contain
243 # version numbers before "generic" names, so we pick up an
244 # executable that's less likely to be from an old installation.
245 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
246 my($bb) = $b =~ m!([^:>\]/]+)$!;
247 my($ahasdir) = (length($a) - length($ba) > 0);
248 my($bhasdir) = (length($b) - length($bb) > 0);
249 if ($ahasdir and not $bhasdir) { return 1; }
250 elsif ($bhasdir and not $ahasdir) { return -1; }
251 else { $bb =~ /\d/ <=> $ba =~ /\d/
252 or substr($ba,0,1) cmp substr($bb,0,1)
253 or length($bb) <=> length($ba) } } @$names;
254 # Image names containing Perl version use '_' instead of '.' under VMS
255 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
257 print "Looking for perl $ver by these names:\n";
258 print "\t@snames,\n";
259 print "in these dirs:\n";
262 foreach $dir (@sdirs){
263 next unless defined $dir; # $self->{PERL_SRC} may be undefined
264 $inabs++ if $self->file_name_is_absolute($dir);
266 # We've covered relative dirs; everything else is an absolute
267 # dir (probably an installed location). First, we'll try potential
268 # command names, to see whether we can avoid a long MCR expression.
269 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
270 $inabs++; # Should happen above in next $dir, but just in case . . .
272 foreach $name (@snames){
273 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
274 else { push(@cand,$self->fixpath($name,0)); }
277 foreach $name (@cand) {
278 print "Checking $name\n" if ($trace >= 2);
279 # If it looks like a potential command, try it without the MCR
280 if ($name =~ /^[\w\-\$]+$/ &&
281 `$name -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
282 print "Using PERL=$name\n" if $trace;
285 next unless $vmsfile = $self->maybe_command($name);
286 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
287 print "Executing $vmsfile\n" if ($trace >= 2);
288 if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
289 print "Using PERL=MCR $vmsfile\n" if $trace;
290 return "MCR $vmsfile";
293 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
294 0; # false and not empty
297 =item path (override)
299 Translate logical name DCL$PATH as a searchlist, rather than trying
300 to C<split> string value of C<$ENV{'PATH'}>.
306 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
310 =item maybe_command (override)
312 Follows VMS naming conventions for executable files.
313 If the name passed in doesn't exactly match an executable file,
314 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
315 to check for DCL procedure. If this fails, checks directories in DCL$PATH
316 and finally F<Sys$System:> for an executable file having the name specified,
317 with or without the F<.Exe>-equivalent suffix.
322 my($self,$file) = @_;
323 return $file if -x $file && ! -d _;
325 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
327 if ($file !~ m![/:>\]]!) {
328 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
329 $dir = $ENV{"DCL\$PATH;$i"};
330 $dir .= ':' unless $dir =~ m%[\]:]$%;
333 push(@dirs,'Sys$System:');
334 foreach $dir (@dirs) {
335 my $sysfile = "$dir$file";
336 foreach $ext (@exts) {
337 return $file if -x "$sysfile$ext" && ! -d _;
344 =item maybe_command_in_dirs (override)
346 Uses DCL argument quoting on test command line.
350 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
351 my($self, $names, $dirs, $trace, $ver) = @_;
353 foreach $dir (@$dirs){
354 next unless defined $dir; # $self->{PERL_SRC} may be undefined
355 foreach $name (@$names){
357 if ($self->file_name_is_absolute($name)) {
360 $abs = $self->catfile($dir, $name);
362 print "Checking $abs for $name\n" if ($trace >= 2);
363 next unless $tryabs = $self->maybe_command($abs);
364 print "Substituting $tryabs instead of $abs\n"
365 if ($trace >= 2 and $tryabs ne $abs);
368 print "Executing $abs\n" if ($trace >= 2);
369 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
370 print "Using $abs\n" if $trace;
373 } else { # Do not look for perl
380 =item perl_script (override)
382 If name passed in doesn't specify a readable file, appends F<.com> or
383 F<.pl> and tries again, since it's customary to have file types on all files
389 my($self,$file) = @_;
390 return $file if -r $file && ! -d _;
391 return "$file.com" if -r "$file.com";
392 return "$file.pl" if -r "$file.pl";
396 =item file_name_is_absolute (override)
398 Checks for VMS directory spec as well as Unix separators.
402 sub file_name_is_absolute {
403 my($self,$file) = @_;
404 # If it's a logical name, expand it.
405 $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
406 $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
409 =item replace_manpage_separator
411 Use as separator a character which is legal in a VMS-syntax file name.
415 sub replace_manpage_separator {
417 $man = unixify($man);
422 =item init_others (override)
424 Provide VMS-specific forms of various utility commands, then hand
425 off to the default MM_Unix method.
432 $self->{NOOP} = 'Continue';
433 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
434 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
435 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
436 $self->{NOECHO} ||= '@ ';
437 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
438 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
439 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
440 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
441 $self->{CP} = 'Copy/NoConfirm';
442 $self->{MV} = 'Rename/NoConfirm';
443 $self->{UMASK_NULL} = '! ';
444 &ExtUtils::MM_Unix::init_others;
447 =item constants (override)
449 Fixes up numerous file and directory macros to insure VMS syntax
450 regardless of input syntax. Also adds a few VMS-specific macros
451 and makes lists of files comma-separated.
459 # Be kind about case for pollution
460 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
462 if ($self->{DEFINE} ne '') {
463 my(@terms) = split(/\s+/,$self->{DEFINE});
465 foreach $def (@terms) {
468 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
469 if ($1 eq 'U') { $targ = \@udefs; }
470 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
471 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
474 $def =~ s/"/""/g; # Protect existing " from DCL
475 $def = qq["$def"]; # and quote to prevent parsing of =
479 $self->{DEFINE} = '';
480 if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; }
481 if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; }
484 if ($self->{OBJECT} =~ /\s/) {
485 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
486 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
488 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
491 # Fix up directory specs
492 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
494 foreach $macro ( qw [
495 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
496 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
497 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
498 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
499 SITELIBEXP SITEARCHEXP ] ) {
500 next unless defined $self->{$macro};
501 $self->{$macro} = $self->fixpath($self->{$macro},1);
503 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
504 if ($self->{PERL_SRC});
509 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
510 next unless defined $self->{$macro};
511 $self->{$macro} = $self->fixpath($self->{$macro},0);
515 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
516 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
517 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
518 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
519 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
520 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
521 PERL_INC PERL FULLPERL
523 next unless defined $self->{$macro};
524 push @m, "$macro = $self->{$macro}\n";
529 VERSION_MACRO = VERSION
530 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
531 XS_VERSION_MACRO = XS_VERSION
532 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
534 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
535 MM_VERSION = $ExtUtils::MakeMaker::VERSION
536 MM_REVISION = $ExtUtils::MakeMaker::Revision
537 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
539 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
540 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
541 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
542 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
546 FULLEXT VERSION_FROM OBJECT LDFROM
548 next unless defined $self->{$tmp};
549 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
553 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
555 next unless defined $self->{$tmp};
556 push @m, "$tmp = $self->{$tmp}\n";
559 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
560 next unless defined $self->{$tmp};
562 for $key (keys %{$self->{$tmp}}) {
563 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
565 $self->{$tmp} = \%tmp;
568 for $tmp (qw/ C O_FILES H /) {
569 next unless defined $self->{$tmp};
571 for $val (@{$self->{$tmp}}) {
572 push(@tmp,$self->fixpath($val,0));
574 $self->{$tmp} = \@tmp;
579 # Handy lists of source code files:
580 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
581 C_FILES = ',$self->wraplist(@{$self->{C}}),'
582 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
583 H_FILES = ',$self->wraplist(@{$self->{H}}),'
584 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
585 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
590 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
592 next unless defined $self->{$tmp};
593 push @m, "$tmp = $self->{$tmp}\n";
598 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
600 # Here is the Config.pm that we are using/depend on
601 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
603 # Where to put things:
604 INST_LIBDIR = $self->{INST_LIBDIR}
605 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
607 INST_AUTODIR = $self->{INST_AUTODIR}
608 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
611 if ($self->has_link_code()) {
613 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
614 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(BASEEXT).$(DLEXT)
615 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
618 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
623 EXPORT_LIST = $(BASEEXT).opt
624 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
628 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
629 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
631 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
633 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
639 =item cflags (override)
641 Bypass shell script and produce qualifiers for CC directly (but warn
642 user if a shell script for this extension exists). Fold multiple
643 /Defines into one, since some C compilers pay attention to only one
644 instance of this qualifier on the command line.
649 my($self,$libperl) = @_;
650 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
651 my($definestr,$undefstr,$flagoptstr) = ('','','');
652 my($incstr) = '/Include=($(PERL_INC)';
655 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
656 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
657 " required to modify CC command for $self->{'BASEEXT'}\n"
660 if ($quals =~ / -[DIUOg]/) {
661 while ($quals =~ / -([Og])(\d*)\b/) {
662 my($type,$lvl) = ($1,$2);
663 $quals =~ s/ -$type$lvl\b\s*//;
664 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
665 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
667 while ($quals =~ / -([DIU])(\S+)/) {
668 my($type,$def) = ($1,$2);
669 $quals =~ s/ -$type$def\s*//;
671 if ($type eq 'D') { $definestr .= qq["$def",]; }
672 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
673 else { $undefstr .= qq["$def",]; }
676 if (length $quals and $quals !~ m!/!) {
677 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
680 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
681 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
682 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
683 # Deal with $self->{DEFINE} here since some C compilers pay attention
684 # to only one /Define clause on command line, so we have to
685 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
686 # ($self->{DEFINE} has already been VMSified in constants() above)
687 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
688 for $type (qw(Def Undef)) {
690 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
692 $term =~ s:^\((.+)\)$:$1:;
695 if ($type eq 'Def') {
696 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
699 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
700 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
704 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
706 # Likewise with $self->{INC} and /Include
707 if ($self->{'INC'}) {
708 my(@includes) = split(/\s+/,$self->{INC});
709 foreach (@includes) {
711 $incstr .= ','.$self->fixpath($_,1);
714 $quals .= "$incstr)";
715 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
716 $self->{CCFLAGS} = $quals;
718 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
719 if ($self->{OPTIMIZE} !~ m!/!) {
720 if ($self->{OPTIMIZE} =~ m!\b-g\b!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
721 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
722 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
725 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
726 $self->{OPTIMIZE} = '/Optimize';
730 return $self->{CFLAGS} = qq{
731 CCFLAGS = $self->{CCFLAGS}
732 OPTIMIZE = $self->{OPTIMIZE}
733 PERLTYPE = $self->{PERLTYPE}
739 =item const_cccmd (override)
741 Adds directives to point C preprocessor to the right place when
742 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
743 command line a bit differently than MM_Unix method.
748 my($self,$libperl) = @_;
751 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
752 return '' unless $self->needs_linking();
753 if ($Config{'vms_cc_type'} eq 'gcc') {
756 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
758 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
761 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
762 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
767 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
768 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
769 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
772 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
774 $self->{CONST_CCCMD} = join('',@m);
777 =item pm_to_blib (override)
779 DCL I<still> accepts a maximum of 255 characters on a command
780 line, so we write the (potentially) long list of file names
781 to a temp file, then persuade Perl to read it instead of the
782 command line to find args.
788 my($line,$from,$to,@m);
789 my($autodir) = $self->catdir('$(INST_LIB)','auto');
790 my(@files) = @{$self->{PM_TO_BLIB}};
794 # Dummy target to match Unix target name; we use pm_to_blib.ts as
795 # timestamp file to avoid repeated invocations under VMS
796 pm_to_blib : pm_to_blib.ts
799 # As always, keep under DCL's 255-char limit
800 pm_to_blib.ts : $(TO_INST_PM)
801 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
804 $line = ''; # avoid uninitialized var warning
805 while ($from = shift(@files),$to = shift(@files)) {
806 $line .= " $from $to";
807 if (length($line) > 128) {
808 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
812 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
814 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
816 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
817 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
823 =item tool_autosplit (override)
825 Use VMS-style quoting on command line.
830 my($self, %attribs) = @_;
832 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
834 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
835 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
839 =item tool_sxubpp (override)
841 Use VMS-style quoting on xsubpp command line.
847 return '' unless $self->needs_linking;
848 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
849 # drop back to old location if xsubpp is not in new location yet
850 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
851 my(@tmdeps) = '$(XSUBPPDIR)typemap';
852 if( $self->{TYPEMAPS} ){
854 foreach $typemap (@{$self->{TYPEMAPS}}){
856 warn "Typemap $typemap not found.\n";
859 push(@tmdeps, $self->fixpath($typemap,0));
863 push(@tmdeps, "typemap") if -f "typemap";
864 my(@tmargs) = map("-typemap $_", @tmdeps);
865 if( exists $self->{XSOPT} ){
866 unshift( @tmargs, $self->{XSOPT} );
869 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
871 # What are the correct thresholds for version 1 && 2 Paul?
872 if ( $xsubpp_version > 1.923 ){
873 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
875 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
876 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
877 Your version of xsubpp is $xsubpp_version and cannot handle this.
878 Please upgrade to a more recent version of xsubpp.
881 $self->{XSPROTOARG} = "";
887 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
888 XSPROTOARG = $self->{XSPROTOARG}
894 =item xsubpp_version (override)
896 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
897 rather than Unix rules ($sts == 0 ==E<gt> good).
903 my($self,$xsubpp) = @_;
905 return '' unless $self->needs_linking;
907 # try to figure out the version number of the xsubpp on the system
909 # first try the -v flag, introduced in 1.921 & 2.000a2
911 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
912 print "Running: $command\n" if $Verbose;
913 $version = `$command` ;
916 warn "Running '$command' exits with status $?";
920 return $1 if $version =~ /^xsubpp version (.*)/ ;
922 # nope, then try something else
925 my ($file) = 'temp' ;
926 $counter++ while -e "$file$counter"; # don't overwrite anything
930 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
932 MODULE = fred PACKAGE = fred
941 $command = "$self->{PERL} $xsubpp $file";
942 print "Running: $command\n" if $Verbose;
943 my $text = `$command` ;
946 warn "Running '$command' exits with status $?";
950 # gets 1.2 -> 1.92 and 2.000a1
951 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
953 # it is either 1.0 or 1.1
954 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
956 # none of the above, so 1.0
960 =item tools_other (override)
962 Adds a few MM[SK] macros, and shortens some the installatin commands,
963 in order to stay under DCL's 255-character limit. Also changes
964 EQUALIZE_TIMESTAMP to set revision date of target file to one second
965 later than source file, since MMK interprets precisely equal revision
966 dates for a source and target file as a sign that the target needs
974 # Assumes \$(MMS) invokes MMS or MMK
975 # (It is assumed in some cases later that the default makefile name
976 # (Descrip.MMS for MM[SK]) is used.)
977 USEMAKEFILE = /Descrip=
980 MAKEFILE = Descrip.MMS
982 TOUCH = $self->{TOUCH}
983 CHMOD = $self->{CHMOD}
987 RM_RF = $self->{RM_RF}
988 SAY = Write Sys\$Output
989 UMASK_NULL = $self->{UMASK_NULL}
991 NOECHO = $self->{NOECHO}
992 MKPATH = Create/Directory
993 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
994 !. ($self->{PARENT} ? '' :
995 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
996 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
997 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]"
998 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1002 =item dist (override)
1004 Provide VMSish defaults for some values, then hand off to
1005 default MM_Unix method.
1010 my($self, %attribs) = @_;
1011 $attribs{VERSION} ||= $self->{VERSION_SYM};
1012 $attribs{NAME} ||= $self->{DISTNAME};
1013 $attribs{ZIPFLAGS} ||= '-Vu';
1014 $attribs{COMPRESS} ||= 'gzip';
1015 $attribs{SUFFIX} ||= '-gz';
1016 $attribs{SHAR} ||= 'vms_share';
1017 $attribs{DIST_DEFAULT} ||= 'zipdist';
1019 # Sanitize these for use in $(DISTVNAME) filespec
1020 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1021 $attribs{NAME} =~ s/[^\w\$]/_/g;
1023 return ExtUtils::MM_Unix::dist($self,%attribs);
1026 =item c_o (override)
1028 Use VMS syntax on command line. In particular, $(DEFINE) and
1029 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1035 return '' unless $self->needs_linking();
1038 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1041 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1044 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1049 =item xs_c (override)
1057 return '' unless $self->needs_linking();
1060 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1064 =item xs_o (override)
1066 Use MM[SK] macros, and VMS command line for C compiler.
1070 sub xs_o { # many makes are too dumb to use xs_c then c_o
1072 return '' unless $self->needs_linking();
1075 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1076 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1080 =item top_targets (override)
1082 Use VMS quoting on command line for Version_check.
1090 all :: pure_all manifypods
1093 pure_all :: config pm_to_blib subdirs linkext
1096 subdirs :: $(MYEXTLIB)
1099 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1102 config :: $(INST_ARCHAUTODIR).exists
1105 config :: $(INST_AUTODIR).exists
1110 config :: Version_check
1113 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
1116 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1117 if (%{$self->{MAN1PODS}}) {
1119 config :: $(INST_MAN1DIR).exists
1122 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1124 if (%{$self->{MAN3PODS}}) {
1126 config :: $(INST_MAN3DIR).exists
1129 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1133 $(O_FILES) : $(H_FILES)
1134 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1138 perldoc ExtUtils::MakeMaker
1143 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1144 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1150 =item dlsyms (override)
1152 Create VMS linker options files specifying universal symbols for this
1153 extension's shareable image, and listing other shareable images or
1154 libraries to which it should be linked.
1159 my($self,%attribs) = @_;
1161 return '' unless $self->needs_linking();
1163 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1164 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1165 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1168 unless ($self->{SKIPHASH}{'dynamic'}) {
1170 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1176 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1178 ') unless $self->{SKIPHASH}{'static'};
1181 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1182 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1184 $(BASEEXT).opt : Makefile.PL
1185 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1186 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1187 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1188 q[, 'FUNCLIST' => ],neatvalue($funclist),')"
1189 $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
1192 if (length $self->{LDLOADLIBS}) {
1193 my($lib); my($line) = '';
1194 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1195 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1196 if (length($line) + length($lib) > 160) {
1197 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1198 $line = $lib . '\n';
1200 else { $line .= $lib . '\n'; }
1202 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1209 =item dynamic_lib (override)
1211 Use VMS Link command.
1216 my($self, %attribs) = @_;
1217 return '' unless $self->needs_linking(); #might be because of a subdir
1219 return '' unless $self->has_link_code();
1221 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1222 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1223 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1227 OTHERLDFLAGS = $otherldflags
1228 INST_DYNAMIC_DEP = $inst_dynamic_dep
1232 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1233 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1234 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1235 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1238 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1242 =item dynamic_bs (override)
1244 Use VMS-style quoting on Mkbootstrap command line.
1249 my($self, %attribs) = @_;
1252 ' unless $self->has_link_code();
1254 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1256 # As MakeMaker mkbootstrap might not write a file (if none is required)
1257 # we use touch to prevent make continually trying to remake it.
1258 # The DynaLoader only reads a non-empty file.
1259 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1260 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1261 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1262 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1263 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1265 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1266 $(NOECHO) $(RM_RF) $(INST_BOOT)
1267 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1271 =item static_lib (override)
1273 Use VMS commands to manipulate object library.
1279 return '' unless $self->needs_linking();
1284 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1288 # Rely on suffix rule for update action
1289 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1291 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1293 # If this extension has it's own library (eg SDBM_File)
1294 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1295 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1297 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1299 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1300 # 'cause it's a library and you can't stick them in other libraries.
1301 # In that case, we use $OBJECT instead and hope for the best
1302 if ($self->{MYEXTLIB}) {
1303 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1305 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1308 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1309 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1310 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1312 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1317 =item manifypods (override)
1319 Use VMS-style quoting on command line, and VMS logical name
1320 to specify fallback location at build time if we can't find pod2man.
1326 my($self, %attribs) = @_;
1327 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1330 if (defined $self->{PERL_SRC}) {
1331 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1333 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1335 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1336 # No pod2man but some MAN3PODS to be installed
1339 Warning: I could not locate your pod2man program. As a last choice,
1340 I will look for the file to which the logical name POD2MAN
1341 points when MMK is invoked.
1344 $pod2man_exe = "pod2man";
1348 qq[POD2MAN_EXE = $pod2man_exe\n],
1349 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1350 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1352 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1353 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1355 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1356 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1357 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1359 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1360 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1361 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1367 =item processPL (override)
1369 Use VMS-style quoting on command line.
1375 return "" unless $self->{PL_FILES};
1377 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1378 my $list = ref($self->{PL_FILES}->{$plfile})
1379 ? $self->{PL_FILES}->{$plfile}
1380 : [$self->{PL_FILES}->{$plfile}];
1381 foreach $target (@$list) {
1382 my $vmsplfile = vmsify($plfile);
1383 my $vmsfile = vmsify($target);
1388 $vmsfile :: $vmsplfile
1389 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1396 =item installbin (override)
1398 Stay under DCL's 255 character command line limit once again by
1399 splitting potentially long list of files across multiple lines
1400 in C<realclean> target.
1406 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1407 return '' unless @{$self->{EXE_FILES}};
1408 my(@m, $from, $to, %fromto, @to, $line);
1409 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1410 for $from (@exefiles) {
1411 my($path) = '$(INST_SCRIPT)' . basename($from);
1412 local($_) = $path; # backward compatibility
1413 $to = $self->libscan($path);
1414 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1415 $fromto{$from} = vmsify($to);
1417 @to = values %fromto;
1419 EXE_FILES = @exefiles
1426 $line = ''; #avoid unitialized var warning
1428 if (length($line) + length($to) > 80) {
1429 push @m, "\t\$(RM_F) $line\n";
1432 else { $line .= " $to"; }
1434 push @m, "\t\$(RM_F) $line\n\n" if $line;
1436 while (($from,$to) = each %fromto) {
1437 last unless defined $from;
1439 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1440 else { ($todir = $to) =~ s/[^\)]+$//; }
1441 $todir = $self->fixpath($todir,1);
1443 $to : $from \$(MAKEFILE) ${todir}.exists
1446 ", $self->dir_target($todir);
1451 =item subdir_x (override)
1453 Use VMS commands to change default directory.
1458 my($self, $subdir) = @_;
1460 $subdir = $self->fixpath($subdir,1);
1464 olddef = F$Environment("Default")
1465 Set Default ',$subdir,'
1466 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1467 Set Default \'olddef\'
1472 =item clean (override)
1474 Split potentially long list of files across multiple commands (in
1475 order to stay under the magic command line limit). Also use MM[SK]
1476 commands for handling subdirectories.
1481 my($self, %attribs) = @_;
1484 # Delete temporary files but do not touch installed files. We don\'t delete
1485 # the Descrip.MMS here so that a later make realclean still has it to use.
1488 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1489 my($vmsdir) = $self->fixpath($dir,1);
1490 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1491 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1493 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1496 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1497 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1498 # a list or a macro that expands to a list.
1499 if ($attribs{FILES}) {
1500 my($word,$key,@filist);
1501 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1502 else { @filist = split /\s+/, $attribs{FILES}; }
1503 foreach $word (@filist) {
1504 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1505 push(@otherfiles, @{$self->{$key}});
1507 else { push(@otherfiles, $word); }
1510 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1511 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1513 $line = ''; #avoid unitialized var warning
1514 # Occasionally files are repeated several times from different sources
1515 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1517 foreach $file (@otherfiles) {
1518 $file = $self->fixpath($file);
1519 if (length($line) + length($file) > 80) {
1520 push @m, "\t\$(RM_RF) $line\n";
1523 else { $line .= " $file"; }
1525 push @m, "\t\$(RM_RF) $line\n" if $line;
1526 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1530 =item realclean (override)
1532 Guess what we're working around? Also, use MM[SK] for subdirectories.
1537 my($self, %attribs) = @_;
1540 # Delete temporary files (via clean) and also delete installed files
1543 foreach(@{$self->{DIR}}){
1544 my($vmsdir) = $self->fixpath($_,1);
1545 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1546 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1548 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1550 # We can't expand several of the MMS macros here, since they don't have
1551 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1552 # combination of macros). In order to stay below DCL's 255 char limit,
1553 # we put only 2 on a line.
1554 my($file,$line,$fcnt);
1555 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1556 if ($self->has_link_code) {
1557 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1559 push(@files, values %{$self->{PM}});
1560 $line = ''; #avoid unitialized var warning
1561 # Occasionally files are repeated several times from different sources
1562 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1563 foreach $file (@files) {
1564 $file = $self->fixpath($file);
1565 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1566 push @m, "\t\$(RM_F) $line\n";
1570 else { $line .= " $file"; }
1572 push @m, "\t\$(RM_F) $line\n" if $line;
1573 if ($attribs{FILES}) {
1574 my($word,$key,@filist,@allfiles);
1575 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1576 else { @filist = split /\s+/, $attribs{FILES}; }
1577 foreach $word (@filist) {
1578 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1579 push(@allfiles, @{$self->{$key}});
1581 else { push(@allfiles, $word); }
1584 # Occasionally files are repeated several times from different sources
1585 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1586 foreach $file (@allfiles) {
1587 $file = $self->fixpath($file);
1588 if (length($line) + length($file) > 80) {
1589 push @m, "\t\$(RM_RF) $line\n";
1592 else { $line .= " $file"; }
1594 push @m, "\t\$(RM_RF) $line\n" if $line;
1596 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1600 =item dist_basics (override)
1602 Use VMS-style quoting on command line.
1609 distclean :: realclean distcheck
1613 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1616 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1619 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1623 =item dist_core (override)
1625 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1626 so C<shdist> target actions are VMS-specific.
1633 dist : $(DIST_DEFAULT)
1634 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1636 zipdist : $(DISTVNAME).zip
1639 $(DISTVNAME).zip : distdir
1641 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1642 $(RM_RF) $(DISTVNAME)
1645 $(DISTVNAME).tar$(SUFFIX) : distdir
1648 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)]
1649 $(RM_RF) $(DISTVNAME)
1650 $(COMPRESS) $(DISTVNAME).tar
1655 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1656 $(RM_RF) $(DISTVNAME)
1661 =item dist_dir (override)
1663 Use VMS-style quoting on command line.
1671 $(RM_RF) $(DISTVNAME)
1672 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1673 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1677 =item dist_test (override)
1679 Use VMS commands to change default directory, and use VMS-style
1680 quoting on command line.
1688 startdir = F$Environment("Default")
1689 Set Default [.$(DISTVNAME)]
1690 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1691 $(MMS)$(MMSQUALIFIERS)
1692 $(MMS)$(MMSQUALIFIERS) test
1693 Set Default 'startdir'
1697 # --- Test and Installation Sections ---
1699 =item install (override)
1701 Work around DCL's 255 character limit several times,and use
1702 VMS-style command line quoting in a few cases.
1707 my($self, %attribs) = @_;
1710 if ($self->{EXE_FILES}) {
1711 my($line,$file) = ('','');
1712 foreach $file (@{$self->{EXE_FILES}}) {
1714 if (length($line) > 128) {
1715 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1719 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1723 install :: all pure_install doc_install
1726 install_perl :: all pure_perl_install doc_perl_install
1729 install_site :: all pure_site_install doc_site_install
1732 install_ :: install_site
1733 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1735 pure_install :: pure_$(INSTALLDIRS)_install
1738 doc_install :: doc_$(INSTALLDIRS)_install
1739 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1741 pure__install : pure_site_install
1742 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1744 doc__install : doc_site_install
1745 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1747 # This hack brought to you by DCL's 255-character command line limit
1748 pure_perl_install ::
1749 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1750 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1751 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1752 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1753 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1754 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1755 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1756 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1757 $(MOD_INSTALL) <.MM_tmp
1758 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1759 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1762 pure_site_install ::
1763 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1764 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1765 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1766 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1767 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1768 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1769 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1770 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1771 $(MOD_INSTALL) <.MM_tmp
1772 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1773 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1777 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1778 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1780 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1781 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1782 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1783 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1784 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1785 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1789 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1790 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1792 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1793 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1794 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1795 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1796 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1797 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1802 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1805 uninstall_from_perldirs ::
1806 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1807 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1808 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1809 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1811 uninstall_from_sitedirs ::
1812 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1813 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1814 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1815 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1821 =item perldepend (override)
1823 Use VMS-style syntax for files; it's cheaper to just do it directly here
1824 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1825 we have to rebuild Config.pm, use MM[SK] to do it.
1834 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1835 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1836 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1837 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1838 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1839 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1840 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1841 $(OBJECT) : $(PERL_INC)iperlsys.h
1843 ' if $self->{OBJECT};
1845 if ($self->{PERL_SRC}) {
1847 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1848 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1849 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1850 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1851 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1852 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1853 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1855 # Check for unpropagated config.sh changes. Should never happen.
1856 # We do NOT just update config.h because that is not sufficient.
1857 # An out of date config.h is not fatal but complains loudly!
1858 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1860 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1861 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1862 olddef = F$Environment("Default")
1863 Set Default $(PERL_SRC)
1864 $(MMS)],$mmsquals,);
1865 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1866 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1867 $target =~ s/\Q$prefix/[/;
1868 push(@m," $target");
1870 else { push(@m,' $(MMS$TARGET)'); }
1872 Set Default 'olddef'
1876 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1882 =item makefile (override)
1884 Use VMS commands and quoting.
1891 # We do not know what target was originally specified so we
1892 # must force a manual rerun to be sure. But as it should only
1893 # happen very rarely it is not a significant problem.
1895 $(OBJECT) : $(FIRST_MAKEFILE)
1896 ] if $self->{OBJECT};
1899 # We take a very conservative approach here, but it\'s worth it.
1900 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1901 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1902 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1903 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1904 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1905 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1906 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1907 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1908 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1914 =item test (override)
1916 Use VMS commands for handling subdirectories.
1921 my($self, %attribs) = @_;
1922 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1926 TEST_TYPE = test_\$(LINKTYPE)
1930 test :: \$(TEST_TYPE)
1933 testdb :: testdb_\$(LINKTYPE)
1937 foreach(@{$self->{DIR}}){
1938 my($vmsdir) = $self->fixpath($_,1);
1939 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1940 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1942 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1943 unless $tests or -f "test.pl" or @{$self->{DIR}};
1946 push(@m, "test_dynamic :: pure_all\n");
1947 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1948 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1949 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1952 push(@m, "testdb_dynamic :: pure_all\n");
1953 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1956 # Occasionally we may face this degenerate target:
1957 push @m, "test_ : test_dynamic\n\n";
1959 if ($self->needs_linking()) {
1960 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1961 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1962 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1964 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1965 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1969 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1970 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1976 =item test_via_harness (override)
1978 Use VMS-style quoting on command line.
1982 sub test_via_harness {
1983 my($self,$perl,$tests) = @_;
1984 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
1985 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
1988 =item test_via_script (override)
1990 Use VMS-style quoting on command line.
1994 sub test_via_script {
1995 my($self,$perl,$script) = @_;
1996 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2000 =item makeaperl (override)
2002 Undertake to build a new set of Perl images using VMS commands. Since
2003 VMS does dynamic loading, it's not necessary to statically link each
2004 extension into the Perl image, so this isn't the normal build path.
2005 Consequently, it hasn't really been tested, and may well be incomplete.
2010 my($self, %attribs) = @_;
2011 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2012 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2015 # --- MakeMaker makeaperl section ---
2016 MAP_TARGET = $target
2018 return join '', @m if $self->{PARENT};
2020 my($dir) = join ":", @{$self->{DIR}};
2022 unless ($self->{MAKEAPERL}) {
2024 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2025 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2026 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2027 Makefile.PL DIR=}, $dir, q{ \
2028 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2029 MAKEAPERL=1 NORECURS=1 };
2031 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2033 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2034 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2042 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2045 # The front matter of the linkcommand...
2046 $linkcmd = join ' ', $Config{'ld'},
2047 grep($_, @Config{qw(large split ldflags ccdlflags)});
2048 $linkcmd =~ s/\s+/ /g;
2050 # Which *.olb files could we make use of...
2052 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2054 File::Find::find(sub {
2055 return unless m/\Q$self->{LIB_EXT}\E$/;
2056 return if m/^libperl/;
2058 if( exists $self->{INCLUDE_EXT} ){
2063 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2067 # Throw away anything not explicitly marked for inclusion.
2068 # DynaLoader is implied.
2069 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2075 return unless $found;
2077 elsif( exists $self->{EXCLUDE_EXT} ){
2081 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2085 # Throw away anything explicitly marked for exclusion
2086 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2087 return if( $xx eq $excl );
2091 $olbs{$ENV{DEFAULT}} = $_;
2092 }, grep( -d $_, @{$searchdirs || []}));
2094 # We trust that what has been handed in as argument will be buildable
2095 $static = [] unless $static;
2096 @olbs{@{$static}} = (1) x @{$static};
2098 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2099 # Sort the object libraries in inverse order of
2100 # filespec length to try to insure that dependent extensions
2101 # will appear before their parents, so the linker will
2102 # search the parent library to resolve references.
2103 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2104 # references from [.intuit.dwim]dwim.obj can be found
2105 # in [.intuit]intuit.olb).
2106 for (sort { length($a) <=> length($b) } keys %olbs) {
2107 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2108 my($dir) = $self->fixpath($_,1);
2109 my($extralibs) = $dir . "extralibs.ld";
2110 my($extopt) = $dir . $olbs{$_};
2111 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2112 push @optlibs, "$dir$olbs{$_}";
2113 # Get external libraries this extension will need
2114 if (-f $extralibs ) {
2116 open LIST,$extralibs or warn $!,next;
2119 # Include a library in the link only once, unless it's mentioned
2120 # multiple times within a single extension's options file, in which
2121 # case we assume the builder needed to search it again later in the
2123 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2124 $libseen{$_}++; $seenthis{$_}++;
2130 # Get full name of extension for ExtUtils::Miniperl
2132 open OPT,$extopt or die $!;
2134 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2137 push @staticpkgs,$pkg;
2141 # Place all of the external libraries after all of the Perl extension
2142 # libraries in the final link, in order to maximize the opportunity
2143 # for XS code from multiple extensions to resolve symbols against the
2144 # same external library while only including that library once.
2145 push @optlibs, @$extra;
2147 $target = "Perl$Config{'exe_ext'}" unless $target;
2148 ($shrtarget,$targdir) = fileparse($target);
2149 $shrtarget =~ s/^([^.]*)/$1Shr/;
2150 $shrtarget = $targdir . $shrtarget;
2151 $target = "Perlshr.$Config{'dlext'}" unless $target;
2152 $tmp = "[]" unless $tmp;
2153 $tmp = $self->fixpath($tmp,1);
2154 if (@optlibs) { $extralist = join(' ',@optlibs); }
2155 else { $extralist = ''; }
2156 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2157 # that's what we're building here).
2158 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2160 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2161 print STDOUT "Warning: $libperl not found\n";
2166 if (defined $self->{PERL_SRC}) {
2167 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2168 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2170 print STDOUT "Warning: $libperl not found
2171 If you're going to build a static perl binary, make sure perl is installed
2172 otherwise ignore this warning\n";
2175 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2178 # Fill in the target you want to produce if it\'s not perl
2179 MAP_TARGET = ',$self->fixpath($target,0),'
2180 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2181 MAP_LINKCMD = $linkcmd
2182 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2183 MAP_EXTRA = $extralist
2184 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2188 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2189 foreach (@optlibs) {
2190 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2192 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2193 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2196 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2197 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2198 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2199 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2200 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2201 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2202 $(NOECHO) $(SAY) "To remove the intermediate files, say
2203 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2205 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2206 push @m, "# More from the 255-char line length limit\n";
2207 foreach (@staticpkgs) {
2208 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2211 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2212 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2215 # Still more from the 255-char line length limit
2217 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2218 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2219 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2220 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2221 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2222 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2226 inst_perl : pure_inst_perl doc_inst_perl
2229 pure_inst_perl : \$(MAP_TARGET)
2230 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2231 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2237 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2238 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2244 # --- Output postprocessing section ---
2246 =item nicetext (override)
2248 Insure that colons marking targets are preceded by space, in order
2249 to distinguish the target delimiter from a colon appearing as
2256 my($self,$text) = @_;
2257 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;