2 # MakeMaker default methods for VMS
3 # This package is inserted into @ISA of MakeMaker's MM before the
4 # built-in ExtUtils::MM_Unix methods if MakeMaker.pm is run under VMS.
6 # Author: Charles Bailey bailey@genetics.upenn.edu
8 package ExtUtils::MM_VMS;
9 $ExtUtils::MM_VMS::Revision=$ExtUtils::MM_VMS::Revision = '5.39 (16-Jan-1997)';
10 unshift @MM::ISA, 'ExtUtils::MM_VMS';
17 Exporter::import('ExtUtils::MakeMaker', '$Verbose', '&neatvalue');
21 ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
25 use ExtUtils::MM_VMS; # Done internally by ExtUtils::MakeMaker if needed
29 See ExtUtils::MM_Unix for a documentation of the methods provided
30 there. This package overrides the implementation of these methods, not
33 =head2 Methods always loaded
35 =item eliminate_macros
37 Expands MM[KS]/Make macros in a text string, using the contents of
38 identically named elements of C<%$self>, and returns the result
39 as a file specification in Unix syntax.
43 sub eliminate_macros {
46 print "eliminate_macros('') = ||\n" if $Verbose >= 3;
49 my($npath) = unixify($path);
50 my($head,$macro,$tail);
52 # perform m##g in scalar context so it acts as an iterator
53 while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#g) {
55 ($head,$macro,$tail) = ($1,$2,$3);
56 ($macro = unixify($self->{$macro})) =~ s#/$##;
57 $npath = "$head$macro$tail";
60 print "eliminate_macros($path) = |$npath|\n" if $Verbose >= 3;
66 Catchall routine to clean up problem MM[SK]/Make macros. Expands macros
67 in any directory specification, in order to avoid juxtaposing two
68 VMS-syntax directories when MM[SK] is run. Also expands expressions which
69 are all macro, so that we can tell how long the expansion is, and avoid
70 overrunning DCL's command buffer when MM[KS] is running.
72 If optional second argument has a TRUE value, then the return string is
73 a VMS-syntax directory specification, otherwise it is a VMS-syntax file
79 my($self,$path,$force_path) = @_;
81 print "eliminate_macros('') = ||\n" if $Verbose >= 3;
84 my($fixedpath,$prefix,$name);
86 if ($path =~ m#^\$\(.+\)$# || $path =~ m#[/:>\]]#) {
87 if ($force_path or $path =~ /(?:DIR\)|\])$/) {
88 $fixedpath = vmspath($self->eliminate_macros($path));
91 $fixedpath = vmsify($self->eliminate_macros($path));
94 elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#)) && $self->{$prefix}) {
95 my($vmspre) = vmspath($self->eliminate_macros("\$($prefix)")) || ''; # is it a dir or just a name?
96 $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
97 $fixedpath = vmspath($fixedpath) if $force_path;
101 $fixedpath = vmspath($fixedpath) if $force_path;
103 # Convert names without directory or type to paths
104 if (!$force_path and $fixedpath !~ /[:>(.\]]/) { $fixedpath = vmspath($fixedpath); }
105 # Trim off root dirname if it's had other dirs inserted in front of it.
106 $fixedpath =~ s/\.000000([\]>])/$1/;
107 print "fixpath($path) = |$fixedpath|\n" if $Verbose >= 3;
113 Concatenates a list of file specifications, and returns the result as a
114 VMS-syntax directory specification.
119 my($self,@dirs) = @_;
120 my($dir) = pop @dirs;
121 @dirs = grep($_,@dirs);
124 my($path) = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
125 my($spath,$sdir) = ($path,$dir);
126 $spath =~ s/.dir$//; $sdir =~ s/.dir$//;
127 $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+$/;
128 $rslt = $self->fixpath($self->eliminate_macros($spath)."/$sdir",1);
131 if ($dir =~ /^\$\([^\)]+\)$/) { $rslt = $dir; }
132 else { $rslt = vmspath($dir); }
134 print "catdir(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
140 Concatenates a list of file specifications, and returns the result as a
141 VMS-syntax directory specification.
146 my($self,@files) = @_;
147 my($file) = pop @files;
148 @files = grep($_,@files);
151 my($path) = (@files == 1 ? $files[0] : $self->catdir(@files));
154 if ( $spath =~ /^[^\)\]\/:>]+\)$/ && basename($file) eq $file) { $rslt = "$spath$file"; }
156 $rslt = $self->eliminate_macros($spath);
157 $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
160 else { $rslt = vmsify($file); }
161 print "catfile(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
167 Converts a list into a string wrapped at approximately 80 columns.
173 my($line,$hlen) = ('',0);
177 # Perl bug -- seems to occasionally insert extra elements when
178 # traversing array (scalar(@array) doesn't show them, but
179 # foreach(@array) does) (5.00307)
180 next unless $word =~ /\w/;
181 $line .= ', ' if length($line);
182 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
184 $hlen += length($word) + 2;
189 =item curdir (override)
191 Returns a string representing of the current directory.
199 =item rootdir (override)
201 Returns a string representing of the root directory.
209 =item updir (override)
211 Returns a string representing of the parent directory.
219 package ExtUtils::MM_VMS;
221 sub ExtUtils::MM_VMS::ext;
222 sub ExtUtils::MM_VMS::guess_name;
223 sub ExtUtils::MM_VMS::find_perl;
224 sub ExtUtils::MM_VMS::path;
225 sub ExtUtils::MM_VMS::maybe_command;
226 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
227 sub ExtUtils::MM_VMS::perl_script;
228 sub ExtUtils::MM_VMS::file_name_is_absolute;
229 sub ExtUtils::MM_VMS::replace_manpage_separator;
230 sub ExtUtils::MM_VMS::init_others;
231 sub ExtUtils::MM_VMS::constants;
232 sub ExtUtils::MM_VMS::cflags;
233 sub ExtUtils::MM_VMS::const_cccmd;
234 sub ExtUtils::MM_VMS::pm_to_blib;
235 sub ExtUtils::MM_VMS::tool_autosplit;
236 sub ExtUtils::MM_VMS::tool_xsubpp;
237 sub ExtUtils::MM_VMS::xsubpp_version;
238 sub ExtUtils::MM_VMS::tools_other;
239 sub ExtUtils::MM_VMS::dist;
240 sub ExtUtils::MM_VMS::c_o;
241 sub ExtUtils::MM_VMS::xs_c;
242 sub ExtUtils::MM_VMS::xs_o;
243 sub ExtUtils::MM_VMS::top_targets;
244 sub ExtUtils::MM_VMS::dlsyms;
245 sub ExtUtils::MM_VMS::dynamic_lib;
246 sub ExtUtils::MM_VMS::dynamic_bs;
247 sub ExtUtils::MM_VMS::static_lib;
248 sub ExtUtils::MM_VMS::manifypods;
249 sub ExtUtils::MM_VMS::processPL;
250 sub ExtUtils::MM_VMS::installbin;
251 sub ExtUtils::MM_VMS::subdir_x;
252 sub ExtUtils::MM_VMS::clean;
253 sub ExtUtils::MM_VMS::realclean;
254 sub ExtUtils::MM_VMS::dist_basics;
255 sub ExtUtils::MM_VMS::dist_core;
256 sub ExtUtils::MM_VMS::dist_dir;
257 sub ExtUtils::MM_VMS::dist_test;
258 sub ExtUtils::MM_VMS::install;
259 sub ExtUtils::MM_VMS::perldepend;
260 sub ExtUtils::MM_VMS::makefile;
261 sub ExtUtils::MM_VMS::test;
262 sub ExtUtils::MM_VMS::test_via_harness;
263 sub ExtUtils::MM_VMS::test_via_script;
264 sub ExtUtils::MM_VMS::makeaperl;
265 sub ExtUtils::MM_VMS::ext;
266 sub ExtUtils::MM_VMS::nicetext;
271 if (defined fileno(DATA)) {
272 my $fh = select DATA;
273 my $o = $/; # For future reads from the file.
285 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
287 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
296 # This isn't really an override. It's just here because ExtUtils::MM_VMS
297 # appears in @MM::ISA before ExtUtils::Liblist, so if there isn't an ext()
298 # in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
299 # mimic inheritance here and hand off to ExtUtils::Liblist.
301 ExtUtils::Liblist::ext(@_);
305 =head2 SelfLoaded methods
307 Those methods which override default MM_Unix methods are marked
308 "(override)", while methods unique to MM_VMS are marked "(specific)".
309 For overridden methods, documentation is limited to an explanation
310 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
311 documentation for more details.
313 =item guess_name (override)
315 Try to determine name of extension being built. We begin with the name
316 of the current directory. Since VMS filenames are case-insensitive,
317 however, we look for a F<.pm> file whose name matches that of the current
318 directory (presumably the 'main' F<.pm> file for this extension), and try
319 to find a C<package> statement from which to obtain the Mixed::Case
326 my($defname,$defpm,@pm,%xs,$pm);
329 $defname = basename(fileify($ENV{'DEFAULT'}));
330 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
332 # Fallback in case for some reason a user has copied the files for an
333 # extension into a working directory whose name doesn't reflect the
334 # extension's name. We'll use the name of a unique .pm file, or the
335 # first .pm file with a matching .xs file.
336 if (not -e "${defpm}.pm") {
337 @pm = map { s/.pm$//; $_ } glob('*.pm');
338 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
340 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
341 if (%xs) { foreach $pm (@pm) { $defpm = $pm, last if exists $xs{$pm}; } }
344 if (open(PM,"${defpm}.pm")){
346 if (/^\s*package\s+([^;]+)/i) {
351 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
352 "defaulting package name to $defname\n"
357 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
358 "defaulting package name to $defname\n";
360 $defname =~ s#[\d.\-_]+$##;
364 =item find_perl (override)
366 Use VMS file specification syntax and CLI commands to find and
372 my($self, $ver, $names, $dirs, $trace) = @_;
373 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
375 # Check in relative directories first, so we pick up the current
376 # version of Perl if we're running MakeMaker as part of the main build.
377 @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
378 my($absb) = $self->file_name_is_absolute($b);
379 if ($absa && $absb) { return $a cmp $b }
380 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
382 # Check miniperl before perl, and check names likely to contain
383 # version numbers before "generic" names, so we pick up an
384 # executable that's less likely to be from an old installation.
385 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
386 my($bb) = $b =~ m!([^:>\]/]+)$!;
387 my($ahasdir) = (length($a) - length($ba) > 0);
388 my($bhasdir) = (length($b) - length($bb) > 0);
389 if ($ahasdir and not $bhasdir) { return 1; }
390 elsif ($bhasdir and not $ahasdir) { return -1; }
391 else { $bb =~ /\d/ <=> $ba =~ /\d/
392 or substr($ba,0,1) cmp substr($bb,0,1)
393 or length($bb) <=> length($ba) } } @$names;
394 # Image names containing Perl version use '_' instead of '.' under VMS
395 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
397 print "Looking for perl $ver by these names:\n";
398 print "\t@snames,\n";
399 print "in these dirs:\n";
402 foreach $dir (@sdirs){
403 next unless defined $dir; # $self->{PERL_SRC} may be undefined
404 $inabs++ if $self->file_name_is_absolute($dir);
406 # We've covered relative dirs; everything else is an absolute
407 # dir (probably an installed location). First, we'll try potential
408 # command names, to see whether we can avoid a long MCR expression.
409 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
410 $inabs++; # Should happen above in next $dir, but just in case . . .
412 foreach $name (@snames){
413 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
414 else { push(@cand,$self->fixpath($name)); }
417 foreach $name (@cand) {
418 print "Checking $name\n" if ($trace >= 2);
419 # If it looks like a potential command, try it without the MCR
420 if ($name =~ /^[\w\-\$]+$/ &&
421 `$name -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
422 print "Using PERL=$name\n" if $trace;
425 next unless $vmsfile = $self->maybe_command($name);
426 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
427 print "Executing $vmsfile\n" if ($trace >= 2);
428 if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
429 print "Using PERL=MCR $vmsfile\n" if $trace;
430 return "MCR $vmsfile";
433 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
434 0; # false and not empty
437 =item path (override)
439 Translate logical name DCL$PATH as a searchlist, rather than trying
440 to C<split> string value of C<$ENV{'PATH'}>.
446 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
450 =item maybe_command (override)
452 Follows VMS naming conventions for executable files.
453 If the name passed in doesn't exactly match an executable file,
454 appends F<.Exe> to check for executable image, and F<.Com> to check
455 for DCL procedure. If this fails, checks F<Sys$System:> for an
456 executable file having the name specified. Finally, appends F<.Exe>
462 my($self,$file) = @_;
463 return $file if -x $file && ! -d _;
464 return "$file.exe" if -x "$file.exe";
465 return "$file.com" if -x "$file.com";
466 if ($file !~ m![/:>\]]!) {
467 my($shrfile) = 'Sys$System:' . $file;
468 return $file if -x $shrfile && ! -d _;
469 return "$file.exe" if -x "$shrfile.exe";
474 =item maybe_command_in_dirs (override)
476 Uses DCL argument quoting on test command line.
480 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
481 my($self, $names, $dirs, $trace, $ver) = @_;
483 foreach $dir (@$dirs){
484 next unless defined $dir; # $self->{PERL_SRC} may be undefined
485 foreach $name (@$names){
487 if ($self->file_name_is_absolute($name)) {
490 $abs = $self->catfile($dir, $name);
492 print "Checking $abs for $name\n" if ($trace >= 2);
493 next unless $tryabs = $self->maybe_command($abs);
494 print "Substituting $tryabs instead of $abs\n"
495 if ($trace >= 2 and $tryabs ne $abs);
498 print "Executing $abs\n" if ($trace >= 2);
499 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
500 print "Using $abs\n" if $trace;
503 } else { # Do not look for perl
510 =item perl_script (override)
512 If name passed in doesn't specify a readable file, appends F<.pl> and
513 tries again, since it's customary to have file types on all files
519 my($self,$file) = @_;
520 return $file if -r $file && ! -d _;
521 return "$file.pl" if -r "$file.pl" && ! -d _;
525 =item file_name_is_absolute (override)
527 Checks for VMS directory spec as well as Unix separators.
531 sub file_name_is_absolute {
532 my($self,$file) = @_;
533 # If it's a logical name, expand it.
534 $file = $ENV{$file} while $file =~ /^[\w\$\-]+$/ and $ENV{$file};
535 $file =~ m!^/! or $file =~ m![<\[][^.\-\]>]! or $file =~ /:[^<\[]/;
538 =item replace_manpage_separator
540 Use as separator a character which is legal in a VMS-syntax file name.
544 sub replace_manpage_separator {
546 $man = unixify($man);
551 =item init_others (override)
553 Provide VMS-specific forms of various utility commands, then hand
554 off to the default MM_Unix method.
561 $self->{NOOP} = 'Continue';
562 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
563 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
564 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
565 $self->{NOECHO} ||= '@ ';
566 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
567 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
568 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
569 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
570 $self->{CP} = 'Copy/NoConfirm';
571 $self->{MV} = 'Rename/NoConfirm';
572 $self->{UMASK_NULL} = '! ';
573 &ExtUtils::MM_Unix::init_others;
576 =item constants (override)
578 Fixes up numerous file and directory macros to insure VMS syntax
579 regardless of input syntax. Also adds a few VMS-specific macros
580 and makes lists of files comma-separated.
588 if ($self->{DEFINE} ne '') {
589 my(@defs) = split(/\s+/,$self->{DEFINE});
590 foreach $def (@defs) {
593 $def = "\"$def\"" if $def =~ /=/;
595 $self->{DEFINE} = join ',',@defs;
598 if ($self->{OBJECT} =~ /\s/) {
599 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
600 $self->{OBJECT} = join(' ',map($self->fixpath($_),split(/,?\s+/,$self->{OBJECT})));
602 $self->{LDFROM} = join(' ',map($self->fixpath($_),split(/,?\s+/,$self->{LDFROM})));
605 # Fix up directory specs
606 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
608 foreach $macro ( qw [
609 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
610 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
611 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
612 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
613 SITELIBEXP SITEARCHEXP ] ) {
614 next unless defined $self->{$macro};
615 $self->{$macro} = $self->fixpath($self->{$macro},1);
617 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
618 if ($self->{PERL_SRC});
623 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
624 next unless defined $self->{$macro};
625 $self->{$macro} = $self->fixpath($self->{$macro});
629 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
630 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
631 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
632 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
633 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
634 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
635 PERL_INC PERL FULLPERL
637 next unless defined $self->{$macro};
638 push @m, "$macro = $self->{$macro}\n";
643 VERSION_MACRO = VERSION
644 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
645 XS_VERSION_MACRO = XS_VERSION
646 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
648 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
649 MM_VERSION = $ExtUtils::MakeMaker::VERSION
650 MM_REVISION = $ExtUtils::MakeMaker::Revision
651 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
653 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
654 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
655 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
656 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
660 FULLEXT VERSION_FROM OBJECT LDFROM
662 next unless defined $self->{$tmp};
663 push @m, "$tmp = ",$self->fixpath($self->{$tmp}),"\n";
667 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
669 next unless defined $self->{$tmp};
670 push @m, "$tmp = $self->{$tmp}\n";
673 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
674 next unless defined $self->{$tmp};
676 for $key (keys %{$self->{$tmp}}) {
677 $tmp{$self->fixpath($key)} = $self->fixpath($self->{$tmp}{$key});
679 $self->{$tmp} = \%tmp;
682 for $tmp (qw/ C O_FILES H /) {
683 next unless defined $self->{$tmp};
685 for $val (@{$self->{$tmp}}) {
686 push(@tmp,$self->fixpath($val));
688 $self->{$tmp} = \@tmp;
693 # Handy lists of source code files:
694 XS_FILES = ',$self->wraplist(', ', sort keys %{$self->{XS}}),'
695 C_FILES = ',$self->wraplist(', ', @{$self->{C}}),'
696 O_FILES = ',$self->wraplist(', ', @{$self->{O_FILES}} ),'
697 H_FILES = ',$self->wraplist(', ', @{$self->{H}}),'
698 MAN1PODS = ',$self->wraplist(', ', sort keys %{$self->{MAN1PODS}}),'
699 MAN3PODS = ',$self->wraplist(', ', sort keys %{$self->{MAN3PODS}}),'
704 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
706 next unless defined $self->{$tmp};
707 push @m, "$tmp = $self->{$tmp}\n";
711 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
713 # Here is the Config.pm that we are using/depend on
714 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
716 # Where to put things:
717 INST_LIBDIR = $self->{INST_LIBDIR}
718 INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
720 INST_AUTODIR = $self->{INST_AUTODIR}
721 INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
724 if ($self->has_link_code()) {
726 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
727 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(BASEEXT).$(DLEXT)
728 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
735 EXPORT_LIST = $(BASEEXT).opt
736 PERL_ARCHIVE = ',($ENV{'PERLSHR'} ? $ENV{'PERLSHR'} : 'Sys$Share:PerlShr.Exe'),'
740 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
741 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
743 TO_INST_PM = ',$self->wraplist(', ',@{$self->{TO_INST_PM}}),'
745 PM_TO_BLIB = ',$self->wraplist(', ',@{$self->{PM_TO_BLIB}}),'
751 =item cflags (override)
753 Bypass shell script and produce qualifiers for CC directly (but warn
754 user if a shell script for this extension exists). Fold multiple
755 /Defines into one, since some C compilers pay attention to only one
756 instance of this qualifier on the command line.
761 my($self,$libperl) = @_;
762 my($quals) = $Config{'ccflags'};
764 my($optimize) = '/Optimize';
766 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
767 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
768 " required to modify CC command for $self->{'BASEEXT'}\n"
771 # Deal with $self->{DEFINE} here since some C compilers pay attention
772 # to only one /Define clause on command line, so we have to
773 # conflate the ones from $Config{'cc'} and $self->{DEFINE}
774 if ($quals =~ m:(.*)/define=\(?([^\(\/\)\s]+)\)?(.*)?:i) {
775 $quals = "$1/Define=($2," . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
776 "\$(DEFINE_VERSION),\$(XS_DEFINE_VERSION))$3";
779 $quals .= '/Define=(' . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
780 '$(DEFINE_VERSION),$(XS_DEFINE_VERSION))';
783 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
784 if ($libperl =~ /libperl(\w+)\./i) {
786 my(%map) = ( 'D' => 'DEBUGGING', 'E' => 'EMBED', 'M' => 'MULTIPLICITY',
787 'DE' => 'DEBUGGING,EMBED', 'DM' => 'DEBUGGING,MULTIPLICITY',
788 'EM' => 'EMBED,MULTIPLICITY', 'DEM' => 'DEBUGGING,EMBED,MULTIPLICITY' );
789 $quals =~ s:/define=\(([^\)]+)\):/Define=($1,$map{$type}):i
792 # Likewise with $self->{INC} and /Include
793 my($incstr) = '/Include=($(PERL_INC)';
794 if ($self->{'INC'}) {
795 my(@includes) = split(/\s+/,$self->{INC});
796 foreach (@includes) {
798 $incstr .= ', '.$self->fixpath($_,1);
801 $quals .= "$incstr)";
803 $optimize = '/Debug/NoOptimize'
804 if ($self->{OPTIMIZE} =~ /-g/ or $self->{OPTIMIZE} =~ m!/Debug!i);
806 return $self->{CFLAGS} = qq{
815 =item const_cccmd (override)
817 Adds directives to point C preprocessor to the right place when
818 handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
819 command line a bit differently than MM_Unix method.
824 my($self,$libperl) = @_;
827 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
828 return '' unless $self->needs_linking();
829 if ($Config{'vms_cc_type'} eq 'gcc') {
832 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
834 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
837 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
838 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
843 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
844 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
845 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
848 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
850 $self->{CONST_CCCMD} = join('',@m);
853 =item pm_to_blib (override)
855 DCL I<still> accepts a maximum of 255 characters on a command
856 line, so we write the (potentially) long list of file names
857 to a temp file, then persuade Perl to read it instead of the
858 command line to find args.
864 my($line,$from,$to,@m);
865 my($autodir) = $self->catdir('$(INST_LIB)','auto');
866 my(@files) = @{$self->{PM_TO_BLIB}};
870 # Dummy target to match Unix target name; we use pm_to_blib.ts as
871 # timestamp file to avoid repeated invocations under VMS
872 pm_to_blib : pm_to_blib.ts
875 # As always, keep under DCL's 255-char limit
876 pm_to_blib.ts : $(TO_INST_PM)
877 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
880 $line = ''; # avoid uninitialized var warning
881 while ($from = shift(@files),$to = shift(@files)) {
882 $line .= " $from $to";
883 if (length($line) > 128) {
884 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
888 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
890 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
892 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
893 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
899 =item tool_autosplit (override)
901 Use VMS-style quoting on command line.
906 my($self, %attribs) = @_;
908 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
910 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
911 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
915 =item tool_sxubpp (override)
917 Use VMS-style quoting on xsubpp command line.
923 return '' unless $self->needs_linking;
924 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
925 # drop back to old location if xsubpp is not in new location yet
926 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
927 my(@tmdeps) = '$(XSUBPPDIR)typemap';
928 if( $self->{TYPEMAPS} ){
930 foreach $typemap (@{$self->{TYPEMAPS}}){
932 warn "Typemap $typemap not found.\n";
935 push(@tmdeps, $self->fixpath($typemap));
939 push(@tmdeps, "typemap") if -f "typemap";
940 my(@tmargs) = map("-typemap $_", @tmdeps);
941 if( exists $self->{XSOPT} ){
942 unshift( @tmargs, $self->{XSOPT} );
945 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
947 # What are the correct thresholds for version 1 && 2 Paul?
948 if ( $xsubpp_version > 1.923 ){
949 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
951 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
952 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
953 Your version of xsubpp is $xsubpp_version and cannot handle this.
954 Please upgrade to a more recent version of xsubpp.
957 $self->{XSPROTOARG} = "";
963 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
964 XSPROTOARG = $self->{XSPROTOARG}
970 =item xsubpp_version (override)
972 Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
973 rather than Unix rules ($sts == 0 ==E<gt> good).
979 my($self,$xsubpp) = @_;
981 return '' unless $self->needs_linking;
983 # try to figure out the version number of the xsubpp on the system
985 # first try the -v flag, introduced in 1.921 & 2.000a2
987 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
988 print "Running: $command\n" if $Verbose;
989 $version = `$command` ;
990 warn "Running '$command' exits with status " . $? unless ($? & 1);
993 return $1 if $version =~ /^xsubpp version (.*)/ ;
995 # nope, then try something else
998 my ($file) = 'temp' ;
999 $counter++ while -e "$file$counter"; # don't overwrite anything
1003 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
1005 MODULE = fred PACKAGE = fred
1014 $command = "$self->{PERL} $xsubpp $file";
1015 print "Running: $command\n" if $Verbose;
1016 my $text = `$command` ;
1017 warn "Running '$command' exits with status " . $? unless ($? & 1);
1020 # gets 1.2 -> 1.92 and 2.000a1
1021 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
1023 # it is either 1.0 or 1.1
1024 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
1026 # none of the above, so 1.0
1030 =item tools_other (override)
1032 Adds a few MM[SK] macros, and shortens some the installatin commands,
1033 in order to stay under DCL's 255-character limit. Also changes
1034 EQUALIZE_TIMESTAMP to set revision date of target file to one second
1035 later than source file, since MMK interprets precisely equal revision
1036 dates for a source and target file as a sign that the target needs
1044 # Assumes \$(MMS) invokes MMS or MMK
1045 # (It is assumed in some cases later that the default makefile name
1046 # (Descrip.MMS for MM[SK]) is used.)
1047 USEMAKEFILE = /Descrip=
1048 USEMACROS = /Macro=(
1050 MAKEFILE = Descrip.MMS
1052 TOUCH = $self->{TOUCH}
1053 CHMOD = $self->{CHMOD}
1056 RM_F = $self->{RM_F}
1057 RM_RF = $self->{RM_RF}
1058 SAY = Write Sys\$Output
1059 UMASK_NULL = $self->{UMASK_NULL}
1060 NOOP = $self->{NOOP}
1061 NOECHO = $self->{NOECHO}
1062 MKPATH = Create/Directory
1063 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1064 !. ($self->{PARENT} ? '' :
1065 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1066 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1067 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]"
1068 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
1072 =item dist (override)
1074 Provide VMSish defaults for some values, then hand off to
1075 default MM_Unix method.
1080 my($self, %attribs) = @_;
1081 $attribs{VERSION} ||= $self->{VERSION_SYM};
1082 $attribs{ZIPFLAGS} ||= '-Vu';
1083 $attribs{COMPRESS} ||= 'gzip';
1084 $attribs{SUFFIX} ||= '-gz';
1085 $attribs{SHAR} ||= 'vms_share';
1086 $attribs{DIST_DEFAULT} ||= 'zipdist';
1088 return ExtUtils::MM_Unix::dist($self,%attribs);
1091 =item c_o (override)
1093 Use VMS syntax on command line. In particular, $(DEFINE) and
1094 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1100 return '' unless $self->needs_linking();
1103 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1106 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1109 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1114 =item xs_c (override)
1122 return '' unless $self->needs_linking();
1125 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1129 =item xs_o (override)
1131 Use MM[SK] macros, and VMS command line for C compiler.
1135 sub xs_o { # many makes are too dumb to use xs_c then c_o
1137 return '' unless $self->needs_linking();
1140 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1141 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1145 =item top_targets (override)
1147 Use VMS quoting on command line for Version_check.
1155 all :: pure_all manifypods
1158 pure_all :: config pm_to_blib subdirs linkext
1161 subdirs :: $(MYEXTLIB)
1164 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1167 config :: $(INST_ARCHAUTODIR).exists
1170 config :: $(INST_AUTODIR).exists
1175 config :: Version_check
1178 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
1181 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1182 if (%{$self->{MAN1PODS}}) {
1184 config :: $(INST_MAN1DIR).exists
1187 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1189 if (%{$self->{MAN3PODS}}) {
1191 config :: $(INST_MAN3DIR).exists
1194 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1198 $(O_FILES) : $(H_FILES)
1199 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1203 perldoc ExtUtils::MakeMaker
1208 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1209 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1215 =item dlsyms (override)
1217 Create VMS linker options files specifying universal symbols for this
1218 extension's shareable image, and listing other shareable images or
1219 libraries to which it should be linked.
1224 my($self,%attribs) = @_;
1226 return '' unless $self->needs_linking();
1228 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1229 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1230 my($srcdir)= $attribs{PERL_SRC} || $self->{PERL_SRC} || '';
1233 unless ($self->{SKIPHASH}{'dynamic'}) {
1235 dynamic :: rtls.opt $(INST_ARCHAUTODIR)$(BASEEXT).opt
1239 my($popt) = $self->catfile($srcdir,'perlshr.opt');
1240 my($lopt) = $self->catfile($srcdir,'crtl.opt');
1241 push(@m,"# Depend on \$(BASEEXT).opt to insure we copy here *after* autogenerating (wrong) rtls.opt in Mksymlists
1242 rtls.opt : $popt $lopt \$(BASEEXT).opt
1243 Copy/Log $popt Sys\$Disk:[]rtls.opt
1244 Append/Log $lopt Sys\$Disk:[]rtls.opt
1249 # rtls.opt is built in the same step as $(BASEEXT).opt
1250 rtls.opt : $(BASEEXT).opt
1251 $(TOUCH) $(MMS$TARGET)
1257 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1259 ') unless $self->{SKIPHASH}{'static'};
1262 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1263 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1265 $(BASEEXT).opt : Makefile.PL
1266 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1267 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1268 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),')"
1269 $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
1272 if (length $self->{LDLOADLIBS}) {
1273 my($lib); my($line) = '';
1274 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1275 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1276 if (length($line) + length($lib) > 160) {
1277 push @m, "\t\$(PERL) -e \"print qq[$line]\" >>\$(MMS\$TARGET)\n";
1278 $line = $lib . '\n';
1280 else { $line .= $lib . '\n'; }
1282 push @m, "\t\$(PERL) -e \"print qq[$line]\" >>\$(MMS\$TARGET)\n" if $line;
1289 =item dynamic_lib (override)
1291 Use VMS Link command.
1296 my($self, %attribs) = @_;
1297 return '' unless $self->needs_linking(); #might be because of a subdir
1299 return '' unless $self->has_link_code();
1301 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1302 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1306 OTHERLDFLAGS = $otherldflags
1307 INST_DYNAMIC_DEP = $inst_dynamic_dep
1311 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt rtls.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1312 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
1313 $(NOECHO) If F$TrnLNm("PerlShr").eqs."" Then Define/NoLog/User PerlShr Sys$Share:PerlShr.Exe
1314 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,rtls.opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1317 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1321 =item dynamic_bs (override)
1323 Use VMS-style quoting on Mkbootstrap command line.
1328 my($self, %attribs) = @_;
1331 ' unless $self->has_link_code();
1333 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1335 # As MakeMaker mkbootstrap might not write a file (if none is required)
1336 # we use touch to prevent make continually trying to remake it.
1337 # The DynaLoader only reads a non-empty file.
1338 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1339 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1340 $(NOECHO) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1341 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1342 $(NOECHO) $(TOUCH) $(MMS$TARGET)
1344 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1345 $(NOECHO) $(RM_RF) $(INST_BOOT)
1346 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1350 =item static_lib (override)
1352 Use VMS commands to manipulate object library.
1358 return '' unless $self->needs_linking();
1363 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1367 # Rely on suffix rule for update action
1368 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1370 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1372 # If this extension has it's own library (eg SDBM_File)
1373 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1374 push(@m, ' $(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1377 If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)
1378 Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)
1379 $(NOECHO) $(PERL) -e "open F,\'>>$(INST_ARCHAUTODIR)extralibs.ld\';print F qq[$(EXTRALIBS)\n];close F;"
1381 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1386 # sub installpm_x { # called by installpm perl file
1387 # my($self, $dist, $inst, $splitlib) = @_;
1388 # if ($inst =~ m!#!) {
1389 # warn "Warning: MM[SK] would have problems processing this file: $inst, SKIPPED\n";
1392 # $inst = $self->fixpath($inst);
1393 # $dist = $self->fixpath($dist);
1394 # my($instdir) = $inst =~ /([^\)]+\))[^\)]*$/ ? $1 : dirname($inst);
1398 # $inst : $dist \$(MAKEFILE) ${instdir}.exists \$(INST_ARCHAUTODIR).exists
1399 # ",' $(NOECHO) $(RM_F) $(MMS$TARGET)
1400 # $(NOECHO) $(CP) ',"$dist $inst",'
1401 # $(CHMOD) 644 $(MMS$TARGET)
1403 # push(@m, ' $(AUTOSPLITFILE) $(MMS$TARGET) ',
1404 # $self->catdir($splitlib,'auto')."\n\n")
1405 # if ($splitlib and $inst =~ /\.pm$/);
1406 # push(@m,$self->dir_target($instdir));
1411 =item manifypods (override)
1413 Use VMS-style quoting on command line, and VMS logical name
1414 to specify fallback location at build time if we can't find pod2man.
1420 my($self, %attribs) = @_;
1421 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1424 if (defined $self->{PERL_SRC}) {
1425 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1427 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1429 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
1430 # No pod2man but some MAN3PODS to be installed
1433 Warning: I could not locate your pod2man program. As a last choice,
1434 I will look for the file to which the logical name POD2MAN
1435 points when MMK is invoked.
1438 $pod2man_exe = "pod2man";
1442 qq[POD2MAN_EXE = $pod2man_exe\n],
1443 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1444 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1446 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
1447 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1449 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1450 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1451 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1453 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1454 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1455 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1461 =item processPL (override)
1463 Use VMS-style quoting on command line.
1469 return "" unless $self->{PL_FILES};
1471 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1472 my $vmsplfile = vmsify($plfile);
1473 my $vmsfile = vmsify($self->{PL_FILES}->{$plfile});
1478 $vmsfile :: $vmsplfile
1479 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $vmsplfile
1485 =item installbin (override)
1487 Stay under DCL's 255 character command line limit once again by
1488 splitting potentially long list of files across multiple lines
1489 in C<realclean> target.
1495 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1496 return '' unless @{$self->{EXE_FILES}};
1497 my(@m, $from, $to, %fromto, @to, $line);
1498 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1499 for $from (@exefiles) {
1500 my($path) = '$(INST_SCRIPT)' . basename($from);
1501 local($_) = $path; # backward compatibility
1502 $to = $self->libscan($path);
1503 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1504 $fromto{$from} = vmsify($to);
1506 @to = values %fromto;
1508 EXE_FILES = @exefiles
1515 $line = ''; #avoid unitialized var warning
1517 if (length($line) + length($to) > 80) {
1518 push @m, "\t\$(RM_F) $line\n";
1521 else { $line .= " $to"; }
1523 push @m, "\t\$(RM_F) $line\n\n" if $line;
1525 while (($from,$to) = each %fromto) {
1526 last unless defined $from;
1528 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1529 else { ($todir = $to) =~ s/[^\)]+$//; }
1530 $todir = $self->fixpath($todir,1);
1532 $to : $from \$(MAKEFILE) ${todir}.exists
1535 ", $self->dir_target($todir);
1540 =item subdir_x (override)
1542 Use VMS commands to change default directory.
1547 my($self, $subdir) = @_;
1549 $subdir = $self->fixpath($subdir,1);
1553 olddef = F$Environment("Default")
1554 Set Default ',$subdir,'
1555 - $(MMS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1556 Set Default \'olddef\'
1561 =item clean (override)
1563 Split potentially long list of files across multiple commands (in
1564 order to stay under the magic command line limit). Also use MM[SK]
1565 commands for handling subdirectories.
1570 my($self, %attribs) = @_;
1573 # Delete temporary files but do not touch installed files. We don\'t delete
1574 # the Descrip.MMS here so that a later make realclean still has it to use.
1577 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1578 my($vmsdir) = $self->fixpath($dir,1);
1579 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)") Then \\',"\n\t",
1580 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) clean`;"',"\n");
1582 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
1585 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1586 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
1587 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1588 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1590 $line = ''; #avoid unitialized var warning
1591 foreach $file (@otherfiles) {
1592 $file = $self->fixpath($file);
1593 if (length($line) + length($file) > 80) {
1594 push @m, "\t\$(RM_RF) $line\n";
1597 else { $line .= " $file"; }
1599 push @m, "\t\$(RM_RF) $line\n" if $line;
1600 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1604 =item realclean (override)
1606 Guess what we're working around? Also, use MM[SK] for subdirectories.
1611 my($self, %attribs) = @_;
1614 # Delete temporary files (via clean) and also delete installed files
1617 foreach(@{$self->{DIR}}){
1618 my($vmsdir) = $self->fixpath($_,1);
1619 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1620 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) realclean`;"',"\n");
1622 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1624 # We can't expand several of the MMS macros here, since they don't have
1625 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1626 # combination of macros). In order to stay below DCL's 255 char limit,
1627 # we put only 2 on a line.
1628 my($file,$line,$fcnt);
1629 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1630 if ($self->has_link_code) {
1631 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1633 push(@files, values %{$self->{PM}});
1634 $line = ''; #avoid unitialized var warning
1635 foreach $file (@files) {
1636 $file = $self->fixpath($file);
1637 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1638 push @m, "\t\$(RM_F) $line\n";
1642 else { $line .= " $file"; }
1644 push @m, "\t\$(RM_F) $line\n" if $line;
1645 if ($attribs{FILES} && ref $attribs{FILES} eq 'ARRAY') {
1647 foreach $file (@{$attribs{'FILES'}}) {
1648 $file = $self->fixpath($file);
1649 if (length($line) + length($file) > 80) {
1650 push @m, "\t\$(RM_RF) $line\n";
1653 else { $line .= " $file"; }
1655 push @m, "\t\$(RM_RF) $line\n" if $line;
1657 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1661 =item dist_basics (override)
1663 Use VMS-style quoting on command line.
1670 distclean :: realclean distcheck
1674 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1677 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; skipcheck()"
1680 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1684 =item dist_core (override)
1686 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1687 so C<shdist> target actions are VMS-specific.
1694 dist : $(DIST_DEFAULT)
1695 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)'"
1697 zipdist : $(DISTVNAME).zip
1700 $(DISTVNAME).zip : distdir
1702 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) $(SRC)
1703 $(RM_RF) $(DISTVNAME)
1706 $(DISTVNAME).tar$(SUFFIX) : distdir
1709 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar $(SRC)
1710 $(RM_RF) $(DISTVNAME)
1711 $(COMPRESS) $(DISTVNAME).tar
1716 $(SHARE) $(SRC) $(DISTVNAME).share
1717 $(RM_RF) $(DISTVNAME)
1722 =item dist_dir (override)
1724 Use VMS-style quoting on command line.
1732 $(RM_RF) $(DISTVNAME)
1733 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1734 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1738 =item dist_test (override)
1740 Use VMS commands to change default directory, and use VMS-style
1741 quoting on command line.
1749 startdir = F$Environment("Default")
1750 Set Default [.$(DISTVNAME)]
1751 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1754 Set Default 'startdir'
1758 # --- Test and Installation Sections ---
1760 =item install (override)
1762 Work around DCL's 255 character limit several times,and use
1763 VMS-style command line quoting in a few cases.
1768 my($self, %attribs) = @_;
1771 if ($self->{EXE_FILES}) {
1772 my($line,$file) = ('','');
1773 foreach $file (@{$self->{EXE_FILES}}) {
1775 if (length($line) > 128) {
1776 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]);
1780 push(@docfiles,qq[\t\$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
1784 install :: all pure_install doc_install
1787 install_perl :: all pure_perl_install doc_perl_install
1790 install_site :: all pure_site_install doc_site_install
1793 install_ :: install_site
1794 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1796 pure_install :: pure_$(INSTALLDIRS)_install
1799 doc_install :: doc_$(INSTALLDIRS)_install
1800 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
1802 pure__install : pure_site_install
1803 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1805 doc__install : doc_site_install
1806 $(NOECHO} $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1808 # This hack brought to you by DCL's 255-character command line limit
1809 pure_perl_install ::
1810 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1811 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1812 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1813 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1814 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1815 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1816 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1817 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1818 $(MOD_INSTALL) <.MM_tmp
1819 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1820 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1823 pure_site_install ::
1824 $(NOECHO) $(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1825 $(NOECHO) $(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1826 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1827 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1828 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1829 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1830 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1831 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1832 $(MOD_INSTALL) <.MM_tmp
1833 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1834 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1838 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1839 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1840 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1842 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1843 $(NOECHO) $(PERL) -e "print q[print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1844 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1845 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1846 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1847 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1851 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1852 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1853 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1855 q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
1856 $(NOECHO) $(PERL) -e "print q[print '=head3 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
1857 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1858 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
1859 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1860 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
1865 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1868 uninstall_from_perldirs ::
1869 $(NOECHO) $(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1870 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1871 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1872 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1874 uninstall_from_sitedirs ::
1875 $(NOECHO) $(UNINSTALL) ],$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist'),"\n",q[
1876 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1877 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1878 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1884 =item perldepend (override)
1886 Use VMS-style syntax for files; it's cheaper to just do it directly here
1887 than to have the MM_Unix method call C<catfile> repeatedly. Also use
1888 config.vms as source of original config data if the Perl distribution
1889 is available; config.sh is an ancillary file under VMS. Finally, if
1890 we have to rebuild Config.pm, use MM[SK] to do it.
1899 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1900 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1901 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1902 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1903 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1904 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1905 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1907 ' if $self->{OBJECT};
1909 if ($self->{PERL_SRC}) {
1911 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1912 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1913 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1914 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1915 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1916 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1917 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1919 # Check for unpropagated config.sh changes. Should never happen.
1920 # We do NOT just update config.h because that is not sufficient.
1921 # An out of date config.h is not fatal but complains loudly!
1922 #$(PERL_INC)config.h : $(PERL_SRC)config.sh
1923 $(PERL_INC)config.h : $(PERL_VMS)config.vms
1924 $(NOECHO) Write Sys$Error "Warning: $(PERL_INC)config.h out of date with $(PERL_VMS)config.vms"
1926 #$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1927 $(PERL_ARCHLIB)Config.pm : $(PERL_VMS)config.vms $(PERL_VMS)genconfig.pl
1928 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.vms or genconfig.pl"
1929 olddef = F$Environment("Default")
1930 Set Default $(PERL_SRC)
1931 $(MMS)],$mmsquals,q[ $(MMS$TARGET)
1932 Set Default 'olddef'
1936 push(@m, join(" ", map($self->fixpath($_),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1942 =item makefile (override)
1944 Use VMS commands and quoting.
1951 # We do not know what target was originally specified so we
1952 # must force a manual rerun to be sure. But as it should only
1953 # happen very rarely it is not a significant problem.
1955 $(OBJECT) : $(FIRST_MAKEFILE)
1956 ] if $self->{OBJECT};
1959 # We take a very conservative approach here, but it\'s worth it.
1960 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1961 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1962 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1963 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
1964 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1965 - $(MMS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1966 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1967 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1968 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
1974 =item test (override)
1976 Use VMS commands for handling subdirectories.
1981 my($self, %attribs) = @_;
1982 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1986 TEST_TYPE = test_\$(LINKTYPE)
1990 test :: \$(TEST_TYPE)
1993 testdb :: testdb_\$(LINKTYPE)
1997 foreach(@{$self->{DIR}}){
1998 my($vmsdir) = $self->fixpath($_,1);
1999 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
2000 '; print `$(MMS) $(PASTHRU2) test`'."\n");
2002 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
2003 unless $tests or -f "test.pl" or @{$self->{DIR}};
2006 push(@m, "test_dynamic :: pure_all\n");
2007 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
2008 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
2009 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
2012 push(@m, "testdb_dynamic :: pure_all\n");
2013 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
2016 # Occasionally we may face this degenerate target:
2017 push @m, "test_ : test_dynamic\n\n";
2019 if ($self->needs_linking()) {
2020 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
2021 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
2022 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
2024 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2025 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2029 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
2030 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
2036 =item test_via_harness (override)
2038 Use VMS-style quoting on command line.
2042 sub test_via_harness {
2043 my($self,$perl,$tests) = @_;
2044 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
2045 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
2048 =item test_via_script (override)
2050 Use VMS-style quoting on command line.
2054 sub test_via_script {
2055 my($self,$perl,$script) = @_;
2056 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2060 =item makeaperl (override)
2062 Undertake to build a new set of Perl images using VMS commands. Since
2063 VMS does dynamic loading, it's not necessary to statically link each
2064 extension into the Perl image, so this isn't the normal build path.
2065 Consequently, it hasn't really been tested, and may well be incomplete.
2070 my($self, %attribs) = @_;
2071 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2072 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2075 # --- MakeMaker makeaperl section ---
2076 MAP_TARGET = $target
2078 return join '', @m if $self->{PARENT};
2080 my($dir) = join ":", @{$self->{DIR}};
2082 unless ($self->{MAKEAPERL}) {
2084 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2085 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2086 $(NOECHO) $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2087 Makefile.PL DIR=}, $dir, q{ \
2088 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2089 MAKEAPERL=1 NORECURS=1
2091 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2092 $(MMS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2094 push @m, map( " \\\n\t\t$_", @ARGV );
2101 my($linkcmd,@staticopts,@staticpkgs,$extralist,$targdir,$libperldir);
2103 # The front matter of the linkcommand...
2104 $linkcmd = join ' ', $Config{'ld'},
2105 grep($_, @Config{qw(large split ldflags ccdlflags)});
2106 $linkcmd =~ s/\s+/ /g;
2108 # Which *.olb files could we make use of...
2110 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2112 File::Find::find(sub {
2113 return unless m/\Q$self->{LIB_EXT}\E$/;
2114 return if m/^libperl/;
2116 if( exists $self->{INCLUDE_EXT} ){
2121 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2125 # Throw away anything not explicitly marked for inclusion.
2126 # DynaLoader is implied.
2127 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2133 return unless $found;
2135 elsif( exists $self->{EXCLUDE_EXT} ){
2139 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2143 # Throw away anything explicitly marked for exclusion
2144 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2145 return if( $xx eq $excl );
2149 $olbs{$ENV{DEFAULT}} = $_;
2150 }, grep( -d $_, @{$searchdirs || []}));
2152 # We trust that what has been handed in as argument will be buildable
2153 $static = [] unless $static;
2154 @olbs{@{$static}} = (1) x @{$static};
2156 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2157 # Sort the object libraries in inverse order of
2158 # filespec length to try to insure that dependent extensions
2159 # will appear before their parents, so the linker will
2160 # search the parent library to resolve references.
2161 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2162 # references from [.intuit.dwim]dwim.obj can be found
2163 # in [.intuit]intuit.olb).
2164 for (sort keys %olbs) {
2165 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2166 my($dir) = $self->fixpath($_,1);
2167 my($extralibs) = $dir . "extralibs.ld";
2168 my($extopt) = $dir . $olbs{$_};
2169 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2170 if (-f $extralibs ) {
2171 open LIST,$extralibs or warn $!,next;
2172 push @$extra, <LIST>;
2176 open OPT,$extopt or die $!;
2178 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2179 # ExtUtils::Miniperl expects Unix paths
2180 (my($pkg) = "$1_$1$self->{LIB_EXT}") =~ s#_*#/#g;
2181 push @staticpkgs,$pkg;
2183 push @staticopts, $extopt;
2187 $target = "Perl.Exe" unless $target;
2188 ($shrtarget,$targdir) = fileparse($target);
2189 $shrtarget =~ s/^([^.]*)/$1Shr/;
2190 $shrtarget = $targdir . $shrtarget;
2191 $target = "Perlshr.$Config{'dlext'}" unless $target;
2192 $tmp = "[]" unless $tmp;
2193 $tmp = $self->fixpath($tmp,1);
2195 $extralist = join(' ',@$extra);
2196 $extralist =~ s/[,\s\n]+/, /g;
2198 else { $extralist = ''; }
2200 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2201 print STDOUT "Warning: $libperl not found\n";
2206 if (defined $self->{PERL_SRC}) {
2207 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2208 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2210 print STDOUT "Warning: $libperl not found
2211 If you're going to build a static perl binary, make sure perl is installed
2212 otherwise ignore this warning\n";
2215 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2218 # Fill in the target you want to produce if it\'s not perl
2219 MAP_TARGET = ',$self->fixpath($target),'
2220 MAP_SHRTARGET = ',$self->fixpath($shrtarget),"
2221 MAP_LINKCMD = $linkcmd
2222 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '','
2223 # We use the linker options files created with each extension, rather than
2224 #specifying the object files directly on the command line.
2225 MAP_STATIC = ',@staticopts ? join(' ', @staticopts) : '','
2226 MAP_OPTS = ',@staticopts ? ','.join(',', map($_.'/Option', @staticopts)) : '',"
2227 MAP_EXTRA = $extralist
2228 MAP_LIBPERL = ",$self->fixpath($libperl),'
2233 $(MAP_SHRTARGET) : $(MAP_LIBPERL) $(MAP_STATIC) ',"${libperldir}Perlshr_Attr.Opt",'
2234 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_OPTS), $(MAP_EXTRA), $(MAP_LIBPERL) ',"${libperldir}Perlshr_Attr.Opt",'
2235 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2236 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2237 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
2238 $(NOECHO) $(SAY) " $(MMS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2239 $(NOECHO) $(SAY) "To remove the intermediate files, say
2240 $(NOECHO) $(SAY) " $(MMS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2243 ',"${tmp}perlmain.c",' : $(MAKEFILE)
2244 $(NOECHO) $(PERL) $(MAP_PERLINC) -e "use ExtUtils::Miniperl; writemain(qw|',@staticpkgs,'|)" >$(MMS$TARGET)
2248 # More from the 255-char line length limit
2250 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2251 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2252 $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2253 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2254 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2255 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
2259 inst_perl : pure_inst_perl doc_inst_perl
2262 pure_inst_perl : \$(MAP_TARGET)
2263 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2264 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2270 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2271 \$(RM_F) ${tmp}PerlShr.Opt \$(MAP_TARGET)
2277 # --- Output postprocessing section ---
2279 =item nicetext (override)
2281 Insure that colons marking targets are preceded by space, in order
2282 to distinguish the target delimiter from a colon appearing as
2289 my($self,$text) = @_;
2290 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;