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.35 (23-Jun-1996)';
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->{$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 print "fixpath($path) = |$fixedpath|\n" if $Verbose >= 3;
111 Concatenates a list of file specifications, and returns the result as a
112 VMS-syntax directory specification.
117 my($self,@dirs) = @_;
118 my($dir) = pop @dirs;
119 @dirs = grep($_,@dirs);
122 my($path) = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs));
123 my($spath,$sdir) = ($path,$dir);
124 $spath =~ s/.dir$//; $sdir =~ s/.dir$//;
125 $sdir = $self->eliminate_macros($sdir) unless $sdir =~ /^[\w\-]+$/;
126 $rslt = vmspath($self->eliminate_macros($spath)."/$sdir");
128 else { $rslt = vmspath($dir); }
129 print "catdir(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
135 Concatenates a list of file specifications, and returns the result as a
136 VMS-syntax directory specification.
141 my($self,@files) = @_;
142 my($file) = pop @files;
143 @files = grep($_,@files);
146 my($path) = (@files == 1 ? $files[0] : $self->catdir(@files));
149 if ( $spath =~ /^[^\)\]\/:>]+\)$/ && basename($file) eq $file) { $rslt = "$spath$file"; }
151 $rslt = $self->eliminate_macros($spath);
152 $rslt = vmsify($rslt.($rslt ? '/' : '').unixify($file));
155 else { $rslt = vmsify($file); }
156 print "catfile(",join(',',@_[1..$#_]),") = |$rslt|\n" if $Verbose >= 3;
160 =item curdir (override)
162 Returns a string representing of the current directory.
170 =item rootdir (override)
172 Returns a string representing of the root directory.
180 =item updir (override)
182 Returns a string representing of the parent directory.
190 package ExtUtils::MM_VMS;
192 sub ExtUtils::MM_VMS::guess_name;
193 sub ExtUtils::MM_VMS::find_perl;
194 sub ExtUtils::MM_VMS::path;
195 sub ExtUtils::MM_VMS::maybe_command;
196 sub ExtUtils::MM_VMS::maybe_command_in_dirs;
197 sub ExtUtils::MM_VMS::perl_script;
198 sub ExtUtils::MM_VMS::file_name_is_absolute;
199 sub ExtUtils::MM_VMS::replace_manpage_separator;
200 sub ExtUtils::MM_VMS::init_others;
201 sub ExtUtils::MM_VMS::constants;
202 sub ExtUtils::MM_VMS::const_loadlibs;
203 sub ExtUtils::MM_VMS::cflags;
204 sub ExtUtils::MM_VMS::const_cccmd;
205 sub ExtUtils::MM_VMS::pm_to_blib;
206 sub ExtUtils::MM_VMS::tool_autosplit;
207 sub ExtUtils::MM_VMS::tool_xsubpp;
208 sub ExtUtils::MM_VMS::xsubpp_version;
209 sub ExtUtils::MM_VMS::tools_other;
210 sub ExtUtils::MM_VMS::dist;
211 sub ExtUtils::MM_VMS::c_o;
212 sub ExtUtils::MM_VMS::xs_c;
213 sub ExtUtils::MM_VMS::xs_o;
214 sub ExtUtils::MM_VMS::top_targets;
215 sub ExtUtils::MM_VMS::dlsyms;
216 sub ExtUtils::MM_VMS::dynamic_lib;
217 sub ExtUtils::MM_VMS::dynamic_bs;
218 sub ExtUtils::MM_VMS::static_lib;
219 sub ExtUtils::MM_VMS::manifypods;
220 sub ExtUtils::MM_VMS::processPL;
221 sub ExtUtils::MM_VMS::installbin;
222 sub ExtUtils::MM_VMS::subdir_x;
223 sub ExtUtils::MM_VMS::clean;
224 sub ExtUtils::MM_VMS::realclean;
225 sub ExtUtils::MM_VMS::dist_basics;
226 sub ExtUtils::MM_VMS::dist_core;
227 sub ExtUtils::MM_VMS::dist_dir;
228 sub ExtUtils::MM_VMS::dist_test;
229 sub ExtUtils::MM_VMS::install;
230 sub ExtUtils::MM_VMS::perldepend;
231 sub ExtUtils::MM_VMS::makefile;
232 sub ExtUtils::MM_VMS::test;
233 sub ExtUtils::MM_VMS::test_via_harness;
234 sub ExtUtils::MM_VMS::test_via_script;
235 sub ExtUtils::MM_VMS::makeaperl;
236 sub ExtUtils::MM_VMS::ext;
237 sub ExtUtils::MM_VMS::nicetext;
242 if (defined fileno(DATA)) {
243 my $fh = select DATA;
244 my $o = $/; # For future reads from the file.
256 warn "AUTOLOAD called unexpectedly for $AUTOLOAD";
258 defined(&$AUTOLOAD) or die "Myloader inconsistency error";
266 =head2 SelfLoaded methods
268 Those methods which override default MM_Unix methods are marked
269 "(override)", while methods unique to MM_VMS are marked "(specific)".
270 For overridden methods, documentation is limited to an explanation
271 of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
272 documentation for more details.
274 =item guess_name (override)
276 Try to determine name of extension being built. We begin with the name
277 of the current directory. Since VMS filenames are case-insensitive,
278 however, we look for a F<.pm> file whose name matches that of the current
279 directory (presumably the 'main' F<.pm> file for this extension), and try
280 to find a C<package> statement from which to obtain the Mixed::Case
290 $defname = basename(fileify($ENV{'DEFAULT'}));
291 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
293 if (open(PM,"${defpm}.pm")){
295 if (/^\s*package\s+([^;]+)/i) {
300 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
301 "defaulting package name to $defname\n"
306 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
307 "defaulting package name to $defname\n";
309 $defname =~ s#[\d.\-_]+$##;
313 =item find_perl (override)
315 Use VMS file specification syntax and CLI commands to find and
321 my($self, $ver, $names, $dirs, $trace) = @_;
322 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
323 # Check in relative directories first, so we pick up the current
324 # version of Perl if we're running MakeMaker as part of the main build.
325 @sdirs = sort { my($absb) = file_name_is_absolute($a);
326 my($absb) = file_name_is_absolute($b);
327 if ($absa && $absb) { return $a cmp $b }
328 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
330 # Check miniperl before perl, and check names likely to contain
331 # version numbers before "generic" names, so we pick up an
332 # executable that's less likely to be from an old installation.
333 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
334 my($bb) = $b =~ m!([^:>\]/]+)$!;
335 substr($ba,0,1) cmp substr($bb,0,1)
336 or -1*(length($ba) <=> length($bb)) } @$names;
338 print "Looking for perl $ver by these names:\n";
339 print "\t@snames,\n";
340 print "in these dirs:\n";
343 foreach $dir (@sdirs){
344 next unless defined $dir; # $self->{PERL_SRC} may be undefined
345 foreach $name (@snames){
346 if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
347 else { push(@cand,$self->fixpath($name)); }
350 foreach $name (@cand) {
351 print "Checking $name\n" if ($trace >= 2);
352 next unless $vmsfile = $self->maybe_command($name);
353 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
354 print "Executing $vmsfile\n" if ($trace >= 2);
355 if (`MCR $vmsfile -e "require $ver; print ""VER_OK\n"""` =~ /VER_OK/) {
356 print "Using PERL=MCR $vmsfile\n" if $trace;
357 return "MCR $vmsfile"
360 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
361 0; # false and not empty
364 =item path (override)
366 Translate logical name DCL$PATH as a searchlist, rather than trying
367 to C<split> string value of C<$ENV{'PATH'}>.
373 while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); }
377 =item maybe_command (override)
379 Follows VMS naming conventions for executable files.
380 If the name passed in doesn't exactly match an executable file,
381 appends F<.Exe> to check for executable image, and F<.Com> to check
382 for DCL procedure. If this fails, checks F<Sys$Share:> for an
383 executable file having the name specified. Finally, appends F<.Exe>
389 my($self,$file) = @_;
390 return $file if -x $file && ! -d _;
391 return "$file.exe" if -x "$file.exe";
392 return "$file.com" if -x "$file.com";
393 if ($file !~ m![/:>\]]!) {
394 my($shrfile) = 'Sys$Share:' . $file;
395 return $file if -x $shrfile && ! -d _;
396 return "$file.exe" if -x "$shrfile.exe";
401 =item maybe_command_in_dirs (override)
403 Uses DCL argument quoting on test command line.
407 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
408 my($self, $names, $dirs, $trace, $ver) = @_;
410 foreach $dir (@$dirs){
411 next unless defined $dir; # $self->{PERL_SRC} may be undefined
412 foreach $name (@$names){
414 if ($self->file_name_is_absolute($name)) {
417 $abs = $self->catfile($dir, $name);
419 print "Checking $abs for $name\n" if ($trace >= 2);
420 next unless $tryabs = $self->maybe_command($abs);
421 print "Substituting $tryabs instead of $abs\n"
422 if ($trace >= 2 and $tryabs ne $abs);
425 print "Executing $abs\n" if ($trace >= 2);
426 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
427 print "Using PERL=$abs\n" if $trace;
430 } else { # Do not look for perl
437 =item perl_script (override)
439 If name passed in doesn't specify a readable file, appends F<.pl> and
440 tries again, since it's customary to have file types on all files
446 my($self,$file) = @_;
447 return $file if -r $file && ! -d _;
448 return "$file.pl" if -r "$file.pl" && ! -d _;
452 =item file_name_is_absolute (override)
454 Checks for VMS directory spec as well as Unix separators.
458 sub file_name_is_absolute {
460 $file =~ m!^/! or $file =~ m![:<\[][^.\-]!;
463 =item replace_manpage_separator
465 Use as separator a character which is legal in a VMS-syntax file name.
469 sub replace_manpage_separator {
471 $man = unixify($man);
476 =item init_others (override)
478 Provide VMS-specific forms of various utility commands, then hand
479 off to the default MM_Unix method.
486 $self->{NOOP} = "\t@ Continue";
487 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
488 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
489 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
490 $self->{NOECHO} ||= '@ ';
491 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
492 $self->{RM_RF} = '$(PERL) "-I$(PERL_LIB)" -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
493 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
494 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
495 $self->{CP} = 'Copy/NoConfirm';
496 $self->{MV} = 'Rename/NoConfirm';
497 $self->{UMASK_NULL} = "\t!";
498 &ExtUtils::MM_Unix::init_others;
501 =item constants (override)
503 Fixes up numerous file and directory macros to insure VMS syntax
504 regardless of input syntax. Also adds a few VMS-specific macros
505 and makes lists of files comma-separated.
513 if ($self->{DEFINE} ne '') {
514 my(@defs) = split(/\s+/,$self->{DEFINE});
515 foreach $def (@defs) {
518 $def = "\"$def\"" if $def =~ /=/;
520 $self->{DEFINE} = join ',',@defs;
523 if ($self->{OBJECT} =~ /\s/) {
524 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
525 $self->{OBJECT} = map($self->fixpath($_),split(/,?\s+/,$self->{OBJECT}));
527 $self->{LDFROM} = join(' ',map($self->fixpath($_),split(/,?\s+/,$self->{LDFROM})));
529 if ($self->{'INC'} && $self->{INC} !~ m!/Include=!i) {
530 my(@val) = ( '/Include=(' );
531 my(@includes) = split(/\s+/,$self->{INC});
533 foreach (@includes) {
535 push @val,', ' if $plural++;
536 push @val,$self->fixpath($_,1);
538 $self->{INC} = join('',@val,')');
541 # Fix up directory specs
542 $self->{ROOTEXT} = $self->{ROOTEXT} ? $self->fixpath($self->{ROOTEXT},1)
544 foreach $macro ( qw [
545 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INST_EXE INSTALLPRIVLIB
546 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
547 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
548 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
549 SITELIBEXP SITEARCHEXP ] ) {
550 next unless defined $self->{$macro};
551 $self->{$macro} = $self->fixpath($self->{$macro},1);
553 $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC},q(VMS))
554 if ($self->{PERL_SRC});
559 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
560 next unless defined $self->{$macro};
561 $self->{$macro} = $self->fixpath($self->{$macro});
565 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
566 INST_BIN INST_EXE INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
567 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
568 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
569 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
570 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
571 PERL_INC PERL FULLPERL
573 next unless defined $self->{$macro};
574 push @m, "$macro = $self->{$macro}\n";
579 VERSION_MACRO = VERSION
580 DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
581 XS_VERSION_MACRO = XS_VERSION
582 XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
584 MAKEMAKER = ],$self->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
585 MM_VERSION = $ExtUtils::MakeMaker::VERSION
586 MM_REVISION = $ExtUtils::MakeMaker::Revision
587 MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
589 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
590 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
591 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
592 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
596 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
599 next unless defined $self->{$tmp};
600 push @m, "$tmp = $self->{$tmp}\n";
603 for $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
604 next unless defined $self->{$tmp};
606 for $key (keys %{$self->{$tmp}}) {
607 $tmp{$self->fixpath($key)} = $self->fixpath($self->{$tmp}{$key});
609 $self->{$tmp} = \%tmp;
612 for $tmp (qw/ C O_FILES H /) {
613 next unless defined $self->{$tmp};
615 for $val (@{$self->{$tmp}}) {
616 push(@tmp,$self->fixpath($val));
618 $self->{$tmp} = \@tmp;
623 # Handy lists of source code files:
624 XS_FILES = ',join(', ', sort keys %{$self->{XS}}),'
625 C_FILES = ',join(', ', @{$self->{C}}),'
626 O_FILES = ',join(', ', @{$self->{O_FILES}} ),'
627 H_FILES = ',join(', ', @{$self->{H}}),'
628 MAN1PODS = ',join(', ', sort keys %{$self->{MAN1PODS}}),'
629 MAN3PODS = ',join(', ', sort keys %{$self->{MAN3PODS}}),'
634 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
636 next unless defined $self->{$tmp};
637 push @m, "$tmp = $self->{$tmp}\n";
641 .SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
643 # Here is the Config.pm that we are using/depend on
644 CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
646 # Where to put things:
647 INST_LIBDIR = ",($self->{'INST_LIBDIR'} = $self->catdir($self->{INST_LIB},$self->{ROOTEXT})),"
648 INST_ARCHLIBDIR = ",($self->{'INST_ARCHLIBDIR'} = $self->catdir($self->{INST_ARCHLIB},$self->{ROOTEXT})),"
650 INST_AUTODIR = ",($self->{'INST_AUTODIR'} = $self->catdir($self->{INST_LIB},'auto',$self->{FULLEXT})),'
651 INST_ARCHAUTODIR = ',($self->{'INST_ARCHAUTODIR'} = $self->catdir($self->{INST_ARCHLIB},'auto',$self->{FULLEXT})),'
654 if ($self->has_link_code()) {
656 INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
657 INST_DYNAMIC = $(INST_ARCHAUTODIR)$(BASEEXT).$(DLEXT)
658 INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
665 EXPORT_LIST = $(BASEEXT).opt
666 PERL_ARCHIVE = ',($ENV{'PERLSHR'} ? $ENV{'PERLSHR'} : 'Sys$Share:PerlShr.Exe'),'
670 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
671 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
673 TO_INST_PM = ',join(', ',@{$self->{TO_INST_PM}}),'
675 PM_TO_BLIB = ',join(', ',@{$self->{PM_TO_BLIB}}),'
681 =item const_loadlibs (override)
683 Basically a stub which passes through library specfications provided
684 by the caller. Will be updated or removed when VMS support is added
685 to ExtUtils::Liblist.
693 # $self->{NAME} might depend on some other libraries.
694 # (These comments may need revising:)
696 # Dependent libraries can be linked in one of three ways:
698 # 1. (For static extensions) by the ld command when the perl binary
699 # is linked with the extension library. See EXTRALIBS below.
701 # 2. (For dynamic extensions) by the ld command when the shared
702 # object is built/linked. See LDLOADLIBS below.
704 # 3. (For dynamic extensions) by the DynaLoader when the shared
705 # object is loaded. See BSLOADLIBS below.
707 # EXTRALIBS = List of libraries that need to be linked with when
708 # linking a perl binary which includes this extension
709 # Only those libraries that actually exist are included.
710 # These are written to a file and used when linking perl.
712 # LDLOADLIBS = List of those libraries which can or must be linked into
713 # the shared library when created using ld. These may be
714 # static or dynamic libraries.
715 # LD_RUN_PATH is a colon separated list of the directories
716 # in LDLOADLIBS. It is passed as an environment variable to
717 # the process that links the shared library.
719 # BSLOADLIBS = List of those libraries that are needed but can be
720 # linked in dynamically at run time on this platform.
721 # SunOS/Solaris does not need this because ld records
722 # the information (from LDLOADLIBS) into the object file.
723 # This list is used to create a .bs (bootstrap) file.
725 EXTRALIBS = ",map($self->fixpath($_) . ' ',$self->{'EXTRALIBS'}),"
726 BSLOADLIBS = ",map($self->fixpath($_) . ' ',$self->{'BSLOADLIBS'}),"
727 LDLOADLIBS = ",map($self->fixpath($_) . ' ',$self->{'LDLOADLIBS'}),"\n";
732 =item cflags (override)
734 Bypass shell script and produce qualifiers for CC directly (but warn
735 user if a shell script for this extension exists). Fold multiple
736 /Defines into one, and do the same with /Includes, since some C
737 compilers pay attention to only one instance of these qualifiers
743 my($self,$libperl) = @_;
744 my($quals) = $Config{'ccflags'};
746 my($optimize) = '/Optimize';
748 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
749 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
750 " required to modify CC command for $self->{'BASEEXT'}\n"
753 # Deal with $self->{DEFINE} here since some C compilers pay attention
754 # to only one /Define clause on command line, so we have to
755 # conflate the ones from $Config{'cc'} and $self->{DEFINE}
756 if ($quals =~ m:(.*)/define=\(?([^\(\/\)\s]+)\)?(.*)?:i) {
757 $quals = "$1/Define=($2," . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
758 "\$(DEFINE_VERSION),\$(XS_DEFINE_VERSION))$3";
761 $quals .= '/Define=(' . ($self->{DEFINE} ? "$self->{DEFINE}," : '') .
762 '$(DEFINE_VERSION),$(XS_DEFINE_VERSION))';
765 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
766 if ($libperl =~ /libperl(\w+)\./i) {
768 my(%map) = ( 'D' => 'DEBUGGING', 'E' => 'EMBED', 'M' => 'MULTIPLICITY',
769 'DE' => 'DEBUGGING,EMBED', 'DM' => 'DEBUGGING,MULTIPLICITY',
770 'EM' => 'EMBED,MULTIPLICITY', 'DEM' => 'DEBUGGING,EMBED,MULTIPLICITY' );
771 $quals =~ s:/define=\(([^\)]+)\):/Define=($1,$map{$type}):i
774 # Likewise with $self->{INC} and /Include
775 my($incstr) = '/Include=($(PERL_INC)';
776 if ($self->{'INC'}) {
777 my(@includes) = split(/\s+/,$self->{INC});
778 foreach (@includes) {
780 $incstr .= ', '.$self->fixpath($_,1);
783 if ($quals =~ m:(.*)/include=\(?([^\(\/\)\s]+)\)?(.*):i) {
784 $quals = "$1$incstr,$2)$3";
786 else { $quals .= "$incstr)"; }
788 $optimize = '/Debug/NoOptimize'
789 if ($self->{OPTIMIZE} =~ /-g/ or $self->{OPTIMIZE} =~ m!/Debug!i);
791 return $self->{CFLAGS} = qq{
800 =item const_cccmd (override)
802 Adds directives to point C preprocessor to the right place when
803 handling #include <sys/foo.h> directives. Also constructs CC
804 command line a bit differently than MM_Unix method.
809 my($self,$libperl) = @_;
812 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
813 return '' unless $self->needs_linking();
814 if ($Config{'vms_cc_type'} eq 'gcc') {
817 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
819 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
822 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
823 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
828 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
829 ($Config{'arch'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
830 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
833 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
835 $self->{CONST_CCCMD} = join('',@m);
838 =item pm_to_blib (override)
840 DCL I<still> accepts a maximum of 255 characters on a command
841 line, so we write the (potentially) long list of file names
842 to a temp file, then persuade Perl to read it instead of the
843 command line to find args.
849 my($line,$from,$to,@m);
850 my($autodir) = $self->catdir('$(INST_LIB)','auto');
851 my(@files) = @{$self->{PM_TO_BLIB}};
854 # As always, keep under DCL's 255-char limit
855 pm_to_blib : $(TO_INST_PM)
856 },$self->{NOECHO},q{$(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
859 $line = ''; # avoid uninitialized var warning
860 while ($from = shift(@files),$to = shift(@files)) {
861 $line .= " $from $to";
862 if (length($line) > 128) {
863 push(@m,"\t$self->{NOECHO}\$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
867 push(@m,"\t$self->{NOECHO}\$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
869 push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
871 $self->{NOECHO}Delete/NoLog/NoConfirm .MM_tmp;
872 $self->{NOECHO}\$(TOUCH) pm_to_blib.ts
878 =item tool_autosplit (override)
880 Use VMS-style quoting on command line.
885 my($self, %attribs) = @_;
887 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
889 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
890 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use AutoSplit;}.$asl.q{ AutoSplit::autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
894 =item tool_sxubpp (override)
896 Use VMS-style quoting on xsubpp command line.
902 return '' unless $self->needs_linking;
903 my($xsdir) = $self->catdir($self->{PERL_LIB},'ExtUtils');
904 # drop back to old location if xsubpp is not in new location yet
905 $xsdir = $self->catdir($self->{PERL_SRC},'ext') unless (-f $self->catfile($xsdir,'xsubpp'));
906 my(@tmdeps) = '$(XSUBPPDIR)typemap';
907 if( $self->{TYPEMAPS} ){
909 foreach $typemap (@{$self->{TYPEMAPS}}){
911 warn "Typemap $typemap not found.\n";
914 push(@tmdeps, $self->fixpath($typemap));
918 push(@tmdeps, "typemap") if -f "typemap";
919 my(@tmargs) = map("-typemap $_", @tmdeps);
920 if( exists $self->{XSOPT} ){
921 unshift( @tmargs, $self->{XSOPT} );
924 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,'xsubpp'));
926 # What are the correct thresholds for version 1 && 2 Paul?
927 if ( $xsubpp_version > 1.923 ){
928 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
930 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
931 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
932 Your version of xsubpp is $xsubpp_version and cannot handle this.
933 Please upgrade to a more recent version of xsubpp.
936 $self->{XSPROTOARG} = "";
942 XSUBPP = \$(PERL) \"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" \$(XSUBPPDIR)xsubpp
943 XSPROTOARG = $self->{XSPROTOARG}
949 =item xsubpp_version (override)
951 Test xsubpp exit status according to VMS rules ($sts & 1 ==> good)
952 rather than Unix rules ($sts == 0 ==> good).
958 my($self,$xsubpp) = @_;
960 return '' unless $self->needs_linking;
962 # try to figure out the version number of the xsubpp on the system
964 # first try the -v flag, introduced in 1.921 & 2.000a2
966 my $command = "$self->{PERL} \"-I$self->{PERL_LIB}\" $xsubpp -v";
967 print "Running: $command\n" if $Verbose;
968 $version = `$command` ;
969 warn "Running '$command' exits with status " . $? unless ($? & 1);
972 return $1 if $version =~ /^xsubpp version (.*)/ ;
974 # nope, then try something else
977 my ($file) = 'temp' ;
978 $counter++ while -e "$file$counter"; # don't overwrite anything
982 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
984 MODULE = fred PACKAGE = fred
993 $command = "$self->{PERL} $xsubpp $file";
994 print "Running: $command\n" if $Verbose;
995 my $text = `$command` ;
996 warn "Running '$command' exits with status " . $? unless ($? & 1);
999 # gets 1.2 -> 1.92 and 2.000a1
1000 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
1002 # it is either 1.0 or 1.1
1003 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
1005 # none of the above, so 1.0
1009 =item tools_other (override)
1011 Adds a few MM[SK] macros, and shortens some the installatin commands,
1012 in order to stay under DCL's 255-character limit. Also changes
1013 EQUALIZE_TIMESTAMP to set revision date of target file to one second
1014 later than source file, since MMK interprets precisely equal revision
1015 dates for a source and target file as a sign that the target needs
1023 # Assumes \$(MMS) invokes MMS or MMK
1024 # (It is assumed in some cases later that the default makefile name
1025 # (Descrip.MMS for MM[SK]) is used.)
1026 USEMAKEFILE = /Descrip=
1027 USEMACROS = /Macro=(
1029 MAKEFILE = Descrip.MMS
1031 TOUCH = $self->{TOUCH}
1032 CHMOD = $self->{CHMOD}
1035 RM_F = $self->{RM_F}
1036 RM_RF = $self->{RM_RF}
1037 UMASK_NULL = $self->{UMASK_NULL}
1038 NOOP = $self->{NOOP}
1039 MKPATH = Create/Directory
1040 EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
1041 !. ($self->{PARENT} ? '' :
1042 qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
1043 MOD_INSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
1044 DOC_INSTALL = \$(PERL) -e "\@ARGV=split('|',<STDIN>);print '=head3 ',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]"
1045 UNINSTALL = \$(PERL) "-I\$(PERL_LIB)" "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1);"
1049 =item dist (override)
1051 Provide VMSish defaults for some values, then hand off to
1052 default MM_Unix method.
1057 my($self, %attribs) = @_;
1058 $attribs{VERSION} ||= $self->{VERSION_SYM};
1059 $attribs{ZIPFLAGS} ||= '-Vu';
1060 $attribs{COMPRESS} ||= 'gzip';
1061 $attribs{SUFFIX} ||= '-gz';
1062 $attribs{SHAR} ||= 'vms_share';
1063 $attribs{DIST_DEFAULT} ||= 'zipdist';
1065 return ExtUtils::MM_Unix::dist($self,%attribs);
1068 =item c_o (override)
1070 Use VMS syntax on command line. In particular, $(DEFINE) and
1071 $(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
1077 return '' unless $self->needs_linking();
1080 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1083 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
1086 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1091 =item xs_c (override)
1099 return '' unless $self->needs_linking();
1102 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1106 =item xs_o (override)
1108 Use MM[SK] macros, and VMS command line for C compiler.
1112 sub xs_o { # many makes are too dumb to use xs_c then c_o
1114 return '' unless $self->needs_linking();
1117 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1118 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1122 =item top_targets (override)
1124 Use VMS quoting on command line for Version_check.
1132 all :: pure_all manifypods
1135 pure_all :: config pm_to_blib subdirs linkext
1138 subdirs :: $(MYEXTLIB)
1141 config :: $(MAKEFILE) $(INST_LIBDIR).exists
1144 config :: $(INST_ARCHAUTODIR).exists
1147 config :: $(INST_AUTODIR).exists
1152 config :: Version_check
1155 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
1158 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1159 if (%{$self->{MAN1PODS}}) {
1161 config :: $(INST_MAN1DIR).exists
1164 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1166 if (%{$self->{MAN3PODS}}) {
1168 config :: $(INST_MAN3DIR).exists
1171 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1175 $(O_FILES) : $(H_FILES)
1176 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1180 perldoc ExtUtils::MakeMaker
1185 },$self->{NOECHO},q{$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1186 "-MExtUtils::MakeMaker=Version_check" -e "&Version_check('$(MM_VERSION)')"
1192 =item dlsyms (override)
1194 Create VMS linker options files specifying universal symbols for this
1195 extension's shareable image, and listing other shareable images or
1196 libraries to which it should be linked.
1201 my($self,%attribs) = @_;
1203 return '' unless $self->needs_linking();
1205 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
1206 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
1207 my($srcdir)= $attribs{PERL_SRC} || $self->{PERL_SRC} || '';
1210 unless ($self->{SKIPHASH}{'dynamic'}) {
1212 dynamic :: rtls.opt $(INST_ARCHAUTODIR)$(BASEEXT).opt
1216 my($popt) = $self->catfile($srcdir,'perlshr.opt');
1217 my($lopt) = $self->catfile($srcdir,'crtl.opt');
1218 push(@m,"# Depend on $(BASEEXT).opt to insure we copy here *after* autogenerating (wrong) rtls.opt in Mksymlists
1219 rtls.opt : $popt $lopt \$(BASEEXT).opt
1220 Copy/Log $popt Sys\$Disk:[]rtls.opt
1221 Append/Log $lopt Sys\$Disk:[]rtls.opt
1226 # rtls.opt is built in the same step as $(BASEEXT).opt
1227 rtls.opt : $(BASEEXT).opt
1228 $(TOUCH) $(MMS$TARGET)
1234 static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
1236 ') unless $self->{SKIPHASH}{'static'};
1239 $(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1240 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
1242 $(BASEEXT).opt : Makefile.PL
1243 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Mksymlists;" -
1244 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
1245 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),')"
1246 $(PERL) -e "print ""$(INST_STATIC)/Include=$(BASEEXT)\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)
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} || "";
1269 OTHERLDFLAGS = $otherldflags
1270 INST_DYNAMIC_DEP = $inst_dynamic_dep
1274 $(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt rtls.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1275 ',$self->{NOECHO},'$(MKPATH) $(INST_ARCHAUTODIR)
1276 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,rtls.opt/Option,$(PERL_INC)perlshr_attr.opt/Option
1279 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1283 =item dynamic_bs (override)
1285 Use VMS-style quoting on Mkbootstrap command line.
1290 my($self, %attribs) = @_;
1293 ' unless $self->has_link_code();
1295 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1297 # As MakeMaker mkbootstrap might not write a file (if none is required)
1298 # we use touch to prevent make continually trying to remake it.
1299 # The DynaLoader only reads a non-empty file.
1300 $(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
1301 '.$self->{NOECHO}.'Write Sys$Output "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1302 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -
1303 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1304 '.$self->{NOECHO}.' $(TOUCH) $(MMS$TARGET)
1306 $(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
1307 '.$self->{NOECHO}.'$(RM_RF) $(INST_BOOT)
1308 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
1312 =item static_lib (override)
1314 Use VMS commands to manipulate object library.
1320 return '' unless $self->needs_linking();
1325 ' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1329 # Rely on suffix rule for update action
1330 $(OBJECT) : $(INST_ARCHAUTODIR).exists
1332 $(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1334 # If this extension has it's own library (eg SDBM_File)
1335 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1336 push(@m, ' $(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1339 If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)
1340 Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)
1341 ',$self->{NOECHO},'$(PERL) -e "open F,\'>>$(INST_ARCHAUTODIR)extralibs.ld\';print F qq[$(EXTRALIBS)\n];close F;"
1343 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1348 # sub installpm_x { # called by installpm perl file
1349 # my($self, $dist, $inst, $splitlib) = @_;
1350 # if ($inst =~ m!#!) {
1351 # warn "Warning: MM[SK] would have problems processing this file: $inst, SKIPPED\n";
1354 # $inst = $self->fixpath($inst);
1355 # $dist = $self->fixpath($dist);
1356 # my($instdir) = $inst =~ /([^\)]+\))[^\)]*$/ ? $1 : dirname($inst);
1360 # $inst : $dist \$(MAKEFILE) ${instdir}.exists \$(INST_ARCHAUTODIR).exists
1361 # ",' ',$self->{NOECHO},'$(RM_F) $(MMS$TARGET)
1362 # ',$self->{NOECHO},'$(CP) ',"$dist $inst",'
1363 # $(CHMOD) 644 $(MMS$TARGET)
1365 # push(@m, ' $(AUTOSPLITFILE) $(MMS$TARGET) ',
1366 # $self->catdir($splitlib,'auto')."\n\n")
1367 # if ($splitlib and $inst =~ /\.pm$/);
1368 # push(@m,$self->dir_target($instdir));
1373 =item manifypods (override)
1375 Use VMS-style quoting on command line, and VMS logical name
1376 to specify fallback location at build time if we can't find pod2man.
1382 my($self, %attribs) = @_;
1383 return "\nmanifypods :\n\t\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1386 if (defined $self->{PERL_SRC}) {
1387 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
1389 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1391 if ($pod2man_exe = $self->perl_script($pod2man_exe)) { $found_pod2man = 1; }
1393 # No pod2man but some MAN3PODS to be installed
1396 Warning: I could not locate your pod2man program. As a last choice,
1397 I will look for the file to which the logical name POD2MAN
1398 points when MMK is invoked.
1401 $pod2man_exe = "pod2man";
1405 qq[POD2MAN_EXE = $pod2man_exe\n],
1406 q[POD2MAN = $(PERL) -we "%m=@ARGV;for (keys %m){" -
1407 -e "system(""MCR $^X $(POD2MAN_EXE) $_ >$m{$_}"");}"
1409 push @m, "\nmanifypods : ";
1410 push @m, join " ", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
1412 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1414 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1415 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1416 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1418 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1419 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1420 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1426 =item processPL (override)
1428 Use VMS-style quoting on command line.
1434 return "" unless $self->{PL_FILES};
1436 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
1438 all :: $self->{PL_FILES}->{$plfile}
1441 $self->{PL_FILES}->{$plfile} :: $plfile
1442 ",' $(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '," $plfile
1448 =item installbin (override)
1450 Stay under DCL's 255 character command line limit once again by
1451 splitting potentially long list of files across multiple lines
1452 in C<realclean> target.
1458 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1459 return '' unless @{$self->{EXE_FILES}};
1460 my(@m, $from, $to, %fromto, @to, $line);
1461 for $from (@{$self->{EXE_FILES}}) {
1462 my($path) = '$(INST_SCRIPT)' . basename($from);
1463 local($_) = $path; # backward compatibility
1464 $to = $self->libscan($path);
1465 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1468 @to = values %fromto;
1470 EXE_FILES = @{$self->{EXE_FILES}}
1477 $line = ''; #avoid unitialized var warning
1479 if (length($line) + length($to) > 80) {
1480 push @m, "\t\$(RM_F) $line\n";
1483 else { $line .= " $to"; }
1485 push @m, "\t\$(RM_F) $line\n\n" if $line;
1487 while (($from,$to) = each %fromto) {
1488 last unless defined $from;
1490 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1491 else { ($todir = $to) =~ s/[^\)]+$//; }
1492 $todir = $self->fixpath($todir,1);
1494 $to : $from \$(MAKEFILE) ${todir}.exists
1497 ", $self->dir_target($todir);
1502 =item subdir_x (override)
1504 Use VMS commands to change default directory.
1509 my($self, $subdir) = @_;
1511 $subdir = $self->fixpath($subdir,1);
1515 olddef = F$Environment("Default")
1516 Set Default ',$subdir,'
1517 - $(MMS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
1518 Set Default \'olddef\'
1523 =item clean (override)
1525 Split potentially long list of files across multiple commands (in
1526 order to stay under the magic command line limit). Also use MM[SK]
1527 commands for handling subdirectories.
1532 my($self, %attribs) = @_;
1535 # Delete temporary files but do not touch installed files. We don\'t delete
1536 # the Descrip.MMS here so that a later make realclean still has it to use.
1539 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1540 my($vmsdir) = $self->fixpath($dir,1);
1541 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)") Then \\',"\n\t",
1542 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) clean`;"',"\n");
1544 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso
1547 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
1548 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
1549 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
1550 push(@otherfiles,$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
1552 $line = ''; #avoid unitialized var warning
1553 foreach $file (@otherfiles) {
1554 $file = $self->fixpath($file);
1555 if (length($line) + length($file) > 80) {
1556 push @m, "\t\$(RM_RF) $line\n";
1559 else { $line .= " $file"; }
1561 push @m, "\t\$(RM_RF) $line\n" if line;
1562 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1566 =item realclean (override)
1568 Guess what we're working around? Also, use MM[SK] for subdirectories.
1573 my($self, %attribs) = @_;
1576 # Delete temporary files (via clean) and also delete installed files
1579 foreach(@{$self->{DIR}}){
1580 my($vmsdir) = $self->fixpath($_,1);
1581 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
1582 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS) realclean`;"',"\n");
1584 push @m,' $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
1586 # We can't expand several of the MMS macros here, since they don't have
1587 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1588 # combination of macros). In order to stay below DCL's 255 char limit,
1589 # we put only 2 on a line.
1590 my($file,$line,$fcnt);
1591 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1592 if ($self->has_link_code) {
1593 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1595 push(@files, values %{$self->{PM}});
1596 $line = ''; #avoid unitialized var warning
1597 foreach $file (@files) {
1598 $file = $self->fixpath($file);
1599 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1600 push @m, "\t\$(RM_F) $line\n";
1604 else { $line .= " $file"; }
1606 push @m, "\t\$(RM_F) $line\n" if $line;
1607 if ($attribs{FILES} && ref $attribs{FILES} eq 'ARRAY') {
1609 foreach $file (@{$attribs{'FILES'}}) {
1610 $file = $self->fixpath($file);
1611 if (length($line) + length($file) > 80) {
1612 push @m, "\t\$(RM_RF) $line\n";
1615 else { $line .= " $file"; }
1617 push @m, "\t\$(RM_RF) $line\n" if $line;
1619 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1623 =item dist_basics (override)
1625 Use VMS-style quoting on command line.
1632 distclean :: realclean distcheck
1636 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; fullcheck()"
1639 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&fullcheck\'; skipcheck()"
1642 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest \'&mkmanifest\'; mkmanifest()"
1646 =item dist_core (override)
1648 Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1649 so C<shdist> target actions are VMS-specific.
1656 dist : $(DIST_DEFAULT)
1657 ].$self->{NOECHO}.q[$(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)'"
1659 zipdist : $(DISTVNAME).zip
1662 $(DISTVNAME).zip : distdir
1664 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) $(SRC)
1665 $(RM_RF) $(DISTVNAME)
1668 $(DISTVNAME).tar$(SUFFIX) : distdir
1671 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar $(SRC)
1672 $(RM_RF) $(DISTVNAME)
1673 $(COMPRESS) $(DISTVNAME).tar
1678 $(SHARE) $(SRC) $(DISTVNAME).share
1679 $(RM_RF) $(DISTVNAME)
1684 =item dist_dir (override)
1686 Use VMS-style quoting on command line.
1694 $(RM_RF) $(DISTVNAME)
1695 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e "use ExtUtils::Manifest '/mani/';" \\
1696 -e "manicopy(maniread(),'$(DISTVNAME)','$(DIST_CP)');"
1700 =item dist_test (override)
1702 Use VMS commands to change default directory, and use VMS-style
1703 quoting on command line.
1711 startdir = F$Environment("Default")
1712 Set Default [.$(DISTVNAME)]
1713 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL
1716 Set Default 'startdir'
1720 # --- Test and Installation Sections ---
1722 =item install (override)
1724 Work around DCL's 255 character limit several times,and use
1725 VMS-style command line quoting in a few cases.
1730 my($self, %attribs) = @_;
1733 if ($self->{EXE_FILES}) {
1734 my($line,$file) = ('','');
1735 foreach $file (@{$self->{EXE_FILES}}) {
1737 if (length($line) > 128) {
1738 push(@docfiles,qq[\t\$(PERL) -e "print $line" >>.MM_tmp\n]);
1742 push(@docfiles,qq[\t\$(PERL) -e "print $line" >>.MM_tmp\n]) if $line;
1746 install :: all pure_install doc_install
1749 install_perl :: all pure_perl_install doc_perl_install
1752 install_site :: all pure_site_install doc_site_install
1755 install_ :: install_site
1756 ],$self->{NOECHO},q[Write Sys$Output "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1758 pure_install :: pure_$(INSTALLDIRS)_install
1761 doc_install :: doc_$(INSTALLDIRS)_install
1762 ],$self->{NOECHO},q[Write Sys$Output "Appending installation info to $(INST_ARCHLIB)perllocal.pod"
1764 pure__install : pure_site_install
1765 ],$self->{NOECHO},q[Write Sys$Output "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1767 doc__install : doc_site_install
1768 ],$self->{NOECHO},q[Write Sys$Output "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
1770 # This hack brought to you by DCL's 255-character command line limit
1771 pure_perl_install ::
1772 ].$self->{NOECHO}.q[$(PERL) -e "print 'read ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1773 ].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1774 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1775 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1776 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1777 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1778 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1779 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1780 $(MOD_INSTALL) <.MM_tmp
1781 ].$self->{NOECHO}.q[Delete/NoLog/NoConfirm .MM_tmp;
1782 ].$self->{NOECHO}.q[$(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[
1785 pure_site_install ::
1786 ].$self->{NOECHO}.q[$(PERL) -e "print 'read ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q[ '" >.MM_tmp
1787 ].$self->{NOECHO}.q[$(PERL) -e "print 'write ].$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q[ '" >>.MM_tmp
1788 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1789 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1790 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1791 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1792 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1793 ].$self->{NOECHO}.q[$(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
1794 $(MOD_INSTALL) <.MM_tmp
1795 ].$self->{NOECHO}.q[Delete/NoLog/NoConfirm .MM_tmp;
1796 ].$self->{NOECHO}.q[$(WARN_IF_OLD_PACKLIST) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1800 ].$self->{NOECHO}.q[$(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
1801 ].$self->{NOECHO}.q[$(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1802 ].$self->{NOECHO}.q[$(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1803 ],@docfiles,q[ $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1804 ].$self->{NOECHO}.q[Delete/NoLog/NoConfirm .MM_tmp;
1808 ].$self->{NOECHO}.q[$(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
1809 ].$self->{NOECHO}.q[$(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|'" >>.MM_tmp
1810 ].$self->{NOECHO}.q[$(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|'" >>.MM_tmp
1811 ],@docfiles,q[ $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
1812 ].$self->{NOECHO}.q[Delete/NoLog/NoConfirm .MM_tmp;
1817 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1820 uninstall_from_perldirs ::
1821 ].$self->{NOECHO}.q[$(UNINSTALL) ].$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q[
1823 uninstall_from_sitedirs ::
1824 ].$self->{NOECHO}.q[$(UNINSTALL) ].$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist')."\n";
1829 =item perldepend (override)
1831 Use VMS-style syntax for files; it's cheaper to just do it directly here
1832 than to have the MM_Unix method call C<catfile> repeatedly. Also use
1833 config.vms as source of original config data if the Perl distribution
1834 is available; config.sh is an ancillary file under VMS. Finally, if
1835 we have to rebuild Config.pm, use MM[SK] to do it.
1844 $(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h, $(PERL_INC)av.h
1845 $(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h, $(PERL_INC)form.h
1846 $(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h, $(PERL_INC)keywords.h
1847 $(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)op.h, $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
1848 $(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)proto.h
1849 $(OBJECT) : $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1850 $(OBJECT) : $(PERL_INC)vmsish.h, $(PERL_INC)util.h, $(PERL_INC)config.h
1852 ' if $self->{OBJECT};
1854 if ($self->{PERL_SRC}) {
1856 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
1857 push(@macros,'__AXP__=1') if $Config{'arch'} eq 'VMS_AXP';
1858 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1859 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1860 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1861 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1862 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1864 # Check for unpropagated config.sh changes. Should never happen.
1865 # We do NOT just update config.h because that is not sufficient.
1866 # An out of date config.h is not fatal but complains loudly!
1867 #$(PERL_INC)config.h : $(PERL_SRC)config.sh
1868 $(PERL_INC)config.h : $(PERL_VMS)config.vms
1869 ],$self->{NOECHO},q[Write Sys$Error "Warning: $(PERL_INC)config.h out of date with $(PERL_VMS)config.vms"
1871 #$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1872 $(PERL_ARCHLIB)Config.pm : $(PERL_VMS)config.vms $(PERL_VMS)genconfig.pl
1873 ],$self->{NOECHO},q[Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.vms or genconfig.pl"
1874 olddef = F$Environment("Default")
1875 Set Default $(PERL_SRC)
1876 $(MMS)],$mmsquals,q[ $(MMS$TARGET)
1877 Set Default 'olddef'
1881 push(@m, join(" ", map($self->fixpath($_),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
1887 =item makefile (override)
1889 Use VMS commands and quoting.
1896 # We do not know what target was originally specified so we
1897 # must force a manual rerun to be sure. But as it should only
1898 # happen very rarely it is not a significant problem.
1900 $(OBJECT) : $(FIRST_MAKEFILE)
1901 ] if $self->{OBJECT};
1904 # We take a very conservative approach here, but it\'s worth it.
1905 # We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1906 $(MAKEFILE) : Makefile.PL $(CONFIGDEP)
1907 ],$self->{NOECHO},q[Write Sys$Output "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1908 ],$self->{NOECHO},q[Write Sys$Output "Cleaning current config before rebuilding $(MAKEFILE) ..."
1909 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
1910 - $(MMS) $(USEMAKEFILE)$(MAKEFILE)_old clean
1911 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
1912 ],$self->{NOECHO},q[Write Sys$Output "$(MAKEFILE) has been rebuilt."
1913 ],$self->{NOECHO},q[Write Sys$Output "Please run $(MMS) to build the extension."
1919 =item test (override)
1921 Use VMS commands for handling subdirectories.
1926 my($self, %attribs) = @_;
1927 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1931 TEST_TYPE = test_\$(LINKTYPE)
1935 test :: \$(TEST_TYPE)
1938 testdb :: testdb_\$(LINKTYPE)
1942 foreach(@{$self->{DIR}}){
1943 my($vmsdir) = $self->fixpath($_,1);
1944 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
1945 '; print `$(MMS) $(PASTHRU2) test`'."\n");
1947 push(@m, "\t$self->{NOECHO}Write Sys\$Output \"No tests defined for \$(NAME) extension.\"\n")
1948 unless $tests or -f "test.pl" or @{$self->{DIR}};
1951 push(@m, "test_dynamic :: pure_all\n");
1952 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
1953 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
1954 push(@m, " \$(NOOP)\n") if (!$tests && ! -f "test.pl");
1957 push(@m, "testdb_dynamic :: pure_all\n");
1958 push(@m, $self->test_via_script('$(FULLPERL) "$(TESTDB_SW)"', '$(TEST_FILE)'));
1961 # Occasionally we may face this degenerate target:
1962 push @m, "test_ : test_dynamic\n\n";
1964 if ($self->needs_linking()) {
1965 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1966 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
1967 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1969 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1970 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
1974 push @m, "test_static :: test_dynamic\n\t$self->{NOECHO}\$(NOOP)\n\n";
1975 push @m, "testdb_static :: testdb_dynamic\n\t$self->{NOECHO}\$(NOOP)\n";
1981 =item test_via_harness (override)
1983 Use VMS-style quoting on command line.
1987 sub test_via_harness {
1988 my($self,$perl,$tests) = @_;
1989 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)" \\'."\n\t".
1990 '-e "use Test::Harness qw(&runtests $verbose); $verbose=$(TEST_VERBOSE); runtests @ARGV;" \\'."\n\t$tests\n";
1993 =item test_via_script (override)
1995 Use VMS-style quoting on command line.
1999 sub test_via_script {
2000 my($self,$perl,$script) = @_;
2001 " $perl".' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" '.$script.'
2005 =item makeaperl (override)
2007 Undertake to build a new set of Perl images using VMS commands. Since
2008 VMS does dynamic loading, it's not necessary to statically link each
2009 extension into the Perl image, so this isn't the normal build path.
2010 Consequently, it hasn't really been tested, and may well be incomplete.
2015 my($self, %attribs) = @_;
2016 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2017 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2020 # --- MakeMaker makeaperl section ---
2021 MAP_TARGET = $target
2023 return join '', @m if $self->{PARENT};
2025 my($dir) = join ":", @{$self->{DIR}};
2027 unless ($self->{MAKEAPERL}) {
2029 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2030 },$self->{NOECHO},q{Write Sys$Output "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
2031 },$self->{NOECHO},q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
2032 Makefile.PL DIR=}, $dir, q{ \
2033 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2034 MAKEAPERL=1 NORECURS=1
2036 $(MAP_TARGET) :: $(MAKE_APERL_FILE)
2037 $(MMS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
2039 push @m, map( " \\\n\t\t$_", @ARGV );
2046 my($linkcmd,@staticopts,@staticpkgs,$extralist,$target,$targdir,$libperldir);
2048 # The front matter of the linkcommand...
2049 $linkcmd = join ' ', $Config{'ld'},
2050 grep($_, @Config{qw(large split ldflags ccdlflags)});
2051 $linkcmd =~ s/\s+/ /g;
2053 # Which *.olb files could we make use of...
2055 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
2057 File::Find::find(sub {
2058 return unless m/\Q$self->{LIB_EXT}\E$/;
2059 return if m/^libperl/;
2061 if( exists $self->{INCLUDE_EXT} ){
2066 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2070 # Throw away anything not explicitly marked for inclusion.
2071 # DynaLoader is implied.
2072 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2078 return unless $found;
2080 elsif( exists $self->{EXCLUDE_EXT} ){
2084 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2088 # Throw away anything explicitly marked for exclusion
2089 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2090 return if( $xx eq $excl );
2094 $olbs{$ENV{DEFAULT}} = $_;
2095 }, grep( -d $_, @{$searchdirs || []}));
2097 # We trust that what has been handed in as argument will be buildable
2098 $static = [] unless $static;
2099 @olbs{@{$static}} = (1) x @{$static};
2101 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2102 # Sort the object libraries in inverse order of
2103 # filespec length to try to insure that dependent extensions
2104 # will appear before their parents, so the linker will
2105 # search the parent library to resolve references.
2106 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2107 # references from [.intuit.dwim]dwim.obj can be found
2108 # in [.intuit]intuit.olb).
2109 for (sort keys %olbs) {
2110 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2111 my($dir) = $self->fixpath($_,1);
2112 my($extralibs) = $dir . "extralibs.ld";
2113 my($extopt) = $dir . $olbs{$_};
2114 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
2115 if (-f $extralibs ) {
2116 open LIST,$extralibs or warn $!,next;
2117 push @$extra, <LIST>;
2121 open OPT,$extopt or die $!;
2123 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
2124 # ExtUtils::Miniperl expects Unix paths
2125 (my($pkg) = "$1_$1$self->{LIB_EXT}") =~ s#_*#/#g;
2126 push @staticpkgs,$pkg;
2128 push @staticopts, $extopt;
2132 $target = "Perl.Exe" unless $target;
2133 ($shrtarget,$targdir) = fileparse($target);
2134 $shrtarget =~ s/^([^.]*)/$1Shr/;
2135 $shrtarget = $targdir . $shrtarget;
2136 $target = "Perlshr.$Config{'dlext'}" unless $target;
2137 $tmp = "[]" unless $tmp;
2138 $tmp = $self->fixpath($tmp,1);
2140 $extralist = join(' ',@$extra);
2141 $extralist =~ s/[,\s\n]+/, /g;
2143 else { $extralist = ''; }
2145 unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
2146 print STDOUT "Warning: $libperl not found\n";
2151 if (defined $self->{PERL_SRC}) {
2152 $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2153 } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
2155 print STDOUT "Warning: $libperl not found
2156 If you're going to build a static perl binary, make sure perl is installed
2157 otherwise ignore this warning\n";
2160 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2163 # Fill in the target you want to produce if it\'s not perl
2164 MAP_TARGET = ',$self->fixpath($target),'
2165 MAP_SHRTARGET = ',$self->fixpath($shrtarget),"
2166 MAP_LINKCMD = $linkcmd
2167 MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '','
2168 # We use the linker options files created with each extension, rather than
2169 #specifying the object files directly on the command line.
2170 MAP_STATIC = ',@staticopts ? join(' ', @staticopts) : '','
2171 MAP_OPTS = ',@staticopts ? ','.join(',', map($_.'/Option', @staticopts)) : '',"
2172 MAP_EXTRA = $extralist
2173 MAP_LIBPERL = ",$self->fixpath($libperl),'
2178 $(MAP_SHRTARGET) : $(MAP_LIBPERL) $(MAP_STATIC) ',"${libperldir}Perlshr_Attr.Opt",'
2179 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_OPTS), $(MAP_EXTRA), $(MAP_LIBPERL) ',"${libperldir}Perlshr_Attr.Opt",'
2180 $(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2181 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
2182 ',$self->{NOECHO},'Write Sys$Output "To install the new ""$(MAP_TARGET)"" binary, say"
2183 ',$self->{NOECHO},'Write Sys$Output " $(MMS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
2184 ',$self->{NOECHO},'Write Sys$Output "To remove the intermediate files, say
2185 ',$self->{NOECHO},'Write Sys$Output " $(MMS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
2188 ',"${tmp}perlmain.c",' : $(MAKEFILE)
2189 ',$self->{NOECHO},'$(PERL) $(MAP_PERLINC) -e "use ExtUtils::Miniperl; writemain(qw|',@staticpkgs,'|)" >$(MMS$TARGET)
2193 # More from the 255-char line length limit
2195 ].$self->{NOECHO}.q[$(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2196 ].$self->{NOECHO}.q[$(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
2197 ].$self->{NOECHO}.q[$(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
2198 ].$self->{NOECHO}.q[$(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
2199 $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
2200 ].$self->{NOECHO}.q[Delete/NoLog/NoConfirm .MM_tmp;
2204 inst_perl : pure_inst_perl doc_inst_perl
2207 pure_inst_perl : \$(MAP_TARGET)
2208 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2209 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2215 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
2216 \$(RM_F) ${tmp}PerlShr.Opt \$(MAP_TARGET)
2222 =item ext (specific)
2224 Stub routine standing in for C<ExtUtils::LibList::ext> until VMS
2225 support is added to that package.
2234 # --- Output postprocessing section ---
2236 =item nicetext (override)
2238 Insure that colons marking targets are preceded by space, in order
2239 to distinguish the target delimiter from a colon appearing as
2246 my($self,$text) = @_;
2247 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;