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;
18 our($Revision, @ISA, $VERSION);
19 # All on one line so MakeMaker can see it.
20 ($VERSION) = ($Revision = '5.56 (27-Apr-1999)') =~ /^([\d.]+)/;
22 @ISA = qw( File::Spec );
23 unshift @MM::ISA, 'ExtUtils::MM_VMS';
25 require ExtUtils::MakeMaker;
26 ExtUtils::MakeMaker->import('$Verbose', '&neatvalue');
30 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
34 use ExtUtils::MM_VMS; # Done internally by ExtUtils::MakeMaker if needed
38 See ExtUtils::MM_Unix for a documentation of the methods provided
39 there. This package overrides the implementation of these methods, not
42 =head2 Methods always loaded
48 Converts a list into a string wrapped at approximately 80 columns.
54 my($line,$hlen) = ('',0);
58 # Perl bug -- seems to occasionally insert extra elements when
59 # traversing array (scalar(@array) doesn't show them, but
60 # foreach(@array) does) (5.00307)
61 next unless $word =~ /\w/;
62 $line .= ' ' if length($line);
63 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
65 $hlen += length($word) + 2;
70 =item rootdir (override)
72 Returns a string representing of the root directory.
80 package ExtUtils::MM_VMS;
82 sub ExtUtils::MM_VMS::ext;
83 sub ExtUtils::MM_VMS::guess_name;
84 sub ExtUtils::MM_VMS::find_perl;
85 sub ExtUtils::MM_VMS::path;
86 sub ExtUtils::MM_VMS::maybe_command;
87 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
88 sub ExtUtils::MM_VMS::perl_script;
89 sub ExtUtils::MM_VMS::file_name_is_absolute;
90 sub ExtUtils::MM_VMS::replace_manpage_separator;
91 sub ExtUtils::MM_VMS::init_others;
92 sub ExtUtils::MM_VMS::constants;
93 sub ExtUtils::MM_VMS::cflags;
94 sub ExtUtils::MM_VMS::const_cccmd;
95 sub ExtUtils::MM_VMS::pm_to_blib;
96 sub ExtUtils::MM_VMS::tool_autosplit;
97 sub ExtUtils::MM_VMS::tool_xsubpp;
98 sub ExtUtils::MM_VMS::xsubpp_version;
99 sub ExtUtils::MM_VMS::tools_other;
100 sub ExtUtils::MM_VMS::dist;
101 sub ExtUtils::MM_VMS::c_o;
102 sub ExtUtils::MM_VMS::xs_c;
103 sub ExtUtils::MM_VMS::xs_o;
104 sub ExtUtils::MM_VMS::top_targets;
105 sub ExtUtils::MM_VMS::dlsyms;
106 sub ExtUtils::MM_VMS::dynamic_lib;
107 sub ExtUtils::MM_VMS::dynamic_bs;
108 sub ExtUtils::MM_VMS::static_lib;
109 sub ExtUtils::MM_VMS::manifypods;
110 sub ExtUtils::MM_VMS::processPL;
111 sub ExtUtils::MM_VMS::installbin;
112 sub ExtUtils::MM_VMS::subdir_x;
113 sub ExtUtils::MM_VMS::clean;
114 sub ExtUtils::MM_VMS::realclean;
115 sub ExtUtils::MM_VMS::dist_basics;
116 sub ExtUtils::MM_VMS::dist_core;
117 sub ExtUtils::MM_VMS::dist_dir;
118 sub ExtUtils::MM_VMS::dist_test;
119 sub ExtUtils::MM_VMS::install;
120 sub ExtUtils::MM_VMS::perldepend;
121 sub ExtUtils::MM_VMS::makefile;
122 sub ExtUtils::MM_VMS::test;
123 sub ExtUtils::MM_VMS::test_via_harness;
124 sub ExtUtils::MM_VMS::test_via_script;
125 sub ExtUtils::MM_VMS::makeaperl;
126 sub ExtUtils::MM_VMS::ext;
127 sub ExtUtils::MM_VMS::nicetext;
132 if (defined fileno(DATA)) {
133 my $fh = select DATA;
134 my $o = $/; # For future reads from the file.
146 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
148 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
157 # This isn't really an override. It's just here because ExtUtils::MM_VMS
158 # appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
159 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
160 # mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
162 require ExtUtils::Liblist;
163 ExtUtils::Liblist::Kid::ext(@_);
168 =head2 SelfLoaded methods
170 Those methods which override default MM_Unix methods are marked
171 "(override)", while methods unique to MM_VMS are marked "(specific)".
172 For overridden methods, documentation is limited to an explanation
173 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
174 documentation for more details.
178 =item guess_name (override)
180 Try to determine name of extension being built. We begin with the name
181 of the current directory. Since VMS filenames are case-insensitive,
182 however, we look for a F<.pm> file whose name matches that of the current
183 directory (presumably the 'main' F<.pm> file for this extension), and try
184 to find a C<package> statement from which to obtain the Mixed::Case
191 my($defname,$defpm,@pm,%xs,$pm);
194 $defname = basename(fileify($ENV{'DEFAULT'}));
195 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
197 # Fallback in case for some reason a user has copied the files for an
198 # extension into a working directory whose name doesn't reflect the
199 # extension's name. We'll use the name of a unique .pm file, or the
200 # first .pm file with a matching .xs file.
201 if (not -e "${defpm}.pm") {
202 @pm = map { s/.pm$//; $_ } glob('*.pm');
203 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
205 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
206 if (%xs) { foreach $pm (@pm) { $defpm = $pm, last if exists $xs{$pm}; } }
209 if (open(PM,"${defpm}.pm")){
211 if (/^\s*package\s+([^;]+)/i) {
216 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
217 "defaulting package name to $defname\n"
222 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
223 "defaulting package name to $defname\n";
225 $defname =~ s#[\d.\-_]+$##;
229 =item find_perl (override)
231 Use VMS file specification syntax and CLI commands to find and
237 my($self, $ver, $names, $dirs, $trace) = @_;
238 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
242 # Check in relative directories first, so we pick up the current
243 # version of Perl if we're running MakeMaker as part of the main build.
244 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
245 my($absb) = $self->file_name_is_absolute($b);
246 if ($absa && $absb) { return $a cmp $b }
247 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
249 # Check miniperl before perl, and check names likely to contain
250 # version numbers before "generic" names, so we pick up an
251 # executable that's less likely to be from an old installation.
252 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
253 my($bb) = $b =~ m!([^:>\]/]+)$!;
254 my($ahasdir) = (length($a) - length($ba) > 0);
255 my($bhasdir) = (length($b) - length($bb) > 0);
256 if ($ahasdir and not $bhasdir) { return 1; }
257 elsif ($bhasdir and not $ahasdir) { return -1; }
258 else { $bb =~ /\d/ <=> $ba =~ /\d/
259 or substr($ba,0,1) cmp substr($bb,0,1)
260 or length($bb) <=> length($ba) } } @$names;
261 # Image names containing Perl version use '_' instead of '.' under VMS
262 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
264 print "Looking for perl $ver by these names:\n";
265 print "\t@snames,\n";
266 print "in these dirs:\n";
269 foreach $dir (@sdirs){
270 next unless defined $dir; # $self->{PERL_SRC} may be undefined
271 $inabs++ if $self->file_name_is_absolute($dir);
273 # We've covered relative dirs; everything else is an absolute
274 # dir (probably an installed location). First, we'll try potential
275 # command names, to see whether we can avoid a long MCR expression.
276 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
277 $inabs++; # Should happen above in next $dir, but just in case . . .
279 foreach $name (@snames){
280 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
281 else { push(@cand,$self->fixpath($name,0)); }
284 foreach $name (@cand) {
285 print "Checking $name\n" if ($trace >= 2);
286 # If it looks like a potential command, try it without the MCR
287 if ($name =~ /^[\w\-\$]+$/) {
288 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
289 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
290 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
292 $rslt = `\@temp_mmvms.com` ;
293 unlink('temp_mmvms.com');
294 if ($rslt =~ /VER_OK/) {
295 print "Using PERL=$name\n" if $trace;
299 next unless $vmsfile = $self->maybe_command($name);
300 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
301 print "Executing $vmsfile\n" if ($trace >= 2);
302 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
303 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
304 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
306 $rslt = `\@temp_mmvms.com`;
307 unlink('temp_mmvms.com');
308 if ($rslt =~ /VER_OK/) {
309 print "Using PERL=MCR $vmsfile\n" if $trace;
310 return "MCR $vmsfile";
313 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
314 0; # false and not empty
317 =item path (override)
319 Translate logical name DCL$PATH as a searchlist, rather than trying
320 to C<split> string value of C<$ENV{'PATH'}>.
326 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
330 =item maybe_command (override)
332 Follows VMS naming conventions for executable files.
333 If the name passed in doesn't exactly match an executable file,
334 appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
335 to check for DCL procedure. If this fails, checks directories in DCL$PATH
336 and finally F<Sys$System:> for an executable file having the name specified,
337 with or without the F<.Exe>-equivalent suffix.
342 my($self,$file) = @_;
343 return $file if -x $file && ! -d _;
345 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
347 if ($file !~ m![/:>\]]!) {
348 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
349 $dir = $ENV{"DCL\$PATH;$i"};
350 $dir .= ':' unless $dir =~ m%[\]:]$%;
353 push(@dirs,'Sys$System:');
354 foreach $dir (@dirs) {
355 my $sysfile = "$dir$file";
356 foreach $ext (@exts) {
357 return $file if -x "$sysfile$ext" && ! -d _;
364 =item maybe_command_in_dirs (override)
366 Uses DCL argument quoting on test command line.
370 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
371 my($self, $names, $dirs, $trace, $ver) = @_;
373 foreach $dir (@$dirs){
374 next unless defined $dir; # $self->{PERL_SRC} may be undefined
375 foreach $name (@$names){
377 if ($self->file_name_is_absolute($name)) {
380 $abs = $self->catfile($dir, $name);
382 print "Checking $abs for $name\n" if ($trace >= 2);
383 next unless $tryabs = $self->maybe_command($abs);
384 print "Substituting $tryabs instead of $abs\n"
385 if ($trace >= 2 and $tryabs ne $abs);
388 print "Executing $abs\n" if ($trace >= 2);
389 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
390 print "Using $abs\n" if $trace;
393 } else { # Do not look for perl
400 =item perl_script (override)
402 If name passed in doesn't specify a readable file, appends F<.com> or
403 F<.pl> and tries again, since it's customary to have file types on all files
409 my($self,$file) = @_;
410 return $file if -r $file && ! -d _;
411 return "$file.com" if -r "$file.com";
412 return "$file.pl" if -r "$file.pl";
416 =item file_name_is_absolute (override)
418 Checks for VMS directory spec as well as Unix separators.
422 sub file_name_is_absolute {
423 my($self,$file) = @_;
424 # If it's a logical name, expand it.
425 $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
426 $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
429 =item replace_manpage_separator
431 Use as separator a character which is legal in a VMS-syntax file name.
435 sub replace_manpage_separator {
437 $man = unixify($man);
442 =item init_others (override)
444 Provide VMS-specific forms of various utility commands, then hand
445 off to the default MM_Unix method.
452 $self->{NOOP} = 'Continue';
453 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
454 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
455 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
456 $self->{NOECHO} ||= '@ ';
457 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
458 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
459 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
460 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
461 $self->{CP} = 'Copy/NoConfirm';
462 $self->{MV} = 'Rename/NoConfirm';
463 $self->{UMASK_NULL} = '! ';
464 &ExtUtils::MM_Unix::init_others;
467 =item constants (override)
469 Fixes up numerous file and directory macros to insure VMS syntax
470 regardless of input syntax. Also adds a few VMS-specific macros
471 and makes lists of files comma-separated.
479 # Be kind about case for pollution
480 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
482 if ($self->{DEFINE} ne '') {
483 my(@terms) = split(/\s+/,$self->{DEFINE});
485 foreach $def (@terms) {
488 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
489 if ($1 eq 'U') { $targ = \@udefs; }
490 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
491 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
494 $def =~ s/"/""/g; # Protect existing " from DCL
495 $def = qq["$def"]; # and quote to prevent parsing of =
499 $self->{DEFINE} = '';
500 if (@defs) { $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; }
501 if (@udefs) { $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; }
504 if ($self->{OBJECT} =~ /\s/) {
505 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
506 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
508 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
511 # Fix up directory specs
512 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
514 foreach $macro ( qw [
515 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
516 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
517 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
518 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
519 SITELIBEXP SITEARCHEXP ] ) {
520 next unless defined $self->{$macro};
521 $self->{$macro} = $self->fixpath($self->{$macro},1);
523 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
524 if ($self->{PERL_SRC});
529 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
530 next unless defined $self->{$macro};
531 $self->{$macro} = $self->fixpath($self->{$macro},0);
535 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
536 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
537 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
538 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
539 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
540 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
541 PERL_INC PERL FULLPERL
543 next unless defined $self->{$macro};
544 push @m, "$macro = $self->{$macro}\n";
549 VERSION_MACRO = VERSION
550 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
551 XS_VERSION_MACRO = XS_VERSION
552 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
554 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
555 MM_VERSION = $ExtUtils::MakeMaker::VERSION
556 MM_REVISION = $ExtUtils::MakeMaker::Revision
557 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
559 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
560 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
561 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
562 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
566 FULLEXT VERSION_FROM OBJECT LDFROM
568 next unless defined $self->{$tmp};
569 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
573 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
575 next unless defined $self->{$tmp};
576 push @m, "$tmp = $self->{$tmp}\n";
579 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
580 next unless defined $self->{$tmp};
582 for $key (keys %{$self->{$tmp}}) {
583 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
585 $self->{$tmp} = \%tmp;
588 for $tmp (qw/ C O_FILES H /) {
589 next unless defined $self->{$tmp};
591 for $val (@{$self->{$tmp}}) {
592 push(@tmp,$self->fixpath($val,0));
594 $self->{$tmp} = \@tmp;
599 # Handy lists of source code files:
600 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
601 C_FILES = ',$self->wraplist(@{$self->{C}}),'
602 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
603 H_FILES = ',$self->wraplist(@{$self->{H}}),'
604 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
605 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
610 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
612 next unless defined $self->{$tmp};
613 push @m, "$tmp = $self->{$tmp}\n";
618 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
620 # Here is the Config.pm that we are using/depend on
621 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
623 # Where to put things:
624 INST_LIBDIR = $self->{INST_LIBDIR}
625 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
627 INST_AUTODIR = $self->{INST_AUTODIR}
628 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
631 if ($self->has_link_code()) {
633 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
634 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
635 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
638 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
643 EXPORT_LIST = $(BASEEXT).opt
644 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
648 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
649 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
651 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
653 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
659 =item cflags (override)
661 Bypass shell script and produce qualifiers for CC directly (but warn
662 user if a shell script for this extension exists). Fold multiple
663 /Defines into one, since some C compilers pay attention to only one
664 instance of this qualifier on the command line.
669 my($self,$libperl) = @_;
670 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
671 my($definestr,$undefstr,$flagoptstr) = ('','','');
672 my($incstr) = '/Include=($(PERL_INC)';
675 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
676 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
677 " required to modify CC command for $self->{'BASEEXT'}\n"
680 if ($quals =~ / -[DIUOg]/) {
681 while ($quals =~ / -([Og])(\d*)\b/) {
682 my($type,$lvl) = ($1,$2);
683 $quals =~ s/ -$type$lvl\b\s*//;
684 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
685 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
687 while ($quals =~ / -([DIU])(\S+)/) {
688 my($type,$def) = ($1,$2);
689 $quals =~ s/ -$type$def\s*//;
691 if ($type eq 'D') { $definestr .= qq["$def",]; }
692 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
693 else { $undefstr .= qq["$def",]; }
696 if (length $quals and $quals !~ m!/!) {
697 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
700 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
701 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
702 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
703 # Deal with $self->{DEFINE} here since some C compilers pay attention
704 # to only one /Define clause on command line, so we have to
705 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
706 # ($self->{DEFINE} has already been VMSified in constants() above)
707 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
708 for $type (qw(Def Undef)) {
710 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
712 $term =~ s:^\((.+)\)$:$1:;
715 if ($type eq 'Def') {
716 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
719 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
720 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
724 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
726 # Likewise with $self->{INC} and /Include
727 if ($self->{'INC'}) {
728 my(@includes) = split(/\s+/,$self->{INC});
729 foreach (@includes) {
731 $incstr .= ','.$self->fixpath($_,1);
734 $quals .= "$incstr)";
735 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
736 $self->{CCFLAGS} = $quals;
738 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
739 if ($self->{OPTIMIZE} !~ m!/!) {
740 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
741 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
742 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
745 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
746 $self->{OPTIMIZE} = '/Optimize';
750 return $self->{CFLAGS} = qq{
751 CCFLAGS = $self->{CCFLAGS}
752 OPTIMIZE = $self->{OPTIMIZE}
753 PERLTYPE = $self->{PERLTYPE}
759 =item const_cccmd (override)
761 Adds directives to point C preprocessor to the right place when
762 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
763 command line a bit differently than MM_Unix method.
768 my($self,$libperl) = @_;
771 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
772 return '' unless $self->needs_linking();
773 if ($Config{'vms_cc_type'} eq 'gcc') {
776 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
778 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
781 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
782 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
787 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
788 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
789 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
792 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
794 $self->{CONST_CCCMD} = join('',@m);
797 =item pm_to_blib (override)
799 DCL I<still> accepts a maximum of 255 characters on a command
800 line, so we write the (potentially) long list of file names
801 to a temp file, then persuade Perl to read it instead of the
802 command line to find args.
808 my($line,$from,$to,@m);
809 my($autodir) = $self->catdir('$(INST_LIB)','auto');
810 my(@files) = @{$self->{PM_TO_BLIB}};
814 # Dummy target to match Unix target name; we use pm_to_blib.ts as
815 # timestamp file to avoid repeated invocations under VMS
816 pm_to_blib : pm_to_blib.ts
819 # As always, keep under DCL's 255-char limit
820 pm_to_blib.ts : $(TO_INST_PM)
821 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
824 $line = ''; # avoid uninitialized var warning
825 while ($from = shift(@files),$to = shift(@files)) {
826 $line .= " $from $to";
827 if (length($line) > 128) {
828 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
832 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
834 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
836 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
837 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
843 =item tool_autosplit (override)
845 Use VMS-style quoting on command line.
850 my($self, %attribs) = @_;
852 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
854 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
855 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
859 =item tool_sxubpp (override)
861 Use VMS-style quoting on xsubpp command line.
867 return '' unless $self->needs_linking;
868 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
869 # drop back to old location if xsubpp is not in new location yet
870 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
871 my(@tmdeps) = '$(XSUBPPDIR)typemap';
872 if( $self->{TYPEMAPS} ){
874 foreach $typemap (@{$self->{TYPEMAPS}}){
876 warn "Typemap $typemap not found.\n";
879 push(@tmdeps, $self->fixpath($typemap,0));
883 push(@tmdeps, "typemap") if -f "typemap";
884 my(@tmargs) = map("-typemap $_", @tmdeps);
885 if( exists $self->{XSOPT} ){
886 unshift( @tmargs, $self->{XSOPT} );
889 if ($Config{'ldflags'} &&
890 $Config{'ldflags'} =~ m!/Debug!i &&
891 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
892 unshift(@tmargs,'-nolinenumbers');
894 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
896 # What are the correct thresholds for version 1 && 2 Paul?
897 if ( $xsubpp_version > 1.923 ){
898 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
900 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
901 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
902 Your version of xsubpp is $xsubpp_version and cannot handle this.
903 Please upgrade to a more recent version of xsubpp.
906 $self->{XSPROTOARG} = "";
912 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
913 XSPROTOARG = $self->{XSPROTOARG}
919 =item xsubpp_version (override)
921 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
922 rather than Unix rules ($sts == 0 ==E<gt> good).
928 my($self,$xsubpp) = @_;
930 return '' unless $self->needs_linking;
932 # try to figure out the version number of the xsubpp on the system
934 # first try the -v flag, introduced in 1.921 & 2.000a2
936 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
937 print "Running: $command\n" if $Verbose;
938 $version = `$command` ;
941 warn "Running '$command' exits with status $?";
945 return $1 if $version =~ /^xsubpp version (.*)/ ;
947 # nope, then try something else
950 my ($file) = 'temp' ;
951 $counter++ while -e "$file$counter"; # don't overwrite anything
955 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
957 MODULE = fred PACKAGE = fred
966 $command = "$self->{PERL} $xsubpp $file";
967 print "Running: $command\n" if $Verbose;
968 my $text = `$command` ;
971 warn "Running '$command' exits with status $?";
975 # gets 1.2 -> 1.92 and 2.000a1
976 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
978 # it is either 1.0 or 1.1
979 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
981 # none of the above, so 1.0
985 =item tools_other (override)
987 Adds a few MM[SK] macros, and shortens some the installatin commands,
988 in order to stay under DCL's 255-character limit. Also changes
989 EQUALIZE_TIMESTAMP to set revision date of target file to one second
990 later than source file, since MMK interprets precisely equal revision
991 dates for a source and target file as a sign that the target needs
999 # Assumes \$(MMS) invokes MMS or MMK
1000 # (It is assumed in some cases later that the default makefile name
1001 # (Descrip.MMS for MM[SK]) is used.)
1002 USEMAKEFILE = /Descrip=
1003 USEMACROS = /Macro=(
1005 MAKEFILE = Descrip.MMS
1007 TOUCH = $self->{TOUCH}
1008 CHMOD = $self->{CHMOD}
1011 RM_F = $self->{RM_F}
1012 RM_RF = $self->{RM_RF}
1013 SAY = Write Sys\$Output
1014 UMASK_NULL = $self->{UMASK_NULL}
1015 NOOP = $self->{NOOP}
1016 NOECHO = $self->{NOECHO}
1017 MKPATH = Create/Directory
1018 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1019 !. ($self->{PARENT} ? '' :
1020 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1021 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1022 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]"
1023 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1027 =item dist (override)
1029 Provide VMSish defaults for some values, then hand off to
1030 default MM_Unix method.
1035 my($self, %attribs) = @_;
1036 $attribs{VERSION} ||= $self->{VERSION_SYM};
1037 $attribs{NAME} ||= $self->{DISTNAME};
1038 $attribs{ZIPFLAGS} ||= '-Vu';
1039 $attribs{COMPRESS} ||= 'gzip';
1040 $attribs{SUFFIX} ||= '-gz';
1041 $attribs{SHAR} ||= 'vms_share';
1042 $attribs{DIST_DEFAULT} ||= 'zipdist';
1044 # Sanitize these for use in $(DISTVNAME) filespec
1045 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1046 $attribs{NAME} =~ s/[^\w\$]/-/g;
1048 return ExtUtils::MM_Unix::dist($self,%attribs);
1051 =item c_o (override)
1053 Use VMS syntax on command line. In particular, $(DEFINE) and
1054 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1060 return '' unless $self->needs_linking();
1063 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1066 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1069 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1074 =item xs_c (override)
1082 return '' unless $self->needs_linking();
1085 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1089 =item xs_o (override)
1091 Use MM[SK] macros, and VMS command line for C compiler.
1095 sub xs_o { # many makes are too dumb to use xs_c then c_o
1097 return '' unless $self->needs_linking();
1100 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1101 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1105 =item top_targets (override)
1107 Use VMS quoting on command line for Version_check.
1115 all :: pure_all manifypods
1118 pure_all :: config pm_to_blib subdirs linkext
1121 subdirs :: $(MYEXTLIB)
1124 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1127 config :: $(INST_ARCHAUTODIR).exists
1130 config :: $(INST_AUTODIR).exists
1134 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1135 if (%{$self->{MAN1PODS}}) {
1137 config :: $(INST_MAN1DIR).exists
1140 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1142 if (%{$self->{MAN3PODS}}) {
1144 config :: $(INST_MAN3DIR).exists
1147 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1151 $(O_FILES) : $(H_FILES)
1152 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1156 perldoc ExtUtils::MakeMaker
1161 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1162 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1168 =item dlsyms (override)
1170 Create VMS linker options files specifying universal symbols for this
1171 extension's shareable image, and listing other shareable images or
1172 libraries to which it should be linked.
1177 my($self,%attribs) = @_;
1179 return '' unless $self->needs_linking();
1181 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1182 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1183 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1186 unless ($self->{SKIPHASH}{'dynamic'}) {
1188 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1194 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1196 ') unless $self->{SKIPHASH}{'static'};
1199 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1200 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1202 $(BASEEXT).opt : Makefile.PL
1203 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1204 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1205 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1206 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1208 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1209 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1210 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1211 push @m, ($Config{d_vms_case_sensitive_symbols}
1212 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1214 else { # We don't have a "main" object file, so pull 'em all in
1215 # Upcase module names if linker is being case-sensitive
1216 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1217 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1218 s[\$\(\w+_EXT\)][]; # even as a macro
1219 s/.*[:>\/\]]//; # Trim off dir spec
1220 $upcase ? uc($_) : $_;
1221 } split ' ', $self->eliminate_macros($self->{OBJECT});
1222 my($tmp,@lines,$elt) = '';
1223 $tmp = shift @omods;
1224 foreach $elt (@omods) {
1226 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1229 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1231 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1233 if (length $self->{LDLOADLIBS}) {
1234 my($lib); my($line) = '';
1235 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1236 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1237 if (length($line) + length($lib) > 160) {
1238 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1239 $line = $lib . '\n';
1241 else { $line .= $lib . '\n'; }
1243 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1250 =item dynamic_lib (override)
1252 Use VMS Link command.
1257 my($self, %attribs) = @_;
1258 return '' unless $self->needs_linking(); #might be because of a subdir
1260 return '' unless $self->has_link_code();
1262 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1263 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1264 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1268 OTHERLDFLAGS = $otherldflags
1269 INST_DYNAMIC_DEP = $inst_dynamic_dep
1273 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1274 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1275 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1276 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1279 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1283 =item dynamic_bs (override)
1285 Use VMS-style quoting on Mkbootstrap command line.
1290 my($self, %attribs) = @_;
1293 ' unless $self->has_link_code();
1295 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1297 # As MakeMaker mkbootstrap might not write a file (if none is required)
1298 # we use touch to prevent make continually trying to remake it.
1299 # The DynaLoader only reads a non-empty file.
1300 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1301 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1302 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1303 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1304 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1306 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1307 $(NOECHO) $(RM_RF) $(INST_BOOT)
1308 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1312 =item static_lib (override)
1314 Use VMS commands to manipulate object library.
1320 return '' unless $self->needs_linking();
1325 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1329 # Rely on suffix rule for update action
1330 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1332 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1334 # If this extension has it's own library (eg SDBM_File)
1335 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1336 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1338 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1340 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1341 # 'cause it's a library and you can't stick them in other libraries.
1342 # In that case, we use $OBJECT instead and hope for the best
1343 if ($self->{MYEXTLIB}) {
1344 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1346 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1349 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1350 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1351 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1353 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1358 =item manifypods (override)
1360 Use VMS-style quoting on command line, and VMS logical name
1361 to specify fallback location at build time if we can't find pod2man.
1367 my($self, %attribs) = @_;
1368 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1371 if (defined $self->{PERL_SRC}) {
1372 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1374 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1376 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1377 # No pod2man but some MAN3PODS to be installed
1380 Warning: I could not locate your pod2man program. As a last choice,
1381 I will look for the file to which the logical name POD2MAN
1382 points when MMK is invoked.
1385 $pod2man_exe = "pod2man";
1389 qq[POD2MAN_EXE = $pod2man_exe\n],
1390 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1391 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1393 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1394 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1396 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1397 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1398 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1400 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1401 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1402 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1408 =item processPL (override)
1410 Use VMS-style quoting on command line.
1416 return "" unless $self->{PL_FILES};
1418 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1419 my $list = ref($self->{PL_FILES}->{$plfile})
1420 ? $self->{PL_FILES}->{$plfile}
1421 : [$self->{PL_FILES}->{$plfile}];
1422 foreach $target (@$list) {
1423 my $vmsplfile = vmsify($plfile);
1424 my $vmsfile = vmsify($target);
1429 $vmsfile :: $vmsplfile
1430 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1437 =item installbin (override)
1439 Stay under DCL's 255 character command line limit once again by
1440 splitting potentially long list of files across multiple lines
1441 in C<realclean> target.
1447 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1448 return '' unless @{$self->{EXE_FILES}};
1449 my(@m, $from, $to, %fromto, @to, $line);
1450 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1451 for $from (@exefiles) {
1452 my($path) = '$(INST_SCRIPT)' . basename($from);
1453 local($_) = $path; # backward compatibility
1454 $to = $self->libscan($path);
1455 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1456 $fromto{$from} = vmsify($to);
1458 @to = values %fromto;
1460 EXE_FILES = @exefiles
1467 $line = ''; #avoid unitialized var warning
1469 if (length($line) + length($to) > 80) {
1470 push @m, "\t\$(RM_F) $line\n";
1473 else { $line .= " $to"; }
1475 push @m, "\t\$(RM_F) $line\n\n" if $line;
1477 while (($from,$to) = each %fromto) {
1478 last unless defined $from;
1480 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1481 else { ($todir = $to) =~ s/[^\)]+$//; }
1482 $todir = $self->fixpath($todir,1);
1484 $to : $from \$(MAKEFILE) ${todir}.exists
1487 ", $self->dir_target($todir);
1492 =item subdir_x (override)
1494 Use VMS commands to change default directory.
1499 my($self, $subdir) = @_;
1501 $subdir = $self->fixpath($subdir,1);
1505 olddef = F$Environment("Default")
1506 Set Default ',$subdir,'
1507 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1508 Set Default \'olddef\'
1513 =item clean (override)
1515 Split potentially long list of files across multiple commands (in
1516 order to stay under the magic command line limit). Also use MM[SK]
1517 commands for handling subdirectories.
1522 my($self, %attribs) = @_;
1525 # Delete temporary files but do not touch installed files. We don\'t delete
1526 # the Descrip.MMS here so that a later make realclean still has it to use.
1529 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1530 my($vmsdir) = $self->fixpath($dir,1);
1531 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1532 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1534 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1537 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1538 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1539 # a list or a macro that expands to a list.
1540 if ($attribs{FILES}) {
1541 my($word,$key,@filist);
1542 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1543 else { @filist = split /\s+/, $attribs{FILES}; }
1544 foreach $word (@filist) {
1545 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1546 push(@otherfiles, @{$self->{$key}});
1548 else { push(@otherfiles, $word); }
1551 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1552 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1554 $line = ''; #avoid unitialized var warning
1555 # Occasionally files are repeated several times from different sources
1556 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1558 foreach $file (@otherfiles) {
1559 $file = $self->fixpath($file);
1560 if (length($line) + length($file) > 80) {
1561 push @m, "\t\$(RM_RF) $line\n";
1564 else { $line .= " $file"; }
1566 push @m, "\t\$(RM_RF) $line\n" if $line;
1567 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1571 =item realclean (override)
1573 Guess what we're working around? Also, use MM[SK] for subdirectories.
1578 my($self, %attribs) = @_;
1581 # Delete temporary files (via clean) and also delete installed files
1584 foreach(@{$self->{DIR}}){
1585 my($vmsdir) = $self->fixpath($_,1);
1586 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1587 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1589 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1591 # We can't expand several of the MMS macros here, since they don't have
1592 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1593 # combination of macros). In order to stay below DCL's 255 char limit,
1594 # we put only 2 on a line.
1595 my($file,$line,$fcnt);
1596 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1597 if ($self->has_link_code) {
1598 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1600 push(@files, values %{$self->{PM}});
1601 $line = ''; #avoid unitialized var warning
1602 # Occasionally files are repeated several times from different sources
1603 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1604 foreach $file (@files) {
1605 $file = $self->fixpath($file);
1606 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1607 push @m, "\t\$(RM_F) $line\n";
1611 else { $line .= " $file"; }
1613 push @m, "\t\$(RM_F) $line\n" if $line;
1614 if ($attribs{FILES}) {
1615 my($word,$key,@filist,@allfiles);
1616 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1617 else { @filist = split /\s+/, $attribs{FILES}; }
1618 foreach $word (@filist) {
1619 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1620 push(@allfiles, @{$self->{$key}});
1622 else { push(@allfiles, $word); }
1625 # Occasionally files are repeated several times from different sources
1626 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1627 foreach $file (@allfiles) {
1628 $file = $self->fixpath($file);
1629 if (length($line) + length($file) > 80) {
1630 push @m, "\t\$(RM_RF) $line\n";
1633 else { $line .= " $file"; }
1635 push @m, "\t\$(RM_RF) $line\n" if $line;
1637 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1641 =item dist_basics (override)
1643 Use VMS-style quoting on command line.
1650 distclean :: realclean distcheck
1654 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1657 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1660 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1664 =item dist_core (override)
1666 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1667 so C<shdist> target actions are VMS-specific.
1674 dist : $(DIST_DEFAULT)
1675 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1677 zipdist : $(DISTVNAME).zip
1680 tardist : $(DISTVNAME).tar$(SUFFIX)
1683 $(DISTVNAME).zip : distdir
1685 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1686 $(RM_RF) $(DISTVNAME)
1689 $(DISTVNAME).tar$(SUFFIX) : distdir
1692 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1693 $(RM_RF) $(DISTVNAME)
1694 $(COMPRESS) $(DISTVNAME).tar
1699 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1700 $(RM_RF) $(DISTVNAME)
1705 =item dist_dir (override)
1707 Use VMS-style quoting on command line.
1715 $(RM_RF) $(DISTVNAME)
1716 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1717 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1721 =item dist_test (override)
1723 Use VMS commands to change default directory, and use VMS-style
1724 quoting on command line.
1732 startdir = F$Environment("Default")
1733 Set Default [.$(DISTVNAME)]
1734 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1735 $(MMS)$(MMSQUALIFIERS)
1736 $(MMS)$(MMSQUALIFIERS) test
1737 Set Default 'startdir'
1741 # --- Test and Installation Sections ---
1743 =item install (override)
1745 Work around DCL's 255 character limit several times,and use
1746 VMS-style command line quoting in a few cases.
1751 my($self, %attribs) = @_;
1754 if ($self->{EXE_FILES}) {
1755 my($line,$file) = ('','');
1756 foreach $file (@{$self->{EXE_FILES}}) {
1758 if (length($line) > 128) {
1759 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1763 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1767 install :: all pure_install doc_install
1770 install_perl :: all pure_perl_install doc_perl_install
1773 install_site :: all pure_site_install doc_site_install
1776 install_ :: install_site
1777 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1779 pure_install :: pure_$(INSTALLDIRS)_install
1782 doc_install :: doc_$(INSTALLDIRS)_install
1783 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1785 pure__install : pure_site_install
1786 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1788 doc__install : doc_site_install
1789 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1791 # This hack brought to you by DCL's 255-character command line limit
1792 pure_perl_install ::
1793 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1794 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1795 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1796 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1797 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1798 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1799 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1800 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1801 $(MOD_INSTALL) <.MM_tmp
1802 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1803 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1806 pure_site_install ::
1807 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1808 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1809 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1810 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1811 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1812 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1813 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1814 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1815 $(MOD_INSTALL) <.MM_tmp
1816 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1817 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1821 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1822 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1824 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1825 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1826 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1827 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1828 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1829 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1833 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1834 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1836 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1837 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1838 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1839 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1840 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1841 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1846 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1849 uninstall_from_perldirs ::
1850 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1851 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1852 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1853 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1855 uninstall_from_sitedirs ::
1856 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1857 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1858 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1859 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1865 =item perldepend (override)
1867 Use VMS-style syntax for files; it's cheaper to just do it directly here
1868 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1869 we have to rebuild Config.pm, use MM[SK] to do it.
1878 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1879 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1880 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1881 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1882 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1883 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1884 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1885 $(OBJECT) : $(PERL_INC)iperlsys.h
1887 ' if $self->{OBJECT};
1889 if ($self->{PERL_SRC}) {
1891 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1892 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1893 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1894 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1895 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1896 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1897 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1899 # Check for unpropagated config.sh changes. Should never happen.
1900 # We do NOT just update config.h because that is not sufficient.
1901 # An out of date config.h is not fatal but complains loudly!
1902 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1905 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1906 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1907 olddef = F$Environment("Default")
1908 Set Default $(PERL_SRC)
1909 $(MMS)],$mmsquals,);
1910 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1911 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1912 $target =~ s/\Q$prefix/[/;
1913 push(@m," $target");
1915 else { push(@m,' $(MMS$TARGET)'); }
1917 Set Default 'olddef'
1921 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1927 =item makefile (override)
1929 Use VMS commands and quoting.
1936 # We do not know what target was originally specified so we
1937 # must force a manual rerun to be sure. But as it should only
1938 # happen very rarely it is not a significant problem.
1940 $(OBJECT) : $(FIRST_MAKEFILE)
1941 ] if $self->{OBJECT};
1944 # We take a very conservative approach here, but it\'s worth it.
1945 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1946 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1947 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1948 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1949 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1950 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1951 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1952 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1953 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1959 =item test (override)
1961 Use VMS commands for handling subdirectories.
1966 my($self, %attribs) = @_;
1967 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1971 TEST_TYPE = test_\$(LINKTYPE)
1975 test :: \$(TEST_TYPE)
1978 testdb :: testdb_\$(LINKTYPE)
1982 foreach(@{$self->{DIR}}){
1983 my($vmsdir) = $self->fixpath($_,1);
1984 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1985 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1987 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1988 unless $tests or -f "test.pl" or @{$self->{DIR}};
1991 push(@m, "test_dynamic :: pure_all\n");
1992 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1993 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1994 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1997 push(@m, "testdb_dynamic :: pure_all\n");
1998 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
2001 # Occasionally we may face this degenerate target:
2002 push @m, "test_ : test_dynamic\n\n";
2004 if ($self->needs_linking()) {
2005 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2006 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2007 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2009 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2010 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2014 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2015 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2021 =item test_via_harness (override)
2023 Use VMS-style quoting on command line.
2027 sub test_via_harness {
2028 my($self,$perl,$tests) = @_;
2029 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2030 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2033 =item test_via_script (override)
2035 Use VMS-style quoting on command line.
2039 sub test_via_script {
2040 my($self,$perl,$script) = @_;
2041 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2045 =item makeaperl (override)
2047 Undertake to build a new set of Perl images using VMS commands. Since
2048 VMS does dynamic loading, it's not necessary to statically link each
2049 extension into the Perl image, so this isn't the normal build path.
2050 Consequently, it hasn't really been tested, and may well be incomplete.
2055 my($self, %attribs) = @_;
2056 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2057 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2060 # --- MakeMaker makeaperl section ---
2061 MAP_TARGET = $target
2063 return join '', @m if $self->{PARENT};
2065 my($dir) = join ":", @{$self->{DIR}};
2067 unless ($self->{MAKEAPERL}) {
2069 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2070 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2071 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2072 Makefile.PL DIR=}, $dir, q{ \
2073 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2074 MAKEAPERL=1 NORECURS=1 };
2076 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2078 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2079 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2087 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2090 # The front matter of the linkcommand...
2091 $linkcmd = join ' ', $Config{'ld'},
2092 grep($_, @Config{qw(large split ldflags ccdlflags)});
2093 $linkcmd =~ s/\s+/ /g;
2095 # Which *.olb files could we make use of...
2097 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2099 File::Find::find(sub {
2100 return unless m/\Q$self->{LIB_EXT}\E$/;
2101 return if m/^libperl/;
2103 if( exists $self->{INCLUDE_EXT} ){
2108 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2112 # Throw away anything not explicitly marked for inclusion.
2113 # DynaLoader is implied.
2114 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2120 return unless $found;
2122 elsif( exists $self->{EXCLUDE_EXT} ){
2126 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2130 # Throw away anything explicitly marked for exclusion
2131 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2132 return if( $xx eq $excl );
2136 $olbs{$ENV{DEFAULT}} = $_;
2137 }, grep( -d $_, @{$searchdirs || []}));
2139 # We trust that what has been handed in as argument will be buildable
2140 $static = [] unless $static;
2141 @olbs{@{$static}} = (1) x @{$static};
2143 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2144 # Sort the object libraries in inverse order of
2145 # filespec length to try to insure that dependent extensions
2146 # will appear before their parents, so the linker will
2147 # search the parent library to resolve references.
2148 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2149 # references from [.intuit.dwim]dwim.obj can be found
2150 # in [.intuit]intuit.olb).
2151 for (sort { length($a) <=> length($b) } keys %olbs) {
2152 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2153 my($dir) = $self->fixpath($_,1);
2154 my($extralibs) = $dir . "extralibs.ld";
2155 my($extopt) = $dir . $olbs{$_};
2156 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2157 push @optlibs, "$dir$olbs{$_}";
2158 # Get external libraries this extension will need
2159 if (-f $extralibs ) {
2161 open LIST,$extralibs or warn $!,next;
2164 # Include a library in the link only once, unless it's mentioned
2165 # multiple times within a single extension's options file, in which
2166 # case we assume the builder needed to search it again later in the
2168 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2169 $libseen{$_}++; $seenthis{$_}++;
2175 # Get full name of extension for ExtUtils::Miniperl
2177 open OPT,$extopt or die $!;
2179 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2182 push @staticpkgs,$pkg;
2186 # Place all of the external libraries after all of the Perl extension
2187 # libraries in the final link, in order to maximize the opportunity
2188 # for XS code from multiple extensions to resolve symbols against the
2189 # same external library while only including that library once.
2190 push @optlibs, @$extra;
2192 $target = "Perl$Config{'exe_ext'}" unless $target;
2193 ($shrtarget,$targdir) = fileparse($target);
2194 $shrtarget =~ s/^([^.]*)/$1Shr/;
2195 $shrtarget = $targdir . $shrtarget;
2196 $target = "Perlshr.$Config{'dlext'}" unless $target;
2197 $tmp = "[]" unless $tmp;
2198 $tmp = $self->fixpath($tmp,1);
2199 if (@optlibs) { $extralist = join(' ',@optlibs); }
2200 else { $extralist = ''; }
2201 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2202 # that's what we're building here).
2203 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2205 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2206 print STDOUT "Warning: $libperl not found\n";
2211 if (defined $self->{PERL_SRC}) {
2212 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2213 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2215 print STDOUT "Warning: $libperl not found
2216 If you're going to build a static perl binary, make sure perl is installed
2217 otherwise ignore this warning\n";
2220 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2223 # Fill in the target you want to produce if it\'s not perl
2224 MAP_TARGET = ',$self->fixpath($target,0),'
2225 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2226 MAP_LINKCMD = $linkcmd
2227 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2228 MAP_EXTRA = $extralist
2229 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2233 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2234 foreach (@optlibs) {
2235 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2237 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2238 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2241 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2242 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2243 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2244 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2245 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2246 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2247 $(NOECHO) $(SAY) "To remove the intermediate files, say
2248 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2250 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2251 push @m, "# More from the 255-char line length limit\n";
2252 foreach (@staticpkgs) {
2253 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2256 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2257 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2260 # Still more from the 255-char line length limit
2262 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2263 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2264 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2265 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2266 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2267 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2271 inst_perl : pure_inst_perl doc_inst_perl
2274 pure_inst_perl : \$(MAP_TARGET)
2275 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2276 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2282 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2283 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2289 # --- Output postprocessing section ---
2291 =item nicetext (override)
2293 Insure that colons marking targets are preceded by space, in order
2294 to distinguish the target delimiter from a colon appearing as
2301 my($self,$text) = @_;
2302 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;