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, $Verbose);
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 PERLRUN PERLRUNINST TEST_LIBS
544 next unless defined $self->{$macro};
545 push @m, "$macro = $self->{$macro}\n";
550 VERSION_MACRO = VERSION
551 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
552 XS_VERSION_MACRO = XS_VERSION
553 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
555 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
556 MM_VERSION = $ExtUtils::MakeMaker::VERSION
557 MM_REVISION = $ExtUtils::MakeMaker::Revision
558 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
560 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
561 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
562 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
563 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
567 FULLEXT VERSION_FROM OBJECT LDFROM
569 next unless defined $self->{$tmp};
570 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
574 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
576 next unless defined $self->{$tmp};
577 push @m, "$tmp = $self->{$tmp}\n";
580 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
581 # Where is the space coming from? --jhi
582 next unless $self ne " " && defined $self->{$tmp};
584 for $key (keys %{$self->{$tmp}}) {
585 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
587 $self->{$tmp} = \%tmp;
590 for my $tmp (qw/ C O_FILES H /) {
591 next unless defined $self->{$tmp};
593 for $val (@{$self->{$tmp}}) {
594 push(@tmp,$self->fixpath($val,0));
596 $self->{$tmp} = \@tmp;
601 # Handy lists of source code files:
602 XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
603 C_FILES = ',$self->wraplist(@{$self->{C}}),'
604 O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
605 H_FILES = ',$self->wraplist(@{$self->{H}}),'
606 MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
607 MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
612 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
614 next unless defined $self->{$tmp};
615 push @m, "$tmp = $self->{$tmp}\n";
620 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
622 # Here is the Config.pm that we are using/depend on
623 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
625 # Where to put things:
626 INST_LIBDIR = $self->{INST_LIBDIR}
627 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
629 INST_AUTODIR = $self->{INST_AUTODIR}
630 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
633 if ($self->has_link_code()) {
635 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
636 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
637 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
640 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
645 EXPORT_LIST = $(BASEEXT).opt
646 PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
650 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
651 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
653 TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
655 PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
661 =item cflags (override)
663 Bypass shell script and produce qualifiers for CC directly (but warn
664 user if a shell script for this extension exists). Fold multiple
665 /Defines into one, since some C compilers pay attention to only one
666 instance of this qualifier on the command line.
671 my($self,$libperl) = @_;
672 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
673 my($definestr,$undefstr,$flagoptstr) = ('','','');
674 my($incstr) = '/Include=($(PERL_INC)';
677 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
678 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
679 " required to modify CC command for $self->{'BASEEXT'}\n"
682 if ($quals =~ / -[DIUOg]/) {
683 while ($quals =~ / -([Og])(\d*)\b/) {
684 my($type,$lvl) = ($1,$2);
685 $quals =~ s/ -$type$lvl\b\s*//;
686 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
687 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
689 while ($quals =~ / -([DIU])(\S+)/) {
690 my($type,$def) = ($1,$2);
691 $quals =~ s/ -$type$def\s*//;
693 if ($type eq 'D') { $definestr .= qq["$def",]; }
694 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
695 else { $undefstr .= qq["$def",]; }
698 if (length $quals and $quals !~ m!/!) {
699 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
702 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
703 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
704 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
705 # Deal with $self->{DEFINE} here since some C compilers pay attention
706 # to only one /Define clause on command line, so we have to
707 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
708 # ($self->{DEFINE} has already been VMSified in constants() above)
709 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
710 for my $type (qw(Def Undef)) {
712 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
714 $term =~ s:^\((.+)\)$:$1:;
717 if ($type eq 'Def') {
718 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
721 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
722 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
726 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
728 # Likewise with $self->{INC} and /Include
729 if ($self->{'INC'}) {
730 my(@includes) = split(/\s+/,$self->{INC});
731 foreach (@includes) {
733 $incstr .= ','.$self->fixpath($_,1);
736 $quals .= "$incstr)";
737 # $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
738 $self->{CCFLAGS} = $quals;
740 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
741 if ($self->{OPTIMIZE} !~ m!/!) {
742 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
743 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
744 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
747 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
748 $self->{OPTIMIZE} = '/Optimize';
752 return $self->{CFLAGS} = qq{
753 CCFLAGS = $self->{CCFLAGS}
754 OPTIMIZE = $self->{OPTIMIZE}
755 PERLTYPE = $self->{PERLTYPE}
761 =item const_cccmd (override)
763 Adds directives to point C preprocessor to the right place when
764 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
765 command line a bit differently than MM_Unix method.
770 my($self,$libperl) = @_;
773 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
774 return '' unless $self->needs_linking();
775 if ($Config{'vms_cc_type'} eq 'gcc') {
778 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
780 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
783 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
784 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
789 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
790 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
791 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
794 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
796 $self->{CONST_CCCMD} = join('',@m);
799 =item pm_to_blib (override)
801 DCL I<still> accepts a maximum of 255 characters on a command
802 line, so we write the (potentially) long list of file names
803 to a temp file, then persuade Perl to read it instead of the
804 command line to find args.
810 my($line,$from,$to,@m);
811 my($autodir) = $self->catdir('$(INST_LIB)','auto');
812 my(@files) = @{$self->{PM_TO_BLIB}};
816 # Dummy target to match Unix target name; we use pm_to_blib.ts as
817 # timestamp file to avoid repeated invocations under VMS
818 pm_to_blib : pm_to_blib.ts
821 # As always, keep under DCL's 255-char limit
822 pm_to_blib.ts : $(TO_INST_PM)
823 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
826 $line = ''; # avoid uninitialized var warning
827 while ($from = shift(@files),$to = shift(@files)) {
828 $line .= " $from $to";
829 if (length($line) > 128) {
830 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
834 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
836 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
838 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
839 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
845 =item tool_autosplit (override)
847 Use VMS-style quoting on command line.
852 my($self, %attribs) = @_;
854 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
856 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
857 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
861 =item tool_sxubpp (override)
863 Use VMS-style quoting on xsubpp command line.
869 return '' unless $self->needs_linking;
870 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
871 # drop back to old location if xsubpp is not in new location yet
872 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
873 my(@tmdeps) = '$(XSUBPPDIR)typemap';
874 if( $self->{TYPEMAPS} ){
876 foreach $typemap (@{$self->{TYPEMAPS}}){
878 warn "Typemap $typemap not found.\n";
881 push(@tmdeps, $self->fixpath($typemap,0));
885 push(@tmdeps, "typemap") if -f "typemap";
886 my(@tmargs) = map("-typemap $_", @tmdeps);
887 if( exists $self->{XSOPT} ){
888 unshift( @tmargs, $self->{XSOPT} );
891 if ($Config{'ldflags'} &&
892 $Config{'ldflags'} =~ m!/Debug!i &&
893 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
894 unshift(@tmargs,'-nolinenumbers');
896 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
898 # What are the correct thresholds for version 1 && 2 Paul?
899 if ( $xsubpp_version > 1.923 ){
900 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
902 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
903 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
904 Your version of xsubpp is $xsubpp_version and cannot handle this.
905 Please upgrade to a more recent version of xsubpp.
908 $self->{XSPROTOARG} = "";
914 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
915 XSPROTOARG = $self->{XSPROTOARG}
921 =item xsubpp_version (override)
923 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
924 rather than Unix rules ($sts == 0 ==E<gt> good).
930 my($self,$xsubpp) = @_;
932 return '' unless $self->needs_linking;
934 # try to figure out the version number of the xsubpp on the system
936 # first try the -v flag, introduced in 1.921 & 2.000a2
938 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
939 print "Running: $command\n" if $Verbose;
940 $version = `$command` ;
943 warn "Running '$command' exits with status $?";
947 return $1 if $version =~ /^xsubpp version (.*)/ ;
949 # nope, then try something else
952 my ($file) = 'temp' ;
953 $counter++ while -e "$file$counter"; # don't overwrite anything
957 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
959 MODULE = fred PACKAGE = fred
968 $command = "$self->{PERL} $xsubpp $file";
969 print "Running: $command\n" if $Verbose;
970 my $text = `$command` ;
973 warn "Running '$command' exits with status $?";
977 # gets 1.2 -> 1.92 and 2.000a1
978 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
980 # it is either 1.0 or 1.1
981 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
983 # none of the above, so 1.0
987 =item tools_other (override)
989 Adds a few MM[SK] macros, and shortens some the installatin commands,
990 in order to stay under DCL's 255-character limit. Also changes
991 EQUALIZE_TIMESTAMP to set revision date of target file to one second
992 later than source file, since MMK interprets precisely equal revision
993 dates for a source and target file as a sign that the target needs
1001 # Assumes \$(MMS) invokes MMS or MMK
1002 # (It is assumed in some cases later that the default makefile name
1003 # (Descrip.MMS for MM[SK]) is used.)
1004 USEMAKEFILE = /Descrip=
1005 USEMACROS = /Macro=(
1007 MAKEFILE = Descrip.MMS
1009 TOUCH = $self->{TOUCH}
1010 CHMOD = $self->{CHMOD}
1013 RM_F = $self->{RM_F}
1014 RM_RF = $self->{RM_RF}
1015 SAY = Write Sys\$Output
1016 UMASK_NULL = $self->{UMASK_NULL}
1017 NOOP = $self->{NOOP}
1018 NOECHO = $self->{NOECHO}
1019 MKPATH = Create/Directory
1020 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1021 !. ($self->{PARENT} ? '' :
1022 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1023 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1024 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]"
1025 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1029 =item dist (override)
1031 Provide VMSish defaults for some values, then hand off to
1032 default MM_Unix method.
1037 my($self, %attribs) = @_;
1038 $attribs{VERSION} ||= $self->{VERSION_SYM};
1039 $attribs{NAME} ||= $self->{DISTNAME};
1040 $attribs{ZIPFLAGS} ||= '-Vu';
1041 $attribs{COMPRESS} ||= 'gzip';
1042 $attribs{SUFFIX} ||= '-gz';
1043 $attribs{SHAR} ||= 'vms_share';
1044 $attribs{DIST_DEFAULT} ||= 'zipdist';
1046 # Sanitize these for use in $(DISTVNAME) filespec
1047 $attribs{VERSION} =~ s/[^\w\$]/_/g;
1048 $attribs{NAME} =~ s/[^\w\$]/-/g;
1050 return ExtUtils::MM_Unix::dist($self,%attribs);
1053 =item c_o (override)
1055 Use VMS syntax on command line. In particular, $(DEFINE) and
1056 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1062 return '' unless $self->needs_linking();
1065 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1068 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1071 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1076 =item xs_c (override)
1084 return '' unless $self->needs_linking();
1087 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1091 =item xs_o (override)
1093 Use MM[SK] macros, and VMS command line for C compiler.
1097 sub xs_o { # many makes are too dumb to use xs_c then c_o
1099 return '' unless $self->needs_linking();
1102 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1103 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1107 =item top_targets (override)
1109 Use VMS quoting on command line for Version_check.
1117 all :: pure_all manifypods
1120 pure_all :: config pm_to_blib subdirs linkext
1123 subdirs :: $(MYEXTLIB)
1126 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1129 config :: $(INST_ARCHAUTODIR).exists
1132 config :: $(INST_AUTODIR).exists
1136 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1137 if (%{$self->{MAN1PODS}}) {
1139 config :: $(INST_MAN1DIR).exists
1142 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1144 if (%{$self->{MAN3PODS}}) {
1146 config :: $(INST_MAN3DIR).exists
1149 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1153 $(O_FILES) : $(H_FILES)
1154 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1158 perldoc ExtUtils::MakeMaker
1163 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1164 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1170 =item dlsyms (override)
1172 Create VMS linker options files specifying universal symbols for this
1173 extension's shareable image, and listing other shareable images or
1174 libraries to which it should be linked.
1179 my($self,%attribs) = @_;
1181 return '' unless $self->needs_linking();
1183 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1184 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1185 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
1188 unless ($self->{SKIPHASH}{'dynamic'}) {
1190 dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1196 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1198 ') unless $self->{SKIPHASH}{'static'};
1201 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1202 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1204 $(BASEEXT).opt : Makefile.PL
1205 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1206 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1207 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
1208 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1210 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1211 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
1212 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1213 push @m, ($Config{d_vms_case_sensitive_symbols}
1214 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1216 else { # We don't have a "main" object file, so pull 'em all in
1217 # Upcase module names if linker is being case-sensitive
1218 my($upcase) = $Config{d_vms_case_sensitive_symbols};
1219 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1220 s[\$\(\w+_EXT\)][]; # even as a macro
1221 s/.*[:>\/\]]//; # Trim off dir spec
1222 $upcase ? uc($_) : $_;
1223 } split ' ', $self->eliminate_macros($self->{OBJECT});
1224 my($tmp,@lines,$elt) = '';
1225 $tmp = shift @omods;
1226 foreach $elt (@omods) {
1228 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1231 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1233 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
1235 if (length $self->{LDLOADLIBS}) {
1236 my($lib); my($line) = '';
1237 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1238 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1239 if (length($line) + length($lib) > 160) {
1240 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
1241 $line = $lib . '\n';
1243 else { $line .= $lib . '\n'; }
1245 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
1252 =item dynamic_lib (override)
1254 Use VMS Link command.
1259 my($self, %attribs) = @_;
1260 return '' unless $self->needs_linking(); #might be because of a subdir
1262 return '' unless $self->has_link_code();
1264 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1265 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1266 my $shr = $Config{'dbgprefix'} . 'PerlShr';
1270 OTHERLDFLAGS = $otherldflags
1271 INST_DYNAMIC_DEP = $inst_dynamic_dep
1275 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1276 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1277 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
1278 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1281 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1285 =item dynamic_bs (override)
1287 Use VMS-style quoting on Mkbootstrap command line.
1292 my($self, %attribs) = @_;
1295 ' unless $self->has_link_code();
1297 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1299 # As MakeMaker mkbootstrap might not write a file (if none is required)
1300 # we use touch to prevent make continually trying to remake it.
1301 # The DynaLoader only reads a non-empty file.
1302 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1303 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1304 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1305 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1306 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1308 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1309 $(NOECHO) $(RM_RF) $(INST_BOOT)
1310 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1314 =item static_lib (override)
1316 Use VMS commands to manipulate object library.
1322 return '' unless $self->needs_linking();
1327 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1331 # Rely on suffix rule for update action
1332 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1334 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1336 # If this extension has its own library (eg SDBM_File)
1337 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1338 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1340 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
1342 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1343 # 'cause it's a library and you can't stick them in other libraries.
1344 # In that case, we use $OBJECT instead and hope for the best
1345 if ($self->{MYEXTLIB}) {
1346 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
1348 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
1351 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1352 foreach $lib (split ' ', $self->{EXTRALIBS}) {
1353 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1355 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1360 =item manifypods (override)
1362 Use VMS-style quoting on command line, and VMS logical name
1363 to specify fallback location at build time if we can't find pod2man.
1369 my($self, %attribs) = @_;
1370 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1373 if (defined $self->{PERL_SRC}) {
1374 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1376 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1378 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1379 # No pod2man but some MAN3PODS to be installed
1382 Warning: I could not locate your pod2man program. As a last choice,
1383 I will look for the file to which the logical name POD2MAN
1384 points when MMK is invoked.
1387 $pod2man_exe = "pod2man";
1391 qq[POD2MAN_EXE = $pod2man_exe\n],
1392 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1393 -e "system(qq/MCR $^X ""-I$(PERL_ARCHLIB)"" ""-I$(PERL_LIB)"" $(POD2MAN_EXE) $_ >$m{$_}/);}"
1395 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1396 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1398 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1399 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1400 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1402 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1403 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1404 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1410 =item processPL (override)
1412 Use VMS-style quoting on command line.
1418 return "" unless $self->{PL_FILES};
1420 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1421 my $list = ref($self->{PL_FILES}->{$plfile})
1422 ? $self->{PL_FILES}->{$plfile}
1423 : [$self->{PL_FILES}->{$plfile}];
1424 foreach my $target (@$list) {
1425 my $vmsplfile = vmsify($plfile);
1426 my $vmsfile = vmsify($target);
1431 $vmsfile :: $vmsplfile
1432 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile $vmsfile
1439 =item installbin (override)
1441 Stay under DCL's 255 character command line limit once again by
1442 splitting potentially long list of files across multiple lines
1443 in C<realclean> target.
1449 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1450 return '' unless @{$self->{EXE_FILES}};
1451 my(@m, $from, $to, %fromto, @to, $line);
1452 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1453 for $from (@exefiles) {
1454 my($path) = '$(INST_SCRIPT)' . basename($from);
1455 local($_) = $path; # backward compatibility
1456 $to = $self->libscan($path);
1457 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1458 $fromto{$from} = vmsify($to);
1460 @to = values %fromto;
1462 EXE_FILES = @exefiles
1469 $line = ''; #avoid unitialized var warning
1471 if (length($line) + length($to) > 80) {
1472 push @m, "\t\$(RM_F) $line\n";
1475 else { $line .= " $to"; }
1477 push @m, "\t\$(RM_F) $line\n\n" if $line;
1479 while (($from,$to) = each %fromto) {
1480 last unless defined $from;
1482 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1483 else { ($todir = $to) =~ s/[^\)]+$//; }
1484 $todir = $self->fixpath($todir,1);
1486 $to : $from \$(MAKEFILE) ${todir}.exists
1489 ", $self->dir_target($todir);
1494 =item subdir_x (override)
1496 Use VMS commands to change default directory.
1501 my($self, $subdir) = @_;
1503 $subdir = $self->fixpath($subdir,1);
1507 olddef = F$Environment("Default")
1508 Set Default ',$subdir,'
1509 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1510 Set Default \'olddef\'
1515 =item clean (override)
1517 Split potentially long list of files across multiple commands (in
1518 order to stay under the magic command line limit). Also use MM[SK]
1519 commands for handling subdirectories.
1524 my($self, %attribs) = @_;
1527 # Delete temporary files but do not touch installed files. We don\'t delete
1528 # the Descrip.MMS here so that a later make realclean still has it to use.
1531 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1532 my($vmsdir) = $self->fixpath($dir,1);
1533 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
1534 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
1536 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1539 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1540 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1541 # a list or a macro that expands to a list.
1542 if ($attribs{FILES}) {
1543 my($word,$key,@filist);
1544 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1545 else { @filist = split /\s+/, $attribs{FILES}; }
1546 foreach $word (@filist) {
1547 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1548 push(@otherfiles, @{$self->{$key}});
1550 else { push(@otherfiles, $word); }
1553 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1554 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1556 $line = ''; #avoid unitialized var warning
1557 # Occasionally files are repeated several times from different sources
1558 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1560 foreach $file (@otherfiles) {
1561 $file = $self->fixpath($file);
1562 if (length($line) + length($file) > 80) {
1563 push @m, "\t\$(RM_RF) $line\n";
1566 else { $line .= " $file"; }
1568 push @m, "\t\$(RM_RF) $line\n" if $line;
1569 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1573 =item realclean (override)
1575 Guess what we're working around? Also, use MM[SK] for subdirectories.
1580 my($self, %attribs) = @_;
1583 # Delete temporary files (via clean) and also delete installed files
1586 foreach(@{$self->{DIR}}){
1587 my($vmsdir) = $self->fixpath($_,1);
1588 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1589 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
1591 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1593 # We can't expand several of the MMS macros here, since they don't have
1594 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1595 # combination of macros). In order to stay below DCL's 255 char limit,
1596 # we put only 2 on a line.
1597 my($file,$line,$fcnt);
1598 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1599 if ($self->has_link_code) {
1600 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1602 push(@files, values %{$self->{PM}});
1603 $line = ''; #avoid unitialized var warning
1604 # Occasionally files are repeated several times from different sources
1605 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
1606 foreach $file (@files) {
1607 $file = $self->fixpath($file);
1608 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1609 push @m, "\t\$(RM_F) $line\n";
1613 else { $line .= " $file"; }
1615 push @m, "\t\$(RM_F) $line\n" if $line;
1616 if ($attribs{FILES}) {
1617 my($word,$key,@filist,@allfiles);
1618 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1619 else { @filist = split /\s+/, $attribs{FILES}; }
1620 foreach $word (@filist) {
1621 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1622 push(@allfiles, @{$self->{$key}});
1624 else { push(@allfiles, $word); }
1627 # Occasionally files are repeated several times from different sources
1628 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
1629 foreach $file (@allfiles) {
1630 $file = $self->fixpath($file);
1631 if (length($line) + length($file) > 80) {
1632 push @m, "\t\$(RM_RF) $line\n";
1635 else { $line .= " $file"; }
1637 push @m, "\t\$(RM_RF) $line\n" if $line;
1639 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1643 =item dist_basics (override)
1645 Use VMS-style quoting on command line.
1652 distclean :: realclean distcheck
1656 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1659 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&skipcheck\'; skipcheck()"
1662 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1666 =item dist_core (override)
1668 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1669 so C<shdist> target actions are VMS-specific.
1676 dist : $(DIST_DEFAULT)
1677 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
1679 zipdist : $(DISTVNAME).zip
1682 tardist : $(DISTVNAME).tar$(SUFFIX)
1685 $(DISTVNAME).zip : distdir
1687 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
1688 $(RM_RF) $(DISTVNAME)
1691 $(DISTVNAME).tar$(SUFFIX) : distdir
1694 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
1695 $(RM_RF) $(DISTVNAME)
1696 $(COMPRESS) $(DISTVNAME).tar
1701 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
1702 $(RM_RF) $(DISTVNAME)
1707 =item dist_dir (override)
1709 Use VMS-style quoting on command line.
1717 $(RM_RF) $(DISTVNAME)
1718 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1719 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1723 =item dist_test (override)
1725 Use VMS commands to change default directory, and use VMS-style
1726 quoting on command line.
1734 startdir = F$Environment("Default")
1735 Set Default [.$(DISTVNAME)]
1736 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1737 $(MMS)$(MMSQUALIFIERS)
1738 $(MMS)$(MMSQUALIFIERS) test
1739 Set Default 'startdir'
1743 # --- Test and Installation Sections ---
1745 =item install (override)
1747 Work around DCL's 255 character limit several times,and use
1748 VMS-style command line quoting in a few cases.
1753 my($self, %attribs) = @_;
1756 if ($self->{EXE_FILES}) {
1757 my($line,$file) = ('','');
1758 foreach $file (@{$self->{EXE_FILES}}) {
1760 if (length($line) > 128) {
1761 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1765 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1769 install :: all pure_install doc_install
1772 install_perl :: all pure_perl_install doc_perl_install
1775 install_site :: all pure_site_install doc_site_install
1778 install_ :: install_site
1779 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1781 pure_install :: pure_$(INSTALLDIRS)_install
1784 doc_install :: doc_$(INSTALLDIRS)_install
1785 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1787 pure__install : pure_site_install
1788 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1790 doc__install : doc_site_install
1791 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1793 # This hack brought to you by DCL's 255-character command line limit
1794 pure_perl_install ::
1795 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1796 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1797 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1798 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1799 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1800 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1801 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1802 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1803 $(MOD_INSTALL) <.MM_tmp
1804 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1805 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1808 pure_site_install ::
1809 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1810 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1811 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1812 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1813 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1814 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1815 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1816 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1817 $(MOD_INSTALL) <.MM_tmp
1818 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1819 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1823 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1824 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1826 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1827 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1828 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1829 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1830 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1831 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1835 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1836 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
1838 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1839 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1840 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1841 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1842 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1843 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1848 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1851 uninstall_from_perldirs ::
1852 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1853 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1854 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1855 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1857 uninstall_from_sitedirs ::
1858 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1859 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1860 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1861 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1867 =item perldepend (override)
1869 Use VMS-style syntax for files; it's cheaper to just do it directly here
1870 than to have the MM_Unix method call C<catfile> repeatedly. Also, if
1871 we have to rebuild Config.pm, use MM[SK] to do it.
1880 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1881 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1882 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1883 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1884 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1885 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1886 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1887 $(OBJECT) : $(PERL_INC)iperlsys.h
1889 ' if $self->{OBJECT};
1891 if ($self->{PERL_SRC}) {
1893 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1894 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1895 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1896 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1897 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1898 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1899 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1901 # Check for unpropagated config.sh changes. Should never happen.
1902 # We do NOT just update config.h because that is not sufficient.
1903 # An out of date config.h is not fatal but complains loudly!
1904 $(PERL_INC)config.h : $(PERL_SRC)config.sh
1907 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1908 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
1909 olddef = F$Environment("Default")
1910 Set Default $(PERL_SRC)
1911 $(MMS)],$mmsquals,);
1912 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
1913 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
1914 $target =~ s/\Q$prefix/[/;
1915 push(@m," $target");
1917 else { push(@m,' $(MMS$TARGET)'); }
1919 Set Default 'olddef'
1923 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1929 =item makefile (override)
1931 Use VMS commands and quoting.
1938 # We do not know what target was originally specified so we
1939 # must force a manual rerun to be sure. But as it should only
1940 # happen very rarely it is not a significant problem.
1942 $(OBJECT) : $(FIRST_MAKEFILE)
1943 ] if $self->{OBJECT};
1946 # We take a very conservative approach here, but it\'s worth it.
1947 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1948 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1949 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1950 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1951 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1952 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1953 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1954 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1955 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1961 =item test (override)
1963 Use VMS commands for handling subdirectories.
1968 my($self, %attribs) = @_;
1969 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1973 TEST_TYPE = test_\$(LINKTYPE)
1977 test :: \$(TEST_TYPE)
1980 testdb :: testdb_\$(LINKTYPE)
1984 foreach(@{$self->{DIR}}){
1985 my($vmsdir) = $self->fixpath($_,1);
1986 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1987 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
1989 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
1990 unless $tests or -f "test.pl" or @{$self->{DIR}};
1993 push(@m, "test_dynamic :: pure_all\n");
1994 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1995 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1996 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1999 push(@m, "testdb_dynamic :: pure_all\n");
2000 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
2003 # Occasionally we may face this degenerate target:
2004 push @m, "test_ : test_dynamic\n\n";
2006 if ($self->needs_linking()) {
2007 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2008 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2009 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2011 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2012 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2016 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2017 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2023 =item test_via_harness (override)
2025 Use VMS-style quoting on command line.
2029 sub test_via_harness {
2030 my($self,$perl,$tests) = @_;
2031 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2032 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2035 =item test_via_script (override)
2037 Use VMS-style quoting on command line.
2041 sub test_via_script {
2042 my($self,$perl,$script) = @_;
2043 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2047 =item makeaperl (override)
2049 Undertake to build a new set of Perl images using VMS commands. Since
2050 VMS does dynamic loading, it's not necessary to statically link each
2051 extension into the Perl image, so this isn't the normal build path.
2052 Consequently, it hasn't really been tested, and may well be incomplete.
2059 my($self, %attribs) = @_;
2060 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2061 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2064 # --- MakeMaker makeaperl section ---
2065 MAP_TARGET = $target
2067 return join '', @m if $self->{PARENT};
2069 my($dir) = join ":", @{$self->{DIR}};
2071 unless ($self->{MAKEAPERL}) {
2073 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2074 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2075 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2076 Makefile.PL DIR=}, $dir, q{ \
2077 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2078 MAKEAPERL=1 NORECURS=1 };
2080 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
2082 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2083 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2091 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
2094 # The front matter of the linkcommand...
2095 $linkcmd = join ' ', $Config{'ld'},
2096 grep($_, @Config{qw(large split ldflags ccdlflags)});
2097 $linkcmd =~ s/\s+/ /g;
2099 # Which *.olb files could we make use of...
2100 local(%olbs); # XXX can this be lexical?
2101 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2103 File::Find::find(sub {
2104 return unless m/\Q$self->{LIB_EXT}\E$/;
2105 return if m/^libperl/;
2107 if( exists $self->{INCLUDE_EXT} ){
2112 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2116 # Throw away anything not explicitly marked for inclusion.
2117 # DynaLoader is implied.
2118 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2124 return unless $found;
2126 elsif( exists $self->{EXCLUDE_EXT} ){
2130 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2134 # Throw away anything explicitly marked for exclusion
2135 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2136 return if( $xx eq $excl );
2140 $olbs{$ENV{DEFAULT}} = $_;
2141 }, grep( -d $_, @{$searchdirs || []}));
2143 # We trust that what has been handed in as argument will be buildable
2144 $static = [] unless $static;
2145 @olbs{@{$static}} = (1) x @{$static};
2147 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2148 # Sort the object libraries in inverse order of
2149 # filespec length to try to insure that dependent extensions
2150 # will appear before their parents, so the linker will
2151 # search the parent library to resolve references.
2152 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2153 # references from [.intuit.dwim]dwim.obj can be found
2154 # in [.intuit]intuit.olb).
2155 for (sort { length($a) <=> length($b) } keys %olbs) {
2156 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2157 my($dir) = $self->fixpath($_,1);
2158 my($extralibs) = $dir . "extralibs.ld";
2159 my($extopt) = $dir . $olbs{$_};
2160 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2161 push @optlibs, "$dir$olbs{$_}";
2162 # Get external libraries this extension will need
2163 if (-f $extralibs ) {
2165 open LIST,$extralibs or warn $!,next;
2168 # Include a library in the link only once, unless it's mentioned
2169 # multiple times within a single extension's options file, in which
2170 # case we assume the builder needed to search it again later in the
2172 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2173 $libseen{$_}++; $seenthis{$_}++;
2179 # Get full name of extension for ExtUtils::Miniperl
2181 open OPT,$extopt or die $!;
2183 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2186 push @staticpkgs,$pkg;
2190 # Place all of the external libraries after all of the Perl extension
2191 # libraries in the final link, in order to maximize the opportunity
2192 # for XS code from multiple extensions to resolve symbols against the
2193 # same external library while only including that library once.
2194 push @optlibs, @$extra;
2196 $target = "Perl$Config{'exe_ext'}" unless $target;
2198 ($shrtarget,$targdir) = fileparse($target);
2199 $shrtarget =~ s/^([^.]*)/$1Shr/;
2200 $shrtarget = $targdir . $shrtarget;
2201 $target = "Perlshr.$Config{'dlext'}" unless $target;
2202 $tmp = "[]" unless $tmp;
2203 $tmp = $self->fixpath($tmp,1);
2204 if (@optlibs) { $extralist = join(' ',@optlibs); }
2205 else { $extralist = ''; }
2206 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
2207 # that's what we're building here).
2208 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
2210 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2211 print STDOUT "Warning: $libperl not found\n";
2216 if (defined $self->{PERL_SRC}) {
2217 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2218 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2220 print STDOUT "Warning: $libperl not found
2221 If you're going to build a static perl binary, make sure perl is installed
2222 otherwise ignore this warning\n";
2225 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2228 # Fill in the target you want to produce if it\'s not perl
2229 MAP_TARGET = ',$self->fixpath($target,0),'
2230 MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
2231 MAP_LINKCMD = $linkcmd
2232 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
2233 MAP_EXTRA = $extralist
2234 MAP_LIBPERL = ",$self->fixpath($libperl,0),'
2238 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2239 foreach (@optlibs) {
2240 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2242 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2243 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2246 $(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2247 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
2248 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2249 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2250 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2251 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2252 $(NOECHO) $(SAY) "To remove the intermediate files, say
2253 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2255 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2256 push @m, "# More from the 255-char line length limit\n";
2257 foreach (@staticpkgs) {
2258 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2261 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2262 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
2265 # Still more from the 255-char line length limit
2267 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2268 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2269 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2270 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2271 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2272 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2276 inst_perl : pure_inst_perl doc_inst_perl
2279 pure_inst_perl : \$(MAP_TARGET)
2280 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2281 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2287 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2288 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
2294 # --- Output postprocessing section ---
2296 =item nicetext (override)
2298 Insure that colons marking targets are preceded by space, in order
2299 to distinguish the target delimiter from a colon appearing as
2306 my($self,$text) = @_;
2307 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;