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 if ($self->{DEFINE} ne '') {
460 my(@terms) = split(/\s+/,$self->{DEFINE});
462 foreach $def (@terms) {
465 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
466 if ($1 eq 'U') { $targ = \@udefs; }
467 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
468 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
471 $def =~ s/"/""/g; # Protect existing " from DCL
472 $def = qq["$def"]; # and quote to prevent parsing of =
476 $self->{DEFINE} = '';
477 if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; }
478 if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; }
481 if ($self->{OBJECT} =~ /\s/) {
482 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
483 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
485 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
488 # Fix up directory specs
489 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
491 foreach $macro ( qw [
492 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
493 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
494 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
495 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
496 SITELIBEXP SITEARCHEXP ] ) {
497 next unless defined $self->{$macro};
498 $self->{$macro} = $self->fixpath($self->{$macro},1);
500 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
501 if ($self->{PERL_SRC});
506 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
507 next unless defined $self->{$macro};
508 $self->{$macro} = $self->fixpath($self->{$macro},0);
512 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
513 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
514 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
515 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
516 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
517 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
518 PERL_INC PERL FULLPERL
520 next unless defined $self->{$macro};
521 push @m, "$macro = $self->{$macro}\n";
526 VERSION_MACRO = VERSION
527 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
528 XS_VERSION_MACRO = XS_VERSION
529 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
531 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
532 MM_VERSION = $ExtUtils::MakeMaker::VERSION
533 MM_REVISION = $ExtUtils::MakeMaker::Revision
534 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
536 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
537 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
538 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
539 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
543 FULLEXT VERSION_FROM OBJECT LDFROM
545 next unless defined $self->{$tmp};
546 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
550 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
552 next unless defined $self->{$tmp};
553 push @m, "$tmp = $self->{$tmp}\n";
556 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
557 next unless defined $self->{$tmp};
559 for $key (keys %{$self->{$tmp}}) {
560 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
562 $self->{$tmp} = \%tmp;
565 for $tmp (qw/ C O_FILES H /) {
566 next unless defined $self->{$tmp};
568 for $val (@{$self->{$tmp}}) {
569 push(@tmp,$self->fixpath($val,0));
571 $self->{$tmp} = \@tmp;
576 # Handy lists of source code files:
577 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
578 C_FILES = ',$self->wraplist(@{$self->{C}}),'
579 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
580 H_FILES = ',$self->wraplist(@{$self->{H}}),'
581 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
582 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
587 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
589 next unless defined $self->{$tmp};
590 push @m, "$tmp = $self->{$tmp}\n";
595 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
597 # Here is the Config.pm that we are using/depend on
598 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
600 # Where to put things:
601 INST_LIBDIR = $self->{INST_LIBDIR}
602 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
604 INST_AUTODIR = $self->{INST_AUTODIR}
605 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
608 if ($self->has_link_code()) {
610 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
611 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(BASEEXT).$(DLEXT)
612 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
615 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
620 EXPORT_LIST = $(BASEEXT).opt
621 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
625 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
626 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
628 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
630 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
636 =item cflags (override)
638 Bypass shell script and produce qualifiers for CC directly (but warn
639 user if a shell script for this extension exists). Fold multiple
640 /Defines into one, since some C compilers pay attention to only one
641 instance of this qualifier on the command line.
646 my($self,$libperl) = @_;
647 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
648 my($definestr,$undefstr,$flagoptstr) = ('','','');
649 my($incstr) = '/Include=($(PERL_INC)';
652 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
653 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
654 " required to modify CC command for $self->{'BASEEXT'}\n"
657 if ($quals =~ / -[DIUOg]/) {
658 while ($quals =~ / -([Og])(\d*)\b/) {
659 my($type,$lvl) = ($1,$2);
660 $quals =~ s/ -$type$lvl\b\s*//;
661 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
662 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
664 while ($quals =~ / -([DIU])(\S+)/) {
665 my($type,$def) = ($1,$2);
666 $quals =~ s/ -$type$def\s*//;
668 if ($type eq 'D') { $definestr .= qq["$def",]; }
669 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
670 else { $undefstr .= qq["$def",]; }
673 if (length $quals and $quals !~ m!/!) {
674 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
677 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
678 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
679 # Deal with $self->{DEFINE} here since some C compilers pay attention
680 # to only one /Define clause on command line, so we have to
681 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
682 # ($self->{DEFINE} has already been VMSified in constants() above)
683 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
684 for $type (qw(Def Undef)) {
686 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
688 $term =~ s:^\((.+)\)$:$1:;
691 if ($type eq 'Def') {
692 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
695 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
696 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
700 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
702 # Likewise with $self->{INC} and /Include
703 if ($self->{'INC'}) {
704 my(@includes) = split(/\s+/,$self->{INC});
705 foreach (@includes) {
707 $incstr .= ','.$self->fixpath($_,1);
710 $quals .= "$incstr)";
711 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
712 $self->{CCFLAGS} = $quals;
714 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
715 if ($self->{OPTIMIZE} !~ m!/!) {
716 if ($self->{OPTIMIZE} =~ m!\b-g\b!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
717 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
718 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
721 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
722 $self->{OPTIMIZE} = '/Optimize';
726 return $self->{CFLAGS} = qq{
727 CCFLAGS = $self->{CCFLAGS}
728 OPTIMIZE = $self->{OPTIMIZE}
729 PERLTYPE = $self->{PERLTYPE}
735 =item const_cccmd (override)
737 Adds directives to point C preprocessor to the right place when
738 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
739 command line a bit differently than MM_Unix method.
744 my($self,$libperl) = @_;
747 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
748 return '' unless $self->needs_linking();
749 if ($Config{'vms_cc_type'} eq 'gcc') {
752 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
754 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
757 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
758 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
763 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
764 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
765 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
768 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
770 $self->{CONST_CCCMD} = join('',@m);
773 =item pm_to_blib (override)
775 DCL I<still> accepts a maximum of 255 characters on a command
776 line, so we write the (potentially) long list of file names
777 to a temp file, then persuade Perl to read it instead of the
778 command line to find args.
784 my($line,$from,$to,@m);
785 my($autodir) = $self->catdir('$(INST_LIB)','auto');
786 my(@files) = @{$self->{PM_TO_BLIB}};
790 # Dummy target to match Unix target name; we use pm_to_blib.ts as
791 # timestamp file to avoid repeated invocations under VMS
792 pm_to_blib : pm_to_blib.ts
795 # As always, keep under DCL's 255-char limit
796 pm_to_blib.ts : $(TO_INST_PM)
797 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
800 $line = ''; # avoid uninitialized var warning
801 while ($from = shift(@files),$to = shift(@files)) {
802 $line .= " $from $to";
803 if (length($line) > 128) {
804 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
808 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
810 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
812 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
813 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
819 =item tool_autosplit (override)
821 Use VMS-style quoting on command line.
826 my($self, %attribs) = @_;
828 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
830 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
831 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
835 =item tool_sxubpp (override)
837 Use VMS-style quoting on xsubpp command line.
843 return '' unless $self->needs_linking;
844 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
845 # drop back to old location if xsubpp is not in new location yet
846 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
847 my(@tmdeps) = '$(XSUBPPDIR)typemap';
848 if( $self->{TYPEMAPS} ){
850 foreach $typemap (@{$self->{TYPEMAPS}}){
852 warn "Typemap $typemap not found.\n";
855 push(@tmdeps, $self->fixpath($typemap,0));
859 push(@tmdeps, "typemap") if -f "typemap";
860 my(@tmargs) = map("-typemap $_", @tmdeps);
861 if( exists $self->{XSOPT} ){
862 unshift( @tmargs, $self->{XSOPT} );
865 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
867 # What are the correct thresholds for version 1 && 2 Paul?
868 if ( $xsubpp_version > 1.923 ){
869 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
871 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
872 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
873 Your version of xsubpp is $xsubpp_version and cannot handle this.
874 Please upgrade to a more recent version of xsubpp.
877 $self->{XSPROTOARG} = "";
883 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
884 XSPROTOARG = $self->{XSPROTOARG}
890 =item xsubpp_version (override)
892 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
893 rather than Unix rules ($sts == 0 ==E<gt> good).
899 my($self,$xsubpp) = @_;
901 return '' unless $self->needs_linking;
903 # try to figure out the version number of the xsubpp on the system
905 # first try the -v flag, introduced in 1.921 & 2.000a2
907 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
908 print "Running: $command\n" if $Verbose;
909 $version = `$command` ;
912 warn "Running '$command' exits with status $?";
916 return $1 if $version =~ /^xsubpp version (.*)/ ;
918 # nope, then try something else
921 my ($file) = 'temp' ;
922 $counter++ while -e "$file$counter"; # don't overwrite anything
926 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
928 MODULE = fred PACKAGE = fred
937 $command = "$self->{PERL} $xsubpp $file";
938 print "Running: $command\n" if $Verbose;
939 my $text = `$command` ;
942 warn "Running '$command' exits with status $?";
946 # gets 1.2 -> 1.92 and 2.000a1
947 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
949 # it is either 1.0 or 1.1
950 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
952 # none of the above, so 1.0
956 =item tools_other (override)
958 Adds a few MM[SK] macros, and shortens some the installatin commands,
959 in order to stay under DCL's 255-character limit. Also changes
960 EQUALIZE_TIMESTAMP to set revision date of target file to one second
961 later than source file, since MMK interprets precisely equal revision
962 dates for a source and target file as a sign that the target needs
970 # Assumes \$(MMS) invokes MMS or MMK
971 # (It is assumed in some cases later that the default makefile name
972 # (Descrip.MMS for MM[SK]) is used.)
973 USEMAKEFILE = /Descrip=
976 MAKEFILE = Descrip.MMS
978 TOUCH = $self->{TOUCH}
979 CHMOD = $self->{CHMOD}
983 RM_RF = $self->{RM_RF}
984 SAY = Write Sys\$Output
985 UMASK_NULL = $self->{UMASK_NULL}
987 NOECHO = $self->{NOECHO}
988 MKPATH = Create/Directory
989 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
990 !. ($self->{PARENT} ? '' :
991 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
992 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
993 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]"
994 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
998 =item dist (override)
1000 Provide VMSish defaults for some values, then hand off to
1001 default MM_Unix method.
1006 my($self, %attribs) = @_;
1007 $attribs{VERSION} ||= $self->{VERSION_SYM};
1008 $attribs{NAME} ||= $self->{DISTNAME};
1009 $attribs{ZIPFLAGS} ||= '-Vu';
1010 $attribs{COMPRESS} ||= 'gzip';
1011 $attribs{SUFFIX} ||= '-gz';
1012 $attribs{SHAR} ||= 'vms_share';
1013 $attribs{DIST_DEFAULT} ||= 'zipdist';
1015 # Sanitize these for use in $(DISTVNAME) filespec
1016 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1017 $attribs{NAME} =~ s/[^\w\$]/_/g;
1019 return ExtUtils::MM_Unix::dist($self,%attribs);
1022 =item c_o (override)
1024 Use VMS syntax on command line. In particular, $(DEFINE) and
1025 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1031 return '' unless $self->needs_linking();
1034 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1037 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1040 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1045 =item xs_c (override)
1053 return '' unless $self->needs_linking();
1056 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1060 =item xs_o (override)
1062 Use MM[SK] macros, and VMS command line for C compiler.
1066 sub xs_o { # many makes are too dumb to use xs_c then c_o
1068 return '' unless $self->needs_linking();
1071 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1072 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1076 =item top_targets (override)
1078 Use VMS quoting on command line for Version_check.
1086 all :: pure_all manifypods
1089 pure_all :: config pm_to_blib subdirs linkext
1092 subdirs :: $(MYEXTLIB)
1095 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1098 config :: $(INST_ARCHAUTODIR).exists
1101 config :: $(INST_AUTODIR).exists
1106 config :: Version_check
1109 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
1112 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1113 if (%{$self->{MAN1PODS}}) {
1115 config :: $(INST_MAN1DIR).exists
1118 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1120 if (%{$self->{MAN3PODS}}) {
1122 config :: $(INST_MAN3DIR).exists
1125 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1129 $(O_FILES) : $(H_FILES)
1130 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1134 perldoc ExtUtils::MakeMaker
1139 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1140 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1146 =item dlsyms (override)
1148 Create VMS linker options files specifying universal symbols for this
1149 extension's shareable image, and listing other shareable images or
1150 libraries to which it should be linked.
1155 my($self,%attribs) = @_;
1157 return '' unless $self->needs_linking();
1159 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1160 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1161 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1164 unless ($self->{SKIPHASH}{'dynamic'}) {
1166 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1172 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1174 ') unless $self->{SKIPHASH}{'static'};
1177 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1178 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1180 $(BASEEXT).opt : Makefile.PL
1181 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1182 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1183 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1184 q[, 'FUNCLIST' => ],neatvalue($funclist),')"
1185 $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
1188 if (length $self->{LDLOADLIBS}) {
1189 my($lib); my($line) = '';
1190 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1191 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1192 if (length($line) + length($lib) > 160) {
1193 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1194 $line = $lib . '\n';
1196 else { $line .= $lib . '\n'; }
1198 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1205 =item dynamic_lib (override)
1207 Use VMS Link command.
1212 my($self, %attribs) = @_;
1213 return '' unless $self->needs_linking(); #might be because of a subdir
1215 return '' unless $self->has_link_code();
1217 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1218 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1219 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1223 OTHERLDFLAGS = $otherldflags
1224 INST_DYNAMIC_DEP = $inst_dynamic_dep
1228 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1229 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1230 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1231 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1234 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1238 =item dynamic_bs (override)
1240 Use VMS-style quoting on Mkbootstrap command line.
1245 my($self, %attribs) = @_;
1248 ' unless $self->has_link_code();
1250 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1252 # As MakeMaker mkbootstrap might not write a file (if none is required)
1253 # we use touch to prevent make continually trying to remake it.
1254 # The DynaLoader only reads a non-empty file.
1255 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1256 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1257 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1258 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1259 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1261 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1262 $(NOECHO) $(RM_RF) $(INST_BOOT)
1263 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1267 =item static_lib (override)
1269 Use VMS commands to manipulate object library.
1275 return '' unless $self->needs_linking();
1280 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1284 # Rely on suffix rule for update action
1285 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1287 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1289 # If this extension has it's own library (eg SDBM_File)
1290 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1291 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1293 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1295 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1296 # 'cause it's a library and you can't stick them in other libraries.
1297 # In that case, we use $OBJECT instead and hope for the best
1298 if ($self->{MYEXTLIB}) {
1299 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1301 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1304 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1305 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1306 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1308 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1313 =item manifypods (override)
1315 Use VMS-style quoting on command line, and VMS logical name
1316 to specify fallback location at build time if we can't find pod2man.
1322 my($self, %attribs) = @_;
1323 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1326 if (defined $self->{PERL_SRC}) {
1327 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1329 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1331 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1332 # No pod2man but some MAN3PODS to be installed
1335 Warning: I could not locate your pod2man program. As a last choice,
1336 I will look for the file to which the logical name POD2MAN
1337 points when MMK is invoked.
1340 $pod2man_exe = "pod2man";
1344 qq[POD2MAN_EXE = $pod2man_exe\n],
1345 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1346 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1348 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1349 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1351 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1352 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1353 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1355 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1356 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1357 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1363 =item processPL (override)
1365 Use VMS-style quoting on command line.
1371 return "" unless $self->{PL_FILES};
1373 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1374 my $list = ref($self->{PL_FILES}->{$plfile})
1375 ? $self->{PL_FILES}->{$plfile}
1376 : [$self->{PL_FILES}->{$plfile}];
1377 foreach $target (@$list) {
1378 my $vmsplfile = vmsify($plfile);
1379 my $vmsfile = vmsify($target);
1384 $vmsfile :: $vmsplfile
1385 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1392 =item installbin (override)
1394 Stay under DCL's 255 character command line limit once again by
1395 splitting potentially long list of files across multiple lines
1396 in C<realclean> target.
1402 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1403 return '' unless @{$self->{EXE_FILES}};
1404 my(@m, $from, $to, %fromto, @to, $line);
1405 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1406 for $from (@exefiles) {
1407 my($path) = '$(INST_SCRIPT)' . basename($from);
1408 local($_) = $path; # backward compatibility
1409 $to = $self->libscan($path);
1410 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1411 $fromto{$from} = vmsify($to);
1413 @to = values %fromto;
1415 EXE_FILES = @exefiles
1422 $line = ''; #avoid unitialized var warning
1424 if (length($line) + length($to) > 80) {
1425 push @m, "\t\$(RM_F) $line\n";
1428 else { $line .= " $to"; }
1430 push @m, "\t\$(RM_F) $line\n\n" if $line;
1432 while (($from,$to) = each %fromto) {
1433 last unless defined $from;
1435 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1436 else { ($todir = $to) =~ s/[^\)]+$//; }
1437 $todir = $self->fixpath($todir,1);
1439 $to : $from \$(MAKEFILE) ${todir}.exists
1442 ", $self->dir_target($todir);
1447 =item subdir_x (override)
1449 Use VMS commands to change default directory.
1454 my($self, $subdir) = @_;
1456 $subdir = $self->fixpath($subdir,1);
1460 olddef = F$Environment("Default")
1461 Set Default ',$subdir,'
1462 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1463 Set Default \'olddef\'
1468 =item clean (override)
1470 Split potentially long list of files across multiple commands (in
1471 order to stay under the magic command line limit). Also use MM[SK]
1472 commands for handling subdirectories.
1477 my($self, %attribs) = @_;
1480 # Delete temporary files but do not touch installed files. We don\'t delete
1481 # the Descrip.MMS here so that a later make realclean still has it to use.
1484 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1485 my($vmsdir) = $self->fixpath($dir,1);
1486 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1487 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1489 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1492 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1493 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1494 # a list or a macro that expands to a list.
1495 if ($attribs{FILES}) {
1496 my($word,$key,@filist);
1497 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1498 else { @filist = split /\s+/, $attribs{FILES}; }
1499 foreach $word (@filist) {
1500 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1501 push(@otherfiles, @{$self->{$key}});
1503 else { push(@otherfiles, $word); }
1506 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1507 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1509 $line = ''; #avoid unitialized var warning
1510 # Occasionally files are repeated several times from different sources
1511 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1513 foreach $file (@otherfiles) {
1514 $file = $self->fixpath($file);
1515 if (length($line) + length($file) > 80) {
1516 push @m, "\t\$(RM_RF) $line\n";
1519 else { $line .= " $file"; }
1521 push @m, "\t\$(RM_RF) $line\n" if $line;
1522 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1526 =item realclean (override)
1528 Guess what we're working around? Also, use MM[SK] for subdirectories.
1533 my($self, %attribs) = @_;
1536 # Delete temporary files (via clean) and also delete installed files
1539 foreach(@{$self->{DIR}}){
1540 my($vmsdir) = $self->fixpath($_,1);
1541 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1542 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1544 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1546 # We can't expand several of the MMS macros here, since they don't have
1547 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1548 # combination of macros). In order to stay below DCL's 255 char limit,
1549 # we put only 2 on a line.
1550 my($file,$line,$fcnt);
1551 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1552 if ($self->has_link_code) {
1553 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1555 push(@files, values %{$self->{PM}});
1556 $line = ''; #avoid unitialized var warning
1557 # Occasionally files are repeated several times from different sources
1558 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1559 foreach $file (@files) {
1560 $file = $self->fixpath($file);
1561 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1562 push @m, "\t\$(RM_F) $line\n";
1566 else { $line .= " $file"; }
1568 push @m, "\t\$(RM_F) $line\n" if $line;
1569 if ($attribs{FILES}) {
1570 my($word,$key,@filist,@allfiles);
1571 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1572 else { @filist = split /\s+/, $attribs{FILES}; }
1573 foreach $word (@filist) {
1574 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1575 push(@allfiles, @{$self->{$key}});
1577 else { push(@allfiles, $word); }
1580 # Occasionally files are repeated several times from different sources
1581 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1582 foreach $file (@allfiles) {
1583 $file = $self->fixpath($file);
1584 if (length($line) + length($file) > 80) {
1585 push @m, "\t\$(RM_RF) $line\n";
1588 else { $line .= " $file"; }
1590 push @m, "\t\$(RM_RF) $line\n" if $line;
1592 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1596 =item dist_basics (override)
1598 Use VMS-style quoting on command line.
1605 distclean :: realclean distcheck
1609 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1612 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1615 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1619 =item dist_core (override)
1621 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1622 so C<shdist> target actions are VMS-specific.
1629 dist : $(DIST_DEFAULT)
1630 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1632 zipdist : $(DISTVNAME).zip
1635 $(DISTVNAME).zip : distdir
1637 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1638 $(RM_RF) $(DISTVNAME)
1641 $(DISTVNAME).tar$(SUFFIX) : distdir
1644 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)]
1645 $(RM_RF) $(DISTVNAME)
1646 $(COMPRESS) $(DISTVNAME).tar
1651 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1652 $(RM_RF) $(DISTVNAME)
1657 =item dist_dir (override)
1659 Use VMS-style quoting on command line.
1667 $(RM_RF) $(DISTVNAME)
1668 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1669 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1673 =item dist_test (override)
1675 Use VMS commands to change default directory, and use VMS-style
1676 quoting on command line.
1684 startdir = F$Environment("Default")
1685 Set Default [.$(DISTVNAME)]
1686 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1687 $(MMS)$(MMSQUALIFIERS)
1688 $(MMS)$(MMSQUALIFIERS) test
1689 Set Default 'startdir'
1693 # --- Test and Installation Sections ---
1695 =item install (override)
1697 Work around DCL's 255 character limit several times,and use
1698 VMS-style command line quoting in a few cases.
1703 my($self, %attribs) = @_;
1706 if ($self->{EXE_FILES}) {
1707 my($line,$file) = ('','');
1708 foreach $file (@{$self->{EXE_FILES}}) {
1710 if (length($line) > 128) {
1711 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1715 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1719 install :: all pure_install doc_install
1722 install_perl :: all pure_perl_install doc_perl_install
1725 install_site :: all pure_site_install doc_site_install
1728 install_ :: install_site
1729 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1731 pure_install :: pure_$(INSTALLDIRS)_install
1734 doc_install :: doc_$(INSTALLDIRS)_install
1735 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1737 pure__install : pure_site_install
1738 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1740 doc__install : doc_site_install
1741 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1743 # This hack brought to you by DCL's 255-character command line limit
1744 pure_perl_install ::
1745 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1746 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1747 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1748 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1749 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1750 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1751 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1752 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1753 $(MOD_INSTALL) <.MM_tmp
1754 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1755 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1758 pure_site_install ::
1759 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1760 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1761 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1762 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1763 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1764 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1765 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1766 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1767 $(MOD_INSTALL) <.MM_tmp
1768 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1769 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1773 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1774 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1776 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1777 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1778 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1779 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1780 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1781 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1785 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1786 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1788 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1789 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1790 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1791 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1792 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1793 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1798 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1801 uninstall_from_perldirs ::
1802 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1803 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1804 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1805 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1807 uninstall_from_sitedirs ::
1808 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1809 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1810 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1811 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1817 =item perldepend (override)
1819 Use VMS-style syntax for files; it's cheaper to just do it directly here
1820 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1821 we have to rebuild Config.pm, use MM[SK] to do it.
1830 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1831 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1832 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1833 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1834 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1835 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1836 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1837 $(OBJECT) : $(PERL_INC)iperlsys.h
1839 ' if $self->{OBJECT};
1841 if ($self->{PERL_SRC}) {
1843 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1844 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1845 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1846 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1847 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1848 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1849 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1851 # Check for unpropagated config.sh changes. Should never happen.
1852 # We do NOT just update config.h because that is not sufficient.
1853 # An out of date config.h is not fatal but complains loudly!
1854 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1856 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1857 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1858 olddef = F$Environment("Default")
1859 Set Default $(PERL_SRC)
1860 $(MMS)],$mmsquals,);
1861 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1862 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1863 $target =~ s/\Q$prefix/[/;
1864 push(@m," $target");
1866 else { push(@m,' $(MMS$TARGET)'); }
1868 Set Default 'olddef'
1872 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1878 =item makefile (override)
1880 Use VMS commands and quoting.
1887 # We do not know what target was originally specified so we
1888 # must force a manual rerun to be sure. But as it should only
1889 # happen very rarely it is not a significant problem.
1891 $(OBJECT) : $(FIRST_MAKEFILE)
1892 ] if $self->{OBJECT};
1895 # We take a very conservative approach here, but it\'s worth it.
1896 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1897 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1898 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1899 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1900 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1901 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1902 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1903 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1904 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1910 =item test (override)
1912 Use VMS commands for handling subdirectories.
1917 my($self, %attribs) = @_;
1918 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1922 TEST_TYPE = test_\$(LINKTYPE)
1926 test :: \$(TEST_TYPE)
1929 testdb :: testdb_\$(LINKTYPE)
1933 foreach(@{$self->{DIR}}){
1934 my($vmsdir) = $self->fixpath($_,1);
1935 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1936 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1938 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1939 unless $tests or -f "test.pl" or @{$self->{DIR}};
1942 push(@m, "test_dynamic :: pure_all\n");
1943 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1944 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1945 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1948 push(@m, "testdb_dynamic :: pure_all\n");
1949 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1952 # Occasionally we may face this degenerate target:
1953 push @m, "test_ : test_dynamic\n\n";
1955 if ($self->needs_linking()) {
1956 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1957 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1958 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1960 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1961 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1965 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1966 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
1972 =item test_via_harness (override)
1974 Use VMS-style quoting on command line.
1978 sub test_via_harness {
1979 my($self,$perl,$tests) = @_;
1980 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
1981 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
1984 =item test_via_script (override)
1986 Use VMS-style quoting on command line.
1990 sub test_via_script {
1991 my($self,$perl,$script) = @_;
1992 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
1996 =item makeaperl (override)
1998 Undertake to build a new set of Perl images using VMS commands. Since
1999 VMS does dynamic loading, it's not necessary to statically link each
2000 extension into the Perl image, so this isn't the normal build path.
2001 Consequently, it hasn't really been tested, and may well be incomplete.
2006 my($self, %attribs) = @_;
2007 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2008 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2011 # --- MakeMaker makeaperl section ---
2012 MAP_TARGET = $target
2014 return join '', @m if $self->{PARENT};
2016 my($dir) = join ":", @{$self->{DIR}};
2018 unless ($self->{MAKEAPERL}) {
2020 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2021 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2022 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2023 Makefile.PL DIR=}, $dir, q{ \
2024 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2025 MAKEAPERL=1 NORECURS=1
2027 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2028 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2030 push @m, map( " \\\n\t\t$_", @ARGV );
2037 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2040 # The front matter of the linkcommand...
2041 $linkcmd = join ' ', $Config{'ld'},
2042 grep($_, @Config{qw(large split ldflags ccdlflags)});
2043 $linkcmd =~ s/\s+/ /g;
2045 # Which *.olb files could we make use of...
2047 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2049 File::Find::find(sub {
2050 return unless m/\Q$self->{LIB_EXT}\E$/;
2051 return if m/^libperl/;
2053 if( exists $self->{INCLUDE_EXT} ){
2058 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2062 # Throw away anything not explicitly marked for inclusion.
2063 # DynaLoader is implied.
2064 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2070 return unless $found;
2072 elsif( exists $self->{EXCLUDE_EXT} ){
2076 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2080 # Throw away anything explicitly marked for exclusion
2081 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2082 return if( $xx eq $excl );
2086 $olbs{$ENV{DEFAULT}} = $_;
2087 }, grep( -d $_, @{$searchdirs || []}));
2089 # We trust that what has been handed in as argument will be buildable
2090 $static = [] unless $static;
2091 @olbs{@{$static}} = (1) x @{$static};
2093 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2094 # Sort the object libraries in inverse order of
2095 # filespec length to try to insure that dependent extensions
2096 # will appear before their parents, so the linker will
2097 # search the parent library to resolve references.
2098 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2099 # references from [.intuit.dwim]dwim.obj can be found
2100 # in [.intuit]intuit.olb).
2101 for (sort { length($a) <=> length($b) } keys %olbs) {
2102 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2103 my($dir) = $self->fixpath($_,1);
2104 my($extralibs) = $dir . "extralibs.ld";
2105 my($extopt) = $dir . $olbs{$_};
2106 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2107 push @optlibs, "$dir$olbs{$_}";
2108 # Get external libraries this extension will need
2109 if (-f $extralibs ) {
2111 open LIST,$extralibs or warn $!,next;
2114 # Include a library in the link only once, unless it's mentioned
2115 # multiple times within a single extension's options file, in which
2116 # case we assume the builder needed to search it again later in the
2118 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2119 $libseen{$_}++; $seenthis{$_}++;
2125 # Get full name of extension for ExtUtils::Miniperl
2127 open OPT,$extopt or die $!;
2129 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2132 push @staticpkgs,$pkg;
2136 # Place all of the external libraries after all of the Perl extension
2137 # libraries in the final link, in order to maximize the opportunity
2138 # for XS code from multiple extensions to resolve symbols against the
2139 # same external library while only including that library once.
2140 push @optlibs, @$extra;
2142 $target = "Perl$Config{'exe_ext'}" unless $target;
2143 ($shrtarget,$targdir) = fileparse($target);
2144 $shrtarget =~ s/^([^.]*)/$1Shr/;
2145 $shrtarget = $targdir . $shrtarget;
2146 $target = "Perlshr.$Config{'dlext'}" unless $target;
2147 $tmp = "[]" unless $tmp;
2148 $tmp = $self->fixpath($tmp,1);
2149 if (@optlibs) { $extralist = join(' ',@optlibs); }
2150 else { $extralist = ''; }
2151 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2152 # that's what we're building here).
2153 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2155 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2156 print STDOUT "Warning: $libperl not found\n";
2161 if (defined $self->{PERL_SRC}) {
2162 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2163 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2165 print STDOUT "Warning: $libperl not found
2166 If you're going to build a static perl binary, make sure perl is installed
2167 otherwise ignore this warning\n";
2170 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2173 # Fill in the target you want to produce if it\'s not perl
2174 MAP_TARGET = ',$self->fixpath($target,0),'
2175 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2176 MAP_LINKCMD = $linkcmd
2177 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2178 MAP_EXTRA = $extralist
2179 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2183 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2184 foreach (@optlibs) {
2185 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2187 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2188 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2191 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2192 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2193 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2194 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2195 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2196 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2197 $(NOECHO) $(SAY) "To remove the intermediate files, say
2198 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2200 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2201 push @m, "# More from the 255-char line length limit\n";
2202 foreach (@staticpkgs) {
2203 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2206 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2207 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2210 # Still more from the 255-char line length limit
2212 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2213 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2214 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2215 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2216 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2217 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2221 inst_perl : pure_inst_perl doc_inst_perl
2224 pure_inst_perl : \$(MAP_TARGET)
2225 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2226 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2232 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2233 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2239 # --- Output postprocessing section ---
2241 =item nicetext (override)
2243 Insure that colons marking targets are preceded by space, in order
2244 to distinguish the target delimiter from a colon appearing as
2251 my($self,$text) = @_;
2252 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;