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@genetics.upenn.edu
8 package ExtUtils::MM_VMS;
9 $ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.39 (31-Jan-1997)';
10 unshift @MM::ISA, 'ExtUtils::MM_VMS';
18 Exporter::import('ExtUtils::MakeMaker', '$Verbose', '&neatvalue');
22 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
26 use ExtUtils::MM_VMS; # Done internally by ExtUtils::MakeMaker if needed
30 See ExtUtils::MM_Unix for a documentation of the methods provided
31 there. This package overrides the implementation of these methods, not
34 =head2 Methods always loaded
36 =item eliminate_macros
38 Expands MM[KS]/Make macros in a text string, using the contents of
39 identically named elements of C<%$self>, and returns the result
40 as a file specification in Unix syntax.
44 sub eliminate_macros {
47 print "eliminate_macros('') = ||\n" if $Verbose >= 3;
50 my($npath) = unixify($path);
52 my($head,$macro,$tail);
54 # perform m##g in scalar context so it acts as an iterator
55 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#g) {
57 ($head,$macro,$tail) = ($1,$2,$3);
58 if (ref $self->{$macro}) {
59 carp "Can't expand macro containing " . ref $self->{$macro};
60 $npath = "$head\cB$macro\cB$tail";
63 else { ($macro = unixify($self->{$macro})) =~ s#/$##; }
64 $npath = "$head$macro$tail";
67 if ($complex) { $npath =~ s#\cB(.*?)\cB#\$($1)#g; }
68 print "eliminate_macros($path) = |$npath|\n" if $Verbose >= 3;
74 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
75 in any directory specification, in order to avoid juxtaposing two
76 VMS-syntax directories when MM[SK] is run. Also expands expressions which
77 are all macro, so that we can tell how long the expansion is, and avoid
78 overrunning DCL's command buffer when MM[KS] is running.
80 If optional second argument has a TRUE value, then the return string is
81 a VMS-syntax directory specification, otherwise it is a VMS-syntax file
87 my($self,$path,$force_path) = @_;
89 print "eliminate_macros('') = ||\n" if $Verbose >= 3;
92 my($fixedpath,$prefix,$name);
94 if ($path =~ m#^\$\(.+\)$# || $path =~ m#[/:>\]]#) {
95 if ($force_path or $path =~ /(?:DIR\)|\])$/) {
96 $fixedpath = vmspath($self->eliminate_macros($path));
99 $fixedpath = vmsify($self->eliminate_macros($path));
102 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#)) && $self->{$prefix}) {
103 my($vmspre) = vmspath($self->eliminate_macros("\$($prefix)")) || ''; # is it a dir or just a name?
104 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
105 $fixedpath = vmspath($fixedpath) if $force_path;
109 $fixedpath = vmspath($fixedpath) if $force_path;
111 # Convert names without directory or type to paths
112 if (!$force_path and $fixedpath !~ /[:>(.\]]/) { $fixedpath = vmspath($fixedpath); }
113 # Trim off root dirname if it's had other dirs inserted in front of it.
114 $fixedpath =~ s/\.000000([\]>])/$1/;
115 print "fixpath($path) = |$fixedpath|\n" if $Verbose >= 3;
121 Concatenates a list of file specifications, and returns the result as a
122 VMS-syntax directory specification.
127 my($self,@dirs) = @_;
128 my($dir) = pop @dirs;
129 @dirs = grep($_,@dirs);
132 my($path) = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
133 my($spath,$sdir) = ($path,$dir);
134 $spath =~ s/.dir$//; $sdir =~ s/.dir$//;
135 $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+$/;
136 $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
139 if ($dir =~ /^\$\([^\)]+\)$/) { $rslt = $dir; }
140 else { $rslt = vmspath($dir); }
142 print "catdir(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
148 Concatenates a list of file specifications, and returns the result as a
149 VMS-syntax directory specification.
154 my($self,@files) = @_;
155 my($file) = pop @files;
156 @files = grep($_,@files);
159 my($path) = (@files == 1 ? $files[0] : $self->catdir(@files));
162 if ( $spath =~ /^[^\)\]\/:>]+\)$/ && basename($file) eq $file) { $rslt = "$spath$file"; }
164 $rslt = $self->eliminate_macros($spath);
165 $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
168 else { $rslt = vmsify($file); }
169 print "catfile(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
175 Converts a list into a string wrapped at approximately 80 columns.
181 my($line,$hlen) = ('',0);
185 # Perl bug -- seems to occasionally insert extra elements when
186 # traversing array (scalar(@array) doesn't show them, but
187 # foreach(@array) does) (5.00307)
188 next unless $word =~ /\w/;
189 $line .= ', ' if length($line);
190 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
192 $hlen += length($word) + 2;
197 =item curdir (override)
199 Returns a string representing of the current directory.
207 =item rootdir (override)
209 Returns a string representing of the root directory.
217 =item updir (override)
219 Returns a string representing of the parent directory.
227 package ExtUtils::MM_VMS;
229 sub ExtUtils::MM_VMS::ext;
230 sub ExtUtils::MM_VMS::guess_name;
231 sub ExtUtils::MM_VMS::find_perl;
232 sub ExtUtils::MM_VMS::path;
233 sub ExtUtils::MM_VMS::maybe_command;
234 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
235 sub ExtUtils::MM_VMS::perl_script;
236 sub ExtUtils::MM_VMS::file_name_is_absolute;
237 sub ExtUtils::MM_VMS::replace_manpage_separator;
238 sub ExtUtils::MM_VMS::init_others;
239 sub ExtUtils::MM_VMS::constants;
240 sub ExtUtils::MM_VMS::cflags;
241 sub ExtUtils::MM_VMS::const_cccmd;
242 sub ExtUtils::MM_VMS::pm_to_blib;
243 sub ExtUtils::MM_VMS::tool_autosplit;
244 sub ExtUtils::MM_VMS::tool_xsubpp;
245 sub ExtUtils::MM_VMS::xsubpp_version;
246 sub ExtUtils::MM_VMS::tools_other;
247 sub ExtUtils::MM_VMS::dist;
248 sub ExtUtils::MM_VMS::c_o;
249 sub ExtUtils::MM_VMS::xs_c;
250 sub ExtUtils::MM_VMS::xs_o;
251 sub ExtUtils::MM_VMS::top_targets;
252 sub ExtUtils::MM_VMS::dlsyms;
253 sub ExtUtils::MM_VMS::dynamic_lib;
254 sub ExtUtils::MM_VMS::dynamic_bs;
255 sub ExtUtils::MM_VMS::static_lib;
256 sub ExtUtils::MM_VMS::manifypods;
257 sub ExtUtils::MM_VMS::processPL;
258 sub ExtUtils::MM_VMS::installbin;
259 sub ExtUtils::MM_VMS::subdir_x;
260 sub ExtUtils::MM_VMS::clean;
261 sub ExtUtils::MM_VMS::realclean;
262 sub ExtUtils::MM_VMS::dist_basics;
263 sub ExtUtils::MM_VMS::dist_core;
264 sub ExtUtils::MM_VMS::dist_dir;
265 sub ExtUtils::MM_VMS::dist_test;
266 sub ExtUtils::MM_VMS::install;
267 sub ExtUtils::MM_VMS::perldepend;
268 sub ExtUtils::MM_VMS::makefile;
269 sub ExtUtils::MM_VMS::test;
270 sub ExtUtils::MM_VMS::test_via_harness;
271 sub ExtUtils::MM_VMS::test_via_script;
272 sub ExtUtils::MM_VMS::makeaperl;
273 sub ExtUtils::MM_VMS::ext;
274 sub ExtUtils::MM_VMS::nicetext;
279 if (defined fileno(DATA)) {
280 my $fh = select DATA;
281 my $o = $/; # For future reads from the file.
293 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
295 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
304 # This isn't really an override. It's just here because ExtUtils::MM_VMS
305 # appears in @MM::ISA before ExtUtils::Liblist, so if there isn't an ext()
306 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
307 # mimic inheritance here and hand off to ExtUtils::Liblist.
309 ExtUtils::Liblist::ext(@_);
313 =head2 SelfLoaded methods
315 Those methods which override default MM_Unix methods are marked
316 "(override)", while methods unique to MM_VMS are marked "(specific)".
317 For overridden methods, documentation is limited to an explanation
318 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
319 documentation for more details.
321 =item guess_name (override)
323 Try to determine name of extension being built. We begin with the name
324 of the current directory. Since VMS filenames are case-insensitive,
325 however, we look for a F<.pm> file whose name matches that of the current
326 directory (presumably the 'main' F<.pm> file for this extension), and try
327 to find a C<package> statement from which to obtain the Mixed::Case
334 my($defname,$defpm,@pm,%xs,$pm);
337 $defname = basename(fileify($ENV{'DEFAULT'}));
338 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
340 # Fallback in case for some reason a user has copied the files for an
341 # extension into a working directory whose name doesn't reflect the
342 # extension's name. We'll use the name of a unique .pm file, or the
343 # first .pm file with a matching .xs file.
344 if (not -e "${defpm}.pm") {
345 @pm = map { s/.pm$//; $_ } glob('*.pm');
346 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
348 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
349 if (%xs) { foreach $pm (@pm) { $defpm = $pm, last if exists $xs{$pm}; } }
352 if (open(PM,"${defpm}.pm")){
354 if (/^\s*package\s+([^;]+)/i) {
359 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
360 "defaulting package name to $defname\n"
365 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
366 "defaulting package name to $defname\n";
368 $defname =~ s#[\d.\-_]+$##;
372 =item find_perl (override)
374 Use VMS file specification syntax and CLI commands to find and
380 my($self, $ver, $names, $dirs, $trace) = @_;
381 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
383 # Check in relative directories first, so we pick up the current
384 # version of Perl if we're running MakeMaker as part of the main build.
385 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
386 my($absb) = $self->file_name_is_absolute($b);
387 if ($absa && $absb) { return $a cmp $b }
388 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
390 # Check miniperl before perl, and check names likely to contain
391 # version numbers before "generic" names, so we pick up an
392 # executable that's less likely to be from an old installation.
393 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
394 my($bb) = $b =~ m!([^:>\]/]+)$!;
395 my($ahasdir) = (length($a) - length($ba) > 0);
396 my($bhasdir) = (length($b) - length($bb) > 0);
397 if ($ahasdir and not $bhasdir) { return 1; }
398 elsif ($bhasdir and not $ahasdir) { return -1; }
399 else { $bb =~ /\d/ <=> $ba =~ /\d/
400 or substr($ba,0,1) cmp substr($bb,0,1)
401 or length($bb) <=> length($ba) } } @$names;
402 # Image names containing Perl version use '_' instead of '.' under VMS
403 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
405 print "Looking for perl $ver by these names:\n";
406 print "\t@snames,\n";
407 print "in these dirs:\n";
410 foreach $dir (@sdirs){
411 next unless defined $dir; # $self->{PERL_SRC} may be undefined
412 $inabs++ if $self->file_name_is_absolute($dir);
414 # We've covered relative dirs; everything else is an absolute
415 # dir (probably an installed location). First, we'll try potential
416 # command names, to see whether we can avoid a long MCR expression.
417 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
418 $inabs++; # Should happen above in next $dir, but just in case . . .
420 foreach $name (@snames){
421 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
422 else { push(@cand,$self->fixpath($name)); }
425 foreach $name (@cand) {
426 print "Checking $name\n" if ($trace >= 2);
427 # If it looks like a potential command, try it without the MCR
428 if ($name =~ /^[\w\-\$]+$/ &&
429 `$name -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
430 print "Using PERL=$name\n" if $trace;
433 next unless $vmsfile = $self->maybe_command($name);
434 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
435 print "Executing $vmsfile\n" if ($trace >= 2);
436 if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
437 print "Using PERL=MCR $vmsfile\n" if $trace;
438 return "MCR $vmsfile";
441 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
442 0; # false and not empty
445 =item path (override)
447 Translate logical name DCL$PATH as a searchlist, rather than trying
448 to C<split> string value of C<$ENV{'PATH'}>.
454 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
458 =item maybe_command (override)
460 Follows VMS naming conventions for executable files.
461 If the name passed in doesn't exactly match an executable file,
462 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
463 to check for DCL procedure. If this fails, checks directories in DCL$PATH
464 and finally F<Sys$System:> for an executable file having the name specified,
465 with or without the F<.Exe>-equivalent suffix.
470 my($self,$file) = @_;
471 return $file if -x $file && ! -d _;
473 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
475 if ($file !~ m![/:>\]]!) {
476 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
477 $dir = $ENV{"DCL\$PATH;$i"};
478 $dir .= ':' unless $dir =~ m%[\]:]$%;
481 push(@dirs,'Sys$System:');
482 foreach $dir (@dirs) {
483 my $sysfile = "$dir$file";
484 foreach $ext (@exts) {
485 return $file if -x "$sysfile$ext" && ! -d _;
492 =item maybe_command_in_dirs (override)
494 Uses DCL argument quoting on test command line.
498 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
499 my($self, $names, $dirs, $trace, $ver) = @_;
501 foreach $dir (@$dirs){
502 next unless defined $dir; # $self->{PERL_SRC} may be undefined
503 foreach $name (@$names){
505 if ($self->file_name_is_absolute($name)) {
508 $abs = $self->catfile($dir, $name);
510 print "Checking $abs for $name\n" if ($trace >= 2);
511 next unless $tryabs = $self->maybe_command($abs);
512 print "Substituting $tryabs instead of $abs\n"
513 if ($trace >= 2 and $tryabs ne $abs);
516 print "Executing $abs\n" if ($trace >= 2);
517 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
518 print "Using $abs\n" if $trace;
521 } else { # Do not look for perl
528 =item perl_script (override)
530 If name passed in doesn't specify a readable file, appends F<.com> or
531 F<.pl> and tries again, since it's customary to have file types on all files
537 my($self,$file) = @_;
538 return $file if -r $file && ! -d _;
539 return "$file.com" if -r "$file.com";
540 return "$file.pl" if -r "$file.pl";
544 =item file_name_is_absolute (override)
546 Checks for VMS directory spec as well as Unix separators.
550 sub file_name_is_absolute {
551 my($self,$file) = @_;
552 # If it's a logical name, expand it.
553 $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
554 $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
557 =item replace_manpage_separator
559 Use as separator a character which is legal in a VMS-syntax file name.
563 sub replace_manpage_separator {
565 $man = unixify($man);
570 =item init_others (override)
572 Provide VMS-specific forms of various utility commands, then hand
573 off to the default MM_Unix method.
580 $self->{NOOP} = 'Continue';
581 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
582 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
583 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
584 $self->{NOECHO} ||= '@ ';
585 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
586 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
587 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
588 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
589 $self->{CP} = 'Copy/NoConfirm';
590 $self->{MV} = 'Rename/NoConfirm';
591 $self->{UMASK_NULL} = '! ';
592 &ExtUtils::MM_Unix::init_others;
595 =item constants (override)
597 Fixes up numerous file and directory macros to insure VMS syntax
598 regardless of input syntax. Also adds a few VMS-specific macros
599 and makes lists of files comma-separated.
607 if ($self->{DEFINE} ne '') {
608 my(@defs) = split(/\s+/,$self->{DEFINE});
609 foreach $def (@defs) {
611 if ($def =~ s/^-D//) { # If it was a Unix-style definition
612 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
613 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
616 $def =~ s/"/""/g; # Protect existing " from DCL
617 $def = qq["$def"]; # and quote to prevent parsing of =
620 $self->{DEFINE} = join ',',@defs;
623 if ($self->{OBJECT} =~ /\s/) {
624 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
625 $self->{OBJECT} = join(' ',map($self->fixpath($_),split(/,?\s+/,$self->{OBJECT})));
627 $self->{LDFROM} = join(' ',map($self->fixpath($_),split(/,?\s+/,$self->{LDFROM})));
630 # Fix up directory specs
631 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
633 foreach $macro ( qw [
634 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
635 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
636 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
637 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
638 SITELIBEXP SITEARCHEXP ] ) {
639 next unless defined $self->{$macro};
640 $self->{$macro} = $self->fixpath($self->{$macro},1);
642 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
643 if ($self->{PERL_SRC});
648 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
649 next unless defined $self->{$macro};
650 $self->{$macro} = $self->fixpath($self->{$macro});
654 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
655 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
656 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
657 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
658 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
659 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
660 PERL_INC PERL FULLPERL
662 next unless defined $self->{$macro};
663 push @m, "$macro = $self->{$macro}\n";
668 VERSION_MACRO = VERSION
669 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
670 XS_VERSION_MACRO = XS_VERSION
671 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
673 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
674 MM_VERSION = $ExtUtils::MakeMaker::VERSION
675 MM_REVISION = $ExtUtils::MakeMaker::Revision
676 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
678 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
679 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
680 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
681 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
685 FULLEXT VERSION_FROM OBJECT LDFROM
687 next unless defined $self->{$tmp};
688 push @m, "$tmp = ",$self->fixpath($self->{$tmp}),"\n";
692 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
694 next unless defined $self->{$tmp};
695 push @m, "$tmp = $self->{$tmp}\n";
698 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
699 next unless defined $self->{$tmp};
701 for $key (keys %{$self->{$tmp}}) {
702 $tmp{$self->fixpath($key)} = $self->fixpath($self->{$tmp}{$key});
704 $self->{$tmp} = \%tmp;
707 for $tmp (qw/ C O_FILES H /) {
708 next unless defined $self->{$tmp};
710 for $val (@{$self->{$tmp}}) {
711 push(@tmp,$self->fixpath($val));
713 $self->{$tmp} = \@tmp;
718 # Handy lists of source code files:
719 XS_FILES = ',$self->wraplist(', ', sort keys %{$self->{XS}}),'
720 C_FILES = ',$self->wraplist(', ', @{$self->{C}}),'
721 O_FILES = ',$self->wraplist(', ', @{$self->{O_FILES}} ),'
722 H_FILES = ',$self->wraplist(', ', @{$self->{H}}),'
723 MAN1PODS = ',$self->wraplist(', ', sort keys %{$self->{MAN1PODS}}),'
724 MAN3PODS = ',$self->wraplist(', ', sort keys %{$self->{MAN3PODS}}),'
729 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
731 next unless defined $self->{$tmp};
732 push @m, "$tmp = $self->{$tmp}\n";
737 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
739 # Here is the Config.pm that we are using/depend on
740 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
742 # Where to put things:
743 INST_LIBDIR = $self->{INST_LIBDIR}
744 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
746 INST_AUTODIR = $self->{INST_AUTODIR}
747 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
750 if ($self->has_link_code()) {
752 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
753 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(BASEEXT).$(DLEXT)
754 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
761 EXPORT_LIST = $(BASEEXT).opt
762 PERL_ARCHIVE = ',($ENV{'PERLSHR'} ? $ENV{'PERLSHR'} : "Sys\$Share:PerlShr.$Config{'dlext'}"),'
766 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
767 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
769 TO_INST_PM = ',$self->wraplist(', ',@{$self->{TO_INST_PM}}),'
771 PM_TO_BLIB = ',$self->wraplist(', ',@{$self->{PM_TO_BLIB}}),'
777 =item cflags (override)
779 Bypass shell script and produce qualifiers for CC directly (but warn
780 user if a shell script for this extension exists). Fold multiple
781 /Defines into one, since some C compilers pay attention to only one
782 instance of this qualifier on the command line.
787 my($self,$libperl) = @_;
788 my($quals) = $Config{'ccflags'};
790 my($optimize) = '/Optimize';
792 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
793 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
794 " required to modify CC command for $self->{'BASEEXT'}\n"
797 # Deal with $self->{DEFINE} here since some C compilers pay attention
798 # to only one /Define clause on command line, so we have to
799 # conflate the ones from $Config{'cc'} and $self->{DEFINE}
800 if ($quals =~ m:(.*)/define=\(?([^\(\/\)\s]+)\)?(.*)?:i) {
801 $quals = "$1/Define=($2," . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
802 "\$(DEFINE_VERSION),\$(XS_DEFINE_VERSION))$3";
805 $quals .= '/Define=(' . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
806 '$(DEFINE_VERSION),$(XS_DEFINE_VERSION))';
809 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
810 if ($libperl =~ /libperl(\w+)\./i) {
812 my(%map) = ( 'D' => 'DEBUGGING', 'E' => 'EMBED', 'M' => 'MULTIPLICITY',
813 'DE' => 'DEBUGGING,EMBED', 'DM' => 'DEBUGGING,MULTIPLICITY',
814 'EM' => 'EMBED,MULTIPLICITY', 'DEM' => 'DEBUGGING,EMBED,MULTIPLICITY' );
815 $quals =~ s:/define=\(([^\)]+)\):/Define=($1,$map{$type}):i
818 # Likewise with $self->{INC} and /Include
819 my($incstr) = '/Include=($(PERL_INC)';
820 if ($self->{'INC'}) {
821 my(@includes) = split(/\s+/,$self->{INC});
822 foreach (@includes) {
824 $incstr .= ', '.$self->fixpath($_,1);
827 $quals .= "$incstr)";
829 $optimize = '/Debug/NoOptimize'
830 if ($self->{OPTIMIZE} =~ /-g/ or $self->{OPTIMIZE} =~ m!/Debug!i);
832 return $self->{CFLAGS} = qq{
841 =item const_cccmd (override)
843 Adds directives to point C preprocessor to the right place when
844 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
845 command line a bit differently than MM_Unix method.
850 my($self,$libperl) = @_;
853 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
854 return '' unless $self->needs_linking();
855 if ($Config{'vms_cc_type'} eq 'gcc') {
858 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
860 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
863 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
864 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
869 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
870 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
871 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
874 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
876 $self->{CONST_CCCMD} = join('',@m);
879 =item pm_to_blib (override)
881 DCL I<still> accepts a maximum of 255 characters on a command
882 line, so we write the (potentially) long list of file names
883 to a temp file, then persuade Perl to read it instead of the
884 command line to find args.
890 my($line,$from,$to,@m);
891 my($autodir) = $self->catdir('$(INST_LIB)','auto');
892 my(@files) = @{$self->{PM_TO_BLIB}};
896 # Dummy target to match Unix target name; we use pm_to_blib.ts as
897 # timestamp file to avoid repeated invocations under VMS
898 pm_to_blib : pm_to_blib.ts
901 # As always, keep under DCL's 255-char limit
902 pm_to_blib.ts : $(TO_INST_PM)
903 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
906 $line = ''; # avoid uninitialized var warning
907 while ($from = shift(@files),$to = shift(@files)) {
908 $line .= " $from $to";
909 if (length($line) > 128) {
910 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
914 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
916 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
918 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
919 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
925 =item tool_autosplit (override)
927 Use VMS-style quoting on command line.
932 my($self, %attribs) = @_;
934 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
936 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
937 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
941 =item tool_sxubpp (override)
943 Use VMS-style quoting on xsubpp command line.
949 return '' unless $self->needs_linking;
950 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
951 # drop back to old location if xsubpp is not in new location yet
952 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
953 my(@tmdeps) = '$(XSUBPPDIR)typemap';
954 if( $self->{TYPEMAPS} ){
956 foreach $typemap (@{$self->{TYPEMAPS}}){
958 warn "Typemap $typemap not found.\n";
961 push(@tmdeps, $self->fixpath($typemap));
965 push(@tmdeps, "typemap") if -f "typemap";
966 my(@tmargs) = map("-typemap $_", @tmdeps);
967 if( exists $self->{XSOPT} ){
968 unshift( @tmargs, $self->{XSOPT} );
971 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
973 # What are the correct thresholds for version 1 && 2 Paul?
974 if ( $xsubpp_version > 1.923 ){
975 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
977 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
978 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
979 Your version of xsubpp is $xsubpp_version and cannot handle this.
980 Please upgrade to a more recent version of xsubpp.
983 $self->{XSPROTOARG} = "";
989 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
990 XSPROTOARG = $self->{XSPROTOARG}
996 =item xsubpp_version (override)
998 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
999 rather than Unix rules ($sts == 0 ==E<gt> good).
1005 my($self,$xsubpp) = @_;
1007 return '' unless $self->needs_linking;
1009 # try to figure out the version number of the xsubpp on the system
1011 # first try the -v flag, introduced in 1.921 & 2.000a2
1013 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
1014 print "Running: $command\n" if $Verbose;
1015 $version = `$command` ;
1017 use vmsish 'status';
1018 warn "Running '$command' exits with status $?";
1022 return $1 if $version =~ /^xsubpp version (.*)/ ;
1024 # nope, then try something else
1026 my $counter = '000';
1027 my ($file) = 'temp' ;
1028 $counter++ while -e "$file$counter"; # don't overwrite anything
1032 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
1034 MODULE = fred PACKAGE = fred
1043 $command = "$self->{PERL} $xsubpp $file";
1044 print "Running: $command\n" if $Verbose;
1045 my $text = `$command` ;
1046 warn "Running '$command' exits with status " . $? unless ($? & 1);
1049 # gets 1.2 -> 1.92 and 2.000a1
1050 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
1052 # it is either 1.0 or 1.1
1053 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
1055 # none of the above, so 1.0
1059 =item tools_other (override)
1061 Adds a few MM[SK] macros, and shortens some the installatin commands,
1062 in order to stay under DCL's 255-character limit. Also changes
1063 EQUALIZE_TIMESTAMP to set revision date of target file to one second
1064 later than source file, since MMK interprets precisely equal revision
1065 dates for a source and target file as a sign that the target needs
1073 # Assumes \$(MMS) invokes MMS or MMK
1074 # (It is assumed in some cases later that the default makefile name
1075 # (Descrip.MMS for MM[SK]) is used.)
1076 USEMAKEFILE = /Descrip=
1077 USEMACROS = /Macro=(
1079 MAKEFILE = Descrip.MMS
1081 TOUCH = $self->{TOUCH}
1082 CHMOD = $self->{CHMOD}
1085 RM_F = $self->{RM_F}
1086 RM_RF = $self->{RM_RF}
1087 SAY = Write Sys\$Output
1088 UMASK_NULL = $self->{UMASK_NULL}
1089 NOOP = $self->{NOOP}
1090 NOECHO = $self->{NOECHO}
1091 MKPATH = Create/Directory
1092 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1093 !. ($self->{PARENT} ? '' :
1094 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1095 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1096 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]"
1097 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1101 =item dist (override)
1103 Provide VMSish defaults for some values, then hand off to
1104 default MM_Unix method.
1109 my($self, %attribs) = @_;
1110 $attribs{VERSION} ||= $self->{VERSION_SYM};
1111 $attribs{ZIPFLAGS} ||= '-Vu';
1112 $attribs{COMPRESS} ||= 'gzip';
1113 $attribs{SUFFIX} ||= '-gz';
1114 $attribs{SHAR} ||= 'vms_share';
1115 $attribs{DIST_DEFAULT} ||= 'zipdist';
1117 return ExtUtils::MM_Unix::dist($self,%attribs);
1120 =item c_o (override)
1122 Use VMS syntax on command line. In particular, $(DEFINE) and
1123 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1129 return '' unless $self->needs_linking();
1132 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1135 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1138 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1143 =item xs_c (override)
1151 return '' unless $self->needs_linking();
1154 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1158 =item xs_o (override)
1160 Use MM[SK] macros, and VMS command line for C compiler.
1164 sub xs_o { # many makes are too dumb to use xs_c then c_o
1166 return '' unless $self->needs_linking();
1169 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1170 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1174 =item top_targets (override)
1176 Use VMS quoting on command line for Version_check.
1184 all :: pure_all manifypods
1187 pure_all :: config pm_to_blib subdirs linkext
1190 subdirs :: $(MYEXTLIB)
1193 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1196 config :: $(INST_ARCHAUTODIR).exists
1199 config :: $(INST_AUTODIR).exists
1204 config :: Version_check
1207 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
1210 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1211 if (%{$self->{MAN1PODS}}) {
1213 config :: $(INST_MAN1DIR).exists
1216 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1218 if (%{$self->{MAN3PODS}}) {
1220 config :: $(INST_MAN3DIR).exists
1223 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1227 $(O_FILES) : $(H_FILES)
1228 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1232 perldoc ExtUtils::MakeMaker
1237 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1238 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1244 =item dlsyms (override)
1246 Create VMS linker options files specifying universal symbols for this
1247 extension's shareable image, and listing other shareable images or
1248 libraries to which it should be linked.
1253 my($self,%attribs) = @_;
1255 return '' unless $self->needs_linking();
1257 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1258 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1259 my($srcdir)= $attribs{PERL_SRC} || $self->{PERL_SRC} || '';
1262 unless ($self->{SKIPHASH}{'dynamic'}) {
1264 dynamic :: rtls.opt $(INST_ARCHAUTODIR)$(BASEEXT).opt
1268 my($popt) = $self->catfile($srcdir,'perlshr.opt');
1269 my($lopt) = $self->catfile($srcdir,'crtl.opt');
1270 push(@m,"# Depend on \$(BASEEXT).opt to insure we copy here *after* autogenerating (wrong) rtls.opt in Mksymlists
1271 rtls.opt : $popt $lopt \$(BASEEXT).opt
1272 Copy/Log $popt Sys\$Disk:[]rtls.opt
1273 Append/Log $lopt Sys\$Disk:[]rtls.opt
1278 # rtls.opt is built in the same step as $(BASEEXT).opt
1279 rtls.opt : $(BASEEXT).opt
1280 $(TOUCH) $(MMS$TARGET)
1286 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1288 ') unless $self->{SKIPHASH}{'static'};
1291 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1292 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1294 $(BASEEXT).opt : Makefile.PL
1295 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1296 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1297 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),')"
1298 $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
1301 if (length $self->{LDLOADLIBS}) {
1302 my($lib); my($line) = '';
1303 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1304 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1305 if (length($line) + length($lib) > 160) {
1306 push @m, "\t\$(PERL) -e \"print qq[$line]\" >>\$(MMS\$TARGET)\n";
1307 $line = $lib . '\n';
1309 else { $line .= $lib . '\n'; }
1311 push @m, "\t\$(PERL) -e \"print qq[$line]\" >>\$(MMS\$TARGET)\n" if $line;
1318 =item dynamic_lib (override)
1320 Use VMS Link command.
1325 my($self, %attribs) = @_;
1326 return '' unless $self->needs_linking(); #might be because of a subdir
1328 return '' unless $self->has_link_code();
1330 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1331 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1335 OTHERLDFLAGS = $otherldflags
1336 INST_DYNAMIC_DEP = $inst_dynamic_dep
1340 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt rtls.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1341 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1342 $(NOECHO) If F$TrnLNm("PerlShr").eqs."" Then Define/NoLog/User PerlShr Sys$Share:PerlShr.',$Config{'dlext'},'
1343 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,rtls.opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1346 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1350 =item dynamic_bs (override)
1352 Use VMS-style quoting on Mkbootstrap command line.
1357 my($self, %attribs) = @_;
1360 ' unless $self->has_link_code();
1362 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1364 # As MakeMaker mkbootstrap might not write a file (if none is required)
1365 # we use touch to prevent make continually trying to remake it.
1366 # The DynaLoader only reads a non-empty file.
1367 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1368 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1369 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1370 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1371 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1373 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1374 $(NOECHO) $(RM_RF) $(INST_BOOT)
1375 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1379 =item static_lib (override)
1381 Use VMS commands to manipulate object library.
1387 return '' unless $self->needs_linking();
1392 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1396 # Rely on suffix rule for update action
1397 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1399 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1401 # If this extension has it's own library (eg SDBM_File)
1402 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1403 push(@m, ' $(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1406 If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)
1407 Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)
1408 $(NOECHO) $(PERL) -e "open F,\'>>$(INST_ARCHAUTODIR)extralibs.ld\';print F qq[$(EXTRALIBS)\n];close F;"
1410 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1415 # sub installpm_x { # called by installpm perl file
1416 # my($self, $dist, $inst, $splitlib) = @_;
1417 # if ($inst =~ m!#!) {
1418 # warn "Warning: MM[SK] would have problems processing this file: $inst, SKIPPED\n";
1421 # $inst = $self->fixpath($inst);
1422 # $dist = $self->fixpath($dist);
1423 # my($instdir) = $inst =~ /([^\)]+\))[^\)]*$/ ? $1 : dirname($inst);
1427 # $inst : $dist \$(MAKEFILE) ${instdir}.exists \$(INST_ARCHAUTODIR).exists
1428 # ",' $(NOECHO) $(RM_F) $(MMS$TARGET)
1429 # $(NOECHO) $(CP) ',"$dist $inst",'
1430 # $(CHMOD) 644 $(MMS$TARGET)
1432 # push(@m, ' $(AUTOSPLITFILE) $(MMS$TARGET) ',
1433 # $self->catdir($splitlib,'auto')."\n\n")
1434 # if ($splitlib and $inst =~ /\.pm$/);
1435 # push(@m,$self->dir_target($instdir));
1440 =item manifypods (override)
1442 Use VMS-style quoting on command line, and VMS logical name
1443 to specify fallback location at build time if we can't find pod2man.
1449 my($self, %attribs) = @_;
1450 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1453 if (defined $self->{PERL_SRC}) {
1454 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1456 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1458 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1459 # No pod2man but some MAN3PODS to be installed
1462 Warning: I could not locate your pod2man program. As a last choice,
1463 I will look for the file to which the logical name POD2MAN
1464 points when MMK is invoked.
1467 $pod2man_exe = "pod2man";
1471 qq[POD2MAN_EXE = $pod2man_exe\n],
1472 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1473 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1475 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1476 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1478 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1479 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1480 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1482 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1483 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1484 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1490 =item processPL (override)
1492 Use VMS-style quoting on command line.
1498 return "" unless $self->{PL_FILES};
1500 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1501 my $vmsplfile = vmsify($plfile);
1502 my $vmsfile = vmsify($self->{PL_FILES}->{$plfile});
1507 $vmsfile :: $vmsplfile
1508 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile
1514 =item installbin (override)
1516 Stay under DCL's 255 character command line limit once again by
1517 splitting potentially long list of files across multiple lines
1518 in C<realclean> target.
1524 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1525 return '' unless @{$self->{EXE_FILES}};
1526 my(@m, $from, $to, %fromto, @to, $line);
1527 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1528 for $from (@exefiles) {
1529 my($path) = '$(INST_SCRIPT)' . basename($from);
1530 local($_) = $path; # backward compatibility
1531 $to = $self->libscan($path);
1532 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1533 $fromto{$from} = vmsify($to);
1535 @to = values %fromto;
1537 EXE_FILES = @exefiles
1544 $line = ''; #avoid unitialized var warning
1546 if (length($line) + length($to) > 80) {
1547 push @m, "\t\$(RM_F) $line\n";
1550 else { $line .= " $to"; }
1552 push @m, "\t\$(RM_F) $line\n\n" if $line;
1554 while (($from,$to) = each %fromto) {
1555 last unless defined $from;
1557 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1558 else { ($todir = $to) =~ s/[^\)]+$//; }
1559 $todir = $self->fixpath($todir,1);
1561 $to : $from \$(MAKEFILE) ${todir}.exists
1564 ", $self->dir_target($todir);
1569 =item subdir_x (override)
1571 Use VMS commands to change default directory.
1576 my($self, $subdir) = @_;
1578 $subdir = $self->fixpath($subdir,1);
1582 olddef = F$Environment("Default")
1583 Set Default ',$subdir,'
1584 - $(MMS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1585 Set Default \'olddef\'
1590 =item clean (override)
1592 Split potentially long list of files across multiple commands (in
1593 order to stay under the magic command line limit). Also use MM[SK]
1594 commands for handling subdirectories.
1599 my($self, %attribs) = @_;
1602 # Delete temporary files but do not touch installed files. We don\'t delete
1603 # the Descrip.MMS here so that a later make realclean still has it to use.
1606 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1607 my($vmsdir) = $self->fixpath($dir,1);
1608 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1609 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) clean`;"',"\n");
1611 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1614 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1615 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1616 # a list or a macro that expands to a list.
1617 if ($attribs{FILES}) {
1618 my($word,$key,@filist);
1619 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1620 else { @filist = split /\s+/, $attribs{FILES}; }
1621 foreach $word (@filist) {
1622 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1623 push(@otherfiles, @{$self->{$key}});
1625 else { push(@otherfiles, $attribs{FILES}); }
1628 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1629 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1631 $line = ''; #avoid unitialized var warning
1632 foreach $file (@otherfiles) {
1633 $file = $self->fixpath($file);
1634 if (length($line) + length($file) > 80) {
1635 push @m, "\t\$(RM_RF) $line\n";
1638 else { $line .= " $file"; }
1640 push @m, "\t\$(RM_RF) $line\n" if $line;
1641 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1645 =item realclean (override)
1647 Guess what we're working around? Also, use MM[SK] for subdirectories.
1652 my($self, %attribs) = @_;
1655 # Delete temporary files (via clean) and also delete installed files
1658 foreach(@{$self->{DIR}}){
1659 my($vmsdir) = $self->fixpath($_,1);
1660 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1661 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) realclean`;"',"\n");
1663 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1665 # We can't expand several of the MMS macros here, since they don't have
1666 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1667 # combination of macros). In order to stay below DCL's 255 char limit,
1668 # we put only 2 on a line.
1669 my($file,$line,$fcnt);
1670 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1671 if ($self->has_link_code) {
1672 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1674 push(@files, values %{$self->{PM}});
1675 $line = ''; #avoid unitialized var warning
1676 foreach $file (@files) {
1677 $file = $self->fixpath($file);
1678 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1679 push @m, "\t\$(RM_F) $line\n";
1683 else { $line .= " $file"; }
1685 push @m, "\t\$(RM_F) $line\n" if $line;
1686 if ($attribs{FILES}) {
1687 my($word,$key,@filist,@allfiles);
1688 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1689 else { @filist = split /\s+/, $attribs{FILES}; }
1690 foreach $word (@filist) {
1691 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1692 push(@allfiles, @{$self->{$key}});
1694 else { push(@allfiles, $attribs{FILES}); }
1697 foreach $file (@allfiles) {
1698 $file = $self->fixpath($file);
1699 if (length($line) + length($file) > 80) {
1700 push @m, "\t\$(RM_RF) $line\n";
1703 else { $line .= " $file"; }
1705 push @m, "\t\$(RM_RF) $line\n" if $line;
1707 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1711 =item dist_basics (override)
1713 Use VMS-style quoting on command line.
1720 distclean :: realclean distcheck
1724 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1727 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1730 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1734 =item dist_core (override)
1736 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1737 so C<shdist> target actions are VMS-specific.
1744 dist : $(DIST_DEFAULT)
1745 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)'"
1747 zipdist : $(DISTVNAME).zip
1750 $(DISTVNAME).zip : distdir
1752 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) $(SRC)
1753 $(RM_RF) $(DISTVNAME)
1756 $(DISTVNAME).tar$(SUFFIX) : distdir
1759 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar $(SRC)
1760 $(RM_RF) $(DISTVNAME)
1761 $(COMPRESS) $(DISTVNAME).tar
1766 $(SHARE) $(SRC) $(DISTVNAME).share
1767 $(RM_RF) $(DISTVNAME)
1772 =item dist_dir (override)
1774 Use VMS-style quoting on command line.
1782 $(RM_RF) $(DISTVNAME)
1783 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1784 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1788 =item dist_test (override)
1790 Use VMS commands to change default directory, and use VMS-style
1791 quoting on command line.
1799 startdir = F$Environment("Default")
1800 Set Default [.$(DISTVNAME)]
1801 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1804 Set Default 'startdir'
1808 # --- Test and Installation Sections ---
1810 =item install (override)
1812 Work around DCL's 255 character limit several times,and use
1813 VMS-style command line quoting in a few cases.
1818 my($self, %attribs) = @_;
1821 if ($self->{EXE_FILES}) {
1822 my($line,$file) = ('','');
1823 foreach $file (@{$self->{EXE_FILES}}) {
1825 if (length($line) > 128) {
1826 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1830 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1834 install :: all pure_install doc_install
1837 install_perl :: all pure_perl_install doc_perl_install
1840 install_site :: all pure_site_install doc_site_install
1843 install_ :: install_site
1844 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1846 pure_install :: pure_$(INSTALLDIRS)_install
1849 doc_install :: doc_$(INSTALLDIRS)_install
1850 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1852 pure__install : pure_site_install
1853 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1855 doc__install : doc_site_install
1856 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1858 # This hack brought to you by DCL's 255-character command line limit
1859 pure_perl_install ::
1860 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1861 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1862 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1863 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1864 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1865 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1866 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1867 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1868 $(MOD_INSTALL) <.MM_tmp
1869 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1870 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1873 pure_site_install ::
1874 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1875 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1876 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1877 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1878 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1879 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1880 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1881 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1882 $(MOD_INSTALL) <.MM_tmp
1883 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1884 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1888 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1889 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1890 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1892 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1893 $(NOECHO) $(PERL) -e "print q[print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1894 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1895 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1896 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1897 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1901 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1902 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1903 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1905 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1906 $(NOECHO) $(PERL) -e "print q[print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1907 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1908 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1909 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1910 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1915 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1918 uninstall_from_perldirs ::
1919 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1920 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1921 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1922 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1924 uninstall_from_sitedirs ::
1925 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1926 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1927 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1928 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1934 =item perldepend (override)
1936 Use VMS-style syntax for files; it's cheaper to just do it directly here
1937 than to have the MM_Unix method call C<catfile> repeatedly. Also use
1938 config.vms as source of original config data if the Perl distribution
1939 is available; config.sh is an ancillary file under VMS. Finally, if
1940 we have to rebuild Config.pm, use MM[SK] to do it.
1949 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1950 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1951 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1952 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1953 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1954 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1955 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1957 ' if $self->{OBJECT};
1959 if ($self->{PERL_SRC}) {
1961 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1962 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1963 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1964 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1965 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1966 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1967 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1969 # Check for unpropagated config.sh changes. Should never happen.
1970 # We do NOT just update config.h because that is not sufficient.
1971 # An out of date config.h is not fatal but complains loudly!
1972 #$(PERL_INC)config.h : $(PERL_SRC)config.sh
1973 $(PERL_INC)config.h : $(PERL_VMS)config.vms
1974 $(NOECHO) Write Sys$Error "Warning: $(PERL_INC)config.h out of date with $(PERL_VMS)config.vms"
1976 #$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1977 $(PERL_ARCHLIB)Config.pm : $(PERL_VMS)config.vms $(PERL_VMS)genconfig.pl
1978 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.vms or genconfig.pl"
1979 olddef = F$Environment("Default")
1980 Set Default $(PERL_SRC)
1981 $(MMS)],$mmsquals,);
1982 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1983 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm'));
1984 $target =~ s/\Q$prefix/[/;
1985 push(@m," $target");
1987 else { push(@m,' $(MMS$TARGET)'); }
1989 Set Default 'olddef'
1993 push(@m, join(" ", map($self->fixpath($_),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1999 =item makefile (override)
2001 Use VMS commands and quoting.
2008 # We do not know what target was originally specified so we
2009 # must force a manual rerun to be sure. But as it should only
2010 # happen very rarely it is not a significant problem.
2012 $(OBJECT) : $(FIRST_MAKEFILE)
2013 ] if $self->{OBJECT};
2016 # We take a very conservative approach here, but it\'s worth it.
2017 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
2018 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
2019 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
2020 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
2021 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
2022 - $(MMS) $(USEMAKEFILE)$(MAKEFILE)_old clean
2023 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
2024 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
2025 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
2031 =item test (override)
2033 Use VMS commands for handling subdirectories.
2038 my($self, %attribs) = @_;
2039 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
2043 TEST_TYPE = test_\$(LINKTYPE)
2047 test :: \$(TEST_TYPE)
2050 testdb :: testdb_\$(LINKTYPE)
2054 foreach(@{$self->{DIR}}){
2055 my($vmsdir) = $self->fixpath($_,1);
2056 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
2057 '; print `$(MMS) $(PASTHRU2) test`'."\n");
2059 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
2060 unless $tests or -f "test.pl" or @{$self->{DIR}};
2063 push(@m, "test_dynamic :: pure_all\n");
2064 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
2065 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
2066 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
2069 push(@m, "testdb_dynamic :: pure_all\n");
2070 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
2073 # Occasionally we may face this degenerate target:
2074 push @m, "test_ : test_dynamic\n\n";
2076 if ($self->needs_linking()) {
2077 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2078 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2079 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2081 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2082 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2086 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2087 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2093 =item test_via_harness (override)
2095 Use VMS-style quoting on command line.
2099 sub test_via_harness {
2100 my($self,$perl,$tests) = @_;
2101 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2102 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2105 =item test_via_script (override)
2107 Use VMS-style quoting on command line.
2111 sub test_via_script {
2112 my($self,$perl,$script) = @_;
2113 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2117 =item makeaperl (override)
2119 Undertake to build a new set of Perl images using VMS commands. Since
2120 VMS does dynamic loading, it's not necessary to statically link each
2121 extension into the Perl image, so this isn't the normal build path.
2122 Consequently, it hasn't really been tested, and may well be incomplete.
2127 my($self, %attribs) = @_;
2128 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2129 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2132 # --- MakeMaker makeaperl section ---
2133 MAP_TARGET = $target
2135 return join '', @m if $self->{PARENT};
2137 my($dir) = join ":", @{$self->{DIR}};
2139 unless ($self->{MAKEAPERL}) {
2141 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2142 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2143 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2144 Makefile.PL DIR=}, $dir, q{ \
2145 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2146 MAKEAPERL=1 NORECURS=1
2148 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2149 $(MMS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2151 push @m, map( " \\\n\t\t$_", @ARGV );
2158 my($linkcmd,@staticopts,@staticpkgs,$extralist,$targdir,$libperldir);
2160 # The front matter of the linkcommand...
2161 $linkcmd = join ' ', $Config{'ld'},
2162 grep($_, @Config{qw(large split ldflags ccdlflags)});
2163 $linkcmd =~ s/\s+/ /g;
2165 # Which *.olb files could we make use of...
2167 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2169 File::Find::find(sub {
2170 return unless m/\Q$self->{LIB_EXT}\E$/;
2171 return if m/^libperl/;
2173 if( exists $self->{INCLUDE_EXT} ){
2178 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2182 # Throw away anything not explicitly marked for inclusion.
2183 # DynaLoader is implied.
2184 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2190 return unless $found;
2192 elsif( exists $self->{EXCLUDE_EXT} ){
2196 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2200 # Throw away anything explicitly marked for exclusion
2201 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2202 return if( $xx eq $excl );
2206 $olbs{$ENV{DEFAULT}} = $_;
2207 }, grep( -d $_, @{$searchdirs || []}));
2209 # We trust that what has been handed in as argument will be buildable
2210 $static = [] unless $static;
2211 @olbs{@{$static}} = (1) x @{$static};
2213 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2214 # Sort the object libraries in inverse order of
2215 # filespec length to try to insure that dependent extensions
2216 # will appear before their parents, so the linker will
2217 # search the parent library to resolve references.
2218 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2219 # references from [.intuit.dwim]dwim.obj can be found
2220 # in [.intuit]intuit.olb).
2221 for (sort keys %olbs) {
2222 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2223 my($dir) = $self->fixpath($_,1);
2224 my($extralibs) = $dir . "extralibs.ld";
2225 my($extopt) = $dir . $olbs{$_};
2226 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2227 if (-f $extralibs ) {
2228 open LIST,$extralibs or warn $!,next;
2229 push @$extra, <LIST>;
2233 open OPT,$extopt or die $!;
2235 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2236 # ExtUtils::Miniperl expects Unix paths
2237 (my($pkg) = "$1_$1$self->{LIB_EXT}") =~ s#_*#/#g;
2238 push @staticpkgs,$pkg;
2240 push @staticopts, $extopt;
2244 $target = "Perl$Config{'exe_ext'}" unless $target;
2245 ($shrtarget,$targdir) = fileparse($target);
2246 $shrtarget =~ s/^([^.]*)/$1Shr/;
2247 $shrtarget = $targdir . $shrtarget;
2248 $target = "Perlshr.$Config{'dlext'}" unless $target;
2249 $tmp = "[]" unless $tmp;
2250 $tmp = $self->fixpath($tmp,1);
2252 $extralist = join(' ',@$extra);
2253 $extralist =~ s/[,\s\n]+/, /g;
2255 else { $extralist = ''; }
2257 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2258 print STDOUT "Warning: $libperl not found\n";
2263 if (defined $self->{PERL_SRC}) {
2264 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2265 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2267 print STDOUT "Warning: $libperl not found
2268 If you're going to build a static perl binary, make sure perl is installed
2269 otherwise ignore this warning\n";
2272 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2275 # Fill in the target you want to produce if it\'s not perl
2276 MAP_TARGET = ',$self->fixpath($target),'
2277 MAP_SHRTARGET = ',$self->fixpath($shrtarget),"
2278 MAP_LINKCMD = $linkcmd
2279 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '','
2280 # We use the linker options files created with each extension, rather than
2281 #specifying the object files directly on the command line.
2282 MAP_STATIC = ',@staticopts ? join(' ', @staticopts) : '','
2283 MAP_OPTS = ',@staticopts ? ','.join(',', map($_.'/Option', @staticopts)) : '',"
2284 MAP_EXTRA = $extralist
2285 MAP_LIBPERL = ",$self->fixpath($libperl),'
2290 $(MAP_SHRTARGET) : $(MAP_LIBPERL) $(MAP_STATIC) ',"${libperldir}Perlshr_Attr.Opt",'
2291 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_OPTS), $(MAP_EXTRA), $(MAP_LIBPERL) ',"${libperldir}Perlshr_Attr.Opt",'
2292 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2293 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2294 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2295 $(NOECHO) $(SAY) " $(MMS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2296 $(NOECHO) $(SAY) "To remove the intermediate files, say
2297 $(NOECHO) $(SAY) " $(MMS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2300 ',"${tmp}perlmain.c",' : $(MAKEFILE)
2301 $(NOECHO) $(PERL) $(MAP_PERLINC) -e "use ExtUtils::Miniperl; writemain(qw|',@staticpkgs,'|)" >$(MMS$TARGET)
2305 # More from the 255-char line length limit
2307 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2308 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2309 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2310 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2311 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2312 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2316 inst_perl : pure_inst_perl doc_inst_perl
2319 pure_inst_perl : \$(MAP_TARGET)
2320 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2321 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2327 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2328 \$(RM_F) ${tmp}PerlShr.Opt \$(MAP_TARGET)
2334 # --- Output postprocessing section ---
2336 =item nicetext (override)
2338 Insure that colons marking targets are preceded by space, in order
2339 to distinguish the target delimiter from a colon appearing as
2346 my($self,$text) = @_;
2347 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;