Dodge a NULL pointer dereference in cleanup of Class::DBI
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_VMS.pm
CommitLineData
684427cc 1# MM_VMS.pm
2# MakeMaker default methods for VMS
684427cc 3#
bd3fa61c 4# Author: Charles Bailey bailey@newman.upenn.edu
684427cc 5
6package ExtUtils::MM_VMS;
7
b75c8c73 8use strict;
9
4fdae800 10use Carp qw( &carp );
684427cc 11use Config;
12require Exporter;
13use VMS::Filespec;
14use File::Basename;
377875b9 15use File::Spec;
f6d6199c 16use vars qw($Revision @ISA $VERSION);
e0678a30 17($VERSION) = $Revision = '5.63_01';
9607fc9c 18
f6d6199c 19require ExtUtils::MM_Any;
20require ExtUtils::MM_Unix;
21@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix File::Spec );
22
23use ExtUtils::MakeMaker qw($Verbose neatvalue);
9607fc9c 24
684427cc 25
8e03a37c 26=head1 NAME
27
28ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
29
30=head1 SYNOPSIS
31
f6d6199c 32 Do not use this directly.
33 Instead, use ExtUtils::MM and it will figure out which MM_*
34 class to use for you.
8e03a37c 35
36=head1 DESCRIPTION
37
38See ExtUtils::MM_Unix for a documentation of the methods provided
39there. This package overrides the implementation of these methods, not
40the semantics.
41
42=head2 Methods always loaded
43
bbc7dcd2 44=over 4
2ae324a7 45
bbce6d69 46=item wraplist
47
48Converts a list into a string wrapped at approximately 80 columns.
49
50=cut
51
52sub wraplist {
53 my($self) = shift;
54 my($line,$hlen) = ('',0);
55 my($word);
56
57 foreach $word (@_) {
58 # Perl bug -- seems to occasionally insert extra elements when
59 # traversing array (scalar(@array) doesn't show them, but
60 # foreach(@array) does) (5.00307)
61 next unless $word =~ /\w/;
17f28c40 62 $line .= ' ' if length($line);
bbce6d69 63 if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
64 $line .= $word;
65 $hlen += length($word) + 2;
66 }
67 $line;
68}
69
55497cff 70
71# This isn't really an override. It's just here because ExtUtils::MM_VMS
e97e32e6 72# appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
55497cff 73# in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just
e97e32e6 74# mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
f6d6199c 75# XXX This hackery will die soon. --Schwern
55497cff 76sub ext {
f6d6199c 77 require ExtUtils::Liblist::Kid;
78 goto &ExtUtils::Liblist::Kid::ext;
55497cff 79}
80
2ae324a7 81=back
55497cff 82
f6d6199c 83=head2 Methods
8e03a37c 84
85Those methods which override default MM_Unix methods are marked
86"(override)", while methods unique to MM_VMS are marked "(specific)".
87For overridden methods, documentation is limited to an explanation
88of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
89documentation for more details.
90
bbc7dcd2 91=over 4
2ae324a7 92
8e03a37c 93=item guess_name (override)
94
95Try to determine name of extension being built. We begin with the name
96of the current directory. Since VMS filenames are case-insensitive,
97however, we look for a F<.pm> file whose name matches that of the current
98directory (presumably the 'main' F<.pm> file for this extension), and try
99to find a C<package> statement from which to obtain the Mixed::Case
100package name.
101
102=cut
684427cc 103
684427cc 104sub guess_name {
105 my($self) = @_;
55497cff 106 my($defname,$defpm,@pm,%xs,$pm);
684427cc 107 local *PM;
108
f1387719 109 $defname = basename(fileify($ENV{'DEFAULT'}));
110 $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version
111 $defpm = $defname;
55497cff 112 # Fallback in case for some reason a user has copied the files for an
113 # extension into a working directory whose name doesn't reflect the
114 # extension's name. We'll use the name of a unique .pm file, or the
115 # first .pm file with a matching .xs file.
116 if (not -e "${defpm}.pm") {
117 @pm = map { s/.pm$//; $_ } glob('*.pm');
118 if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
119 elsif (@pm) {
120 %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
f6d6199c 121 if (keys %xs) {
122 foreach $pm (@pm) {
123 $defpm = $pm, last if exists $xs{$pm};
124 }
125 }
55497cff 126 }
127 }
684427cc 128 if (open(PM,"${defpm}.pm")){
129 while (<PM>) {
130 if (/^\s*package\s+([^;]+)/i) {
131 $defname = $1;
132 last;
133 }
134 }
135 print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
136 "defaulting package name to $defname\n"
137 if eof(PM);
138 close PM;
139 }
140 else {
141 print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
142 "defaulting package name to $defname\n";
143 }
f1387719 144 $defname =~ s#[\d.\-_]+$##;
684427cc 145 $defname;
146}
147
8e03a37c 148=item find_perl (override)
149
150Use VMS file specification syntax and CLI commands to find and
151invoke Perl images.
152
153=cut
684427cc 154
5ab4150f 155sub find_perl {
684427cc 156 my($self, $ver, $names, $dirs, $trace) = @_;
8e03a37c 157 my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
62ecdc92 158 my($rslt);
81ff29e3 159 my($inabs) = 0;
62ecdc92 160 local *TCF;
8e03a37c 161 # Check in relative directories first, so we pick up the current
162 # version of Perl if we're running MakeMaker as part of the main build.
ecf68df6 163 @sdirs = sort { my($absa) = File::Spec->file_name_is_absolute($a);
164 my($absb) = File::Spec->file_name_is_absolute($b);
8e03a37c 165 if ($absa && $absb) { return $a cmp $b }
166 else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
167 } @$dirs;
168 # Check miniperl before perl, and check names likely to contain
169 # version numbers before "generic" names, so we pick up an
170 # executable that's less likely to be from an old installation.
171 @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename
172 my($bb) = $b =~ m!([^:>\]/]+)$!;
81ff29e3 173 my($ahasdir) = (length($a) - length($ba) > 0);
174 my($bhasdir) = (length($b) - length($bb) > 0);
175 if ($ahasdir and not $bhasdir) { return 1; }
176 elsif ($bhasdir and not $ahasdir) { return -1; }
177 else { $bb =~ /\d/ <=> $ba =~ /\d/
178 or substr($ba,0,1) cmp substr($bb,0,1)
179 or length($bb) <=> length($ba) } } @$names;
180 # Image names containing Perl version use '_' instead of '.' under VMS
181 foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
5ab4150f 182 if ($trace >= 2){
684427cc 183 print "Looking for perl $ver by these names:\n";
8e03a37c 184 print "\t@snames,\n";
684427cc 185 print "in these dirs:\n";
8e03a37c 186 print "\t@sdirs\n";
684427cc 187 }
8e03a37c 188 foreach $dir (@sdirs){
684427cc 189 next unless defined $dir; # $self->{PERL_SRC} may be undefined
ecf68df6 190 $inabs++ if File::Spec->file_name_is_absolute($dir);
81ff29e3 191 if ($inabs == 1) {
192 # We've covered relative dirs; everything else is an absolute
193 # dir (probably an installed location). First, we'll try potential
194 # command names, to see whether we can avoid a long MCR expression.
195 foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
196 $inabs++; # Should happen above in next $dir, but just in case . . .
197 }
8e03a37c 198 foreach $name (@snames){
ecf68df6 199 if ($name !~ m![/:>\]]!) { push(@cand,File::Spec->catfile($dir,$name)); }
b7b1864f 200 else { push(@cand,$self->fixpath($name,0)); }
684427cc 201 }
202 }
8e03a37c 203 foreach $name (@cand) {
684427cc 204 print "Checking $name\n" if ($trace >= 2);
81ff29e3 205 # If it looks like a potential command, try it without the MCR
62ecdc92 206 if ($name =~ /^[\w\-\$]+$/) {
207 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
208 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
209 print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
210 close TCF;
211 $rslt = `\@temp_mmvms.com` ;
212 unlink('temp_mmvms.com');
213 if ($rslt =~ /VER_OK/) {
81ff29e3 214 print "Using PERL=$name\n" if $trace;
215 return $name;
216 }
62ecdc92 217 }
684427cc 218 next unless $vmsfile = $self->maybe_command($name);
f1387719 219 $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well
684427cc 220 print "Executing $vmsfile\n" if ($trace >= 2);
62ecdc92 221 open(TCF,">temp_mmvms.com") || die('unable to open temp file');
222 print TCF "\$ set message/nofacil/nosever/noident/notext\n";
223 print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
224 close TCF;
225 $rslt = `\@temp_mmvms.com`;
226 unlink('temp_mmvms.com');
227 if ($rslt =~ /VER_OK/) {
684427cc 228 print "Using PERL=MCR $vmsfile\n" if $trace;
81ff29e3 229 return "MCR $vmsfile";
684427cc 230 }
231 }
232 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
233 0; # false and not empty
234}
235
8e03a37c 236=item maybe_command (override)
237
238Follows VMS naming conventions for executable files.
239If the name passed in doesn't exactly match an executable file,
ff0cee69 240appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
241to check for DCL procedure. If this fails, checks directories in DCL$PATH
242and finally F<Sys$System:> for an executable file having the name specified,
243with or without the F<.Exe>-equivalent suffix.
8e03a37c 244
245=cut
a5f75d66 246
684427cc 247sub maybe_command {
248 my($self,$file) = @_;
249 return $file if -x $file && ! -d _;
ff0cee69 250 my(@dirs) = ('');
251 my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
252 my($dir,$ext);
684427cc 253 if ($file !~ m![/:>\]]!) {
ff0cee69 254 for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
255 $dir = $ENV{"DCL\$PATH;$i"};
256 $dir .= ':' unless $dir =~ m%[\]:]$%;
257 push(@dirs,$dir);
258 }
259 push(@dirs,'Sys$System:');
260 foreach $dir (@dirs) {
261 my $sysfile = "$dir$file";
262 foreach $ext (@exts) {
263 return $file if -x "$sysfile$ext" && ! -d _;
264 }
265 }
684427cc 266 }
267 return 0;
268}
269
8e03a37c 270=item maybe_command_in_dirs (override)
271
272Uses DCL argument quoting on test command line.
273
274=cut
684427cc 275
276sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
277 my($self, $names, $dirs, $trace, $ver) = @_;
278 my($name, $dir);
279 foreach $dir (@$dirs){
280 next unless defined $dir; # $self->{PERL_SRC} may be undefined
281 foreach $name (@$names){
282 my($abs,$tryabs);
ecf68df6 283 if (File::Spec->file_name_is_absolute($name)) {
684427cc 284 $abs = $name;
285 } else {
ecf68df6 286 $abs = File::Spec->catfile($dir, $name);
684427cc 287 }
288 print "Checking $abs for $name\n" if ($trace >= 2);
289 next unless $tryabs = $self->maybe_command($abs);
290 print "Substituting $tryabs instead of $abs\n"
291 if ($trace >= 2 and $tryabs ne $abs);
292 $abs = $tryabs;
293 if (defined $ver) {
294 print "Executing $abs\n" if ($trace >= 2);
295 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
81ff29e3 296 print "Using $abs\n" if $trace;
684427cc 297 return $abs;
298 }
299 } else { # Do not look for perl
300 return $abs;
301 }
302 }
303 }
304}
305
8e03a37c 306=item perl_script (override)
307
ff0cee69 308If name passed in doesn't specify a readable file, appends F<.com> or
309F<.pl> and tries again, since it's customary to have file types on all files
8e03a37c 310under VMS.
311
312=cut
684427cc 313
314sub perl_script {
315 my($self,$file) = @_;
316 return $file if -r $file && ! -d _;
ff0cee69 317 return "$file.com" if -r "$file.com";
318 return "$file.pl" if -r "$file.pl";
684427cc 319 return '';
320}
321
8e03a37c 322=item replace_manpage_separator
323
324Use as separator a character which is legal in a VMS-syntax file name.
325
326=cut
684427cc 327
328sub replace_manpage_separator {
329 my($self,$man) = @_;
330 $man = unixify($man);
331 $man =~ s#/+#__#g;
332 $man;
333}
334
e0678a30 335=item init_main (override)
336
337Override DISTVNAME so it uses VERSION_SYM to avoid getting too many
338dots in the name.
339
340=cut
341
342sub init_main {
343 my($self) = shift;
344
345 $self->SUPER::init_main;
346 $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}";
347}
348
8e03a37c 349=item init_others (override)
350
351Provide VMS-specific forms of various utility commands, then hand
352off to the default MM_Unix method.
353
354=cut
684427cc 355
356sub init_others {
357 my($self) = @_;
684427cc 358
5ab4150f 359 $self->{NOOP} = 'Continue';
684427cc 360 $self->{FIRST_MAKEFILE} ||= 'Descrip.MMS';
c07a80fd 361 $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS';
684427cc 362 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
c07a80fd 363 $self->{NOECHO} ||= '@ ';
684427cc 364 $self->{RM_F} = '$(PERL) -e "foreach (@ARGV) { 1 while ( -d $_ ? rmdir $_ : unlink $_)}"';
75e2e551 365 $self->{RM_RF} = '$(PERLRUN) -e "use File::Path; @dirs = map(VMS::Filespec::unixify($_),@ARGV); rmtree(\@dirs,0,0)"';
684427cc 366 $self->{TOUCH} = '$(PERL) -e "$t=time; foreach (@ARGV) { -e $_ ? utime($t,$t,@ARGV) : (open(F,qq(>$_)),close F)}"';
367 $self->{CHMOD} = '$(PERL) -e "chmod @ARGV"'; # expect Unix syntax from MakeMaker
368 $self->{CP} = 'Copy/NoConfirm';
369 $self->{MV} = 'Rename/NoConfirm';
5ab4150f 370 $self->{UMASK_NULL} = '! ';
f6d6199c 371
372 $self->SUPER::init_others;
684427cc 373}
374
8e03a37c 375=item constants (override)
376
377Fixes up numerous file and directory macros to insure VMS syntax
378regardless of input syntax. Also adds a few VMS-specific macros
379and makes lists of files comma-separated.
380
381=cut
a5f75d66 382
684427cc 383sub constants {
384 my($self) = @_;
a5f75d66 385 my(@m,$def,$macro);
684427cc 386
d5e3fa33 387 # Be kind about case for pollution
388 for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
389
e0678a30 390 $self->{DEFINE} ||= '';
684427cc 391 if ($self->{DEFINE} ne '') {
1f47e8e2 392 my(@terms) = split(/\s+/,$self->{DEFINE});
393 my(@defs,@udefs);
394 foreach $def (@terms) {
684427cc 395 next unless $def;
1f47e8e2 396 my $targ = \@defs;
397 if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition
398 if ($1 eq 'U') { $targ = \@udefs; }
4fdae800 399 $def =~ s/='(.*)'$/=$1/; # then remove shell-protection ''
400 $def =~ s/^'(.*)'$/$1/; # from entire term or argument
f86702cc 401 }
402 if ($def =~ /=/) {
403 $def =~ s/"/""/g; # Protect existing " from DCL
404 $def = qq["$def"]; # and quote to prevent parsing of =
405 }
1f47e8e2 406 push @$targ, $def;
684427cc 407 }
1f47e8e2 408 $self->{DEFINE} = '';
e0678a30 409 if (@defs) {
410 $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')';
411 }
412 if (@udefs) {
413 $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')';
414 }
684427cc 415 }
416
417 if ($self->{OBJECT} =~ /\s/) {
418 $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
b7b1864f 419 $self->{OBJECT} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{OBJECT})));
684427cc 420 }
b7b1864f 421 $self->{LDFROM} = $self->wraplist(map($self->fixpath($_,0),split(/,?\s+/,$self->{LDFROM})));
684427cc 422
a5f75d66 423
a5f75d66 424 foreach $macro ( qw [
5c161494 425 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB
426 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
427 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
428 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
429 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
430 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
431 PERL_LIB PERL_ARCHLIB
432 PERL_INC PERL_SRC FULLEXT ] ) {
a5f75d66 433 next unless defined $self->{$macro};
45bc4d3a 434 next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
a5f75d66 435 $self->{$macro} = $self->fixpath($self->{$macro},1);
436 }
ecf68df6 437 $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS))
a5f75d66 438 if ($self->{PERL_SRC});
439
440
441
442 # Fix up file specs
443 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
444 next unless defined $self->{$macro};
b7b1864f 445 $self->{$macro} = $self->fixpath($self->{$macro},0);
a5f75d66 446 }
447
f1387719 448 foreach $macro (qw/
5c161494 449 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM
450 XS_VERSION
451 INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
452 INSTALLDIRS
453 PREFIX SITEPREFIX VENDORPREFIX
454 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
455 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
456 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
457 PERL_LIB PERL_ARCHLIB
458 SITELIBEXP SITEARCHEXP
459 LIBPERL_A MYEXTLIB
a5f75d66 460 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
75e2e551 461 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
5c161494 462 FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST
463 PERL_CORE NOECHO NOOP
a5f75d66 464 / ) {
f1387719 465 next unless defined $self->{$macro};
466 push @m, "$macro = $self->{$macro}\n";
a5f75d66 467 }
468
469
470 push @m, q[
471VERSION_MACRO = VERSION
472DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
473XS_VERSION_MACRO = XS_VERSION
474XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
475
ecf68df6 476MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
a5f75d66 477MM_VERSION = $ExtUtils::MakeMaker::VERSION
478MM_REVISION = $ExtUtils::MakeMaker::Revision
479MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
480
481# FULLEXT = Pathname for extension directory (eg DBD/Oracle).
482# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
f1387719 483# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
a5f75d66 484# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
485];
486
18541947 487 for my $tmp (qw/
5ab4150f 488 FULLEXT VERSION_FROM OBJECT LDFROM
489 / ) {
490 next unless defined $self->{$tmp};
b7b1864f 491 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
5ab4150f 492 }
493
18541947 494 for my $tmp (qw/
5ab4150f 495 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
a5f75d66 496 / ) {
497 next unless defined $self->{$tmp};
498 push @m, "$tmp = $self->{$tmp}\n";
499 }
500
18541947 501 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
1a535d6f 502 # Where is the space coming from? --jhi
503 next unless $self ne " " && defined $self->{$tmp};
f1387719 504 my(%tmp,$key);
505 for $key (keys %{$self->{$tmp}}) {
b7b1864f 506 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
f1387719 507 }
508 $self->{$tmp} = \%tmp;
509 }
510
18541947 511 for my $tmp (qw/ C O_FILES H /) {
f1387719 512 next unless defined $self->{$tmp};
513 my(@tmp,$val);
514 for $val (@{$self->{$tmp}}) {
b7b1864f 515 push(@tmp,$self->fixpath($val,0));
f1387719 516 }
517 $self->{$tmp} = \@tmp;
518 }
519
a5f75d66 520 push @m,'
684427cc 521
522# Handy lists of source code files:
17f28c40 523XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
524C_FILES = ',$self->wraplist(@{$self->{C}}),'
525O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
526H_FILES = ',$self->wraplist(@{$self->{H}}),'
527MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
528MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
684427cc 529
a5f75d66 530';
684427cc 531
18541947 532 for my $tmp (qw/
5c161494 533 INST_MAN1DIR MAN1EXT
534 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
535 INST_MAN3DIR MAN3EXT
536 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
a5f75d66 537 /) {
538 next unless defined $self->{$tmp};
539 push @m, "$tmp = $self->{$tmp}\n";
540 }
684427cc 541
a5f75d66 542push @m,"
9cae3221 543makemakerdflt : all
f6d6199c 544 \$(NOECHO) \$(NOOP)
9cae3221 545
f86702cc 546.SUFFIXES :
f1387719 547.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
684427cc 548
549# Here is the Config.pm that we are using/depend on
c07a80fd 550CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
684427cc 551
552# Where to put things:
5ab4150f 553INST_LIBDIR = $self->{INST_LIBDIR}
554INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
684427cc 555
5ab4150f 556INST_AUTODIR = $self->{INST_AUTODIR}
557INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
558";
684427cc 559
560 if ($self->has_link_code()) {
561 push @m,'
562INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
4b19af01 563INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
684427cc 564INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
565';
566 } else {
17f28c40 567 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
684427cc 568 push @m,'
569INST_STATIC =
570INST_DYNAMIC =
571INST_BOOT =
c07a80fd 572EXPORT_LIST = $(BASEEXT).opt
17f28c40 573PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
684427cc 574';
575 }
576
f1387719 577 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
578 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
684427cc 579 push @m,'
17f28c40 580TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
8e03a37c 581
17f28c40 582PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
684427cc 583';
584
585 join('',@m);
586}
587
8e03a37c 588=item cflags (override)
684427cc 589
8e03a37c 590Bypass shell script and produce qualifiers for CC directly (but warn
591user if a shell script for this extension exists). Fold multiple
5ab4150f 592/Defines into one, since some C compilers pay attention to only one
593instance of this qualifier on the command line.
8e03a37c 594
595=cut
596
597sub cflags {
684427cc 598 my($self,$libperl) = @_;
09b7f37c 599 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
600 my($definestr,$undefstr,$flagoptstr) = ('','','');
601 my($incstr) = '/Include=($(PERL_INC)';
684427cc 602 my($name,$sys,@m);
603
604 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
605 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
606 " required to modify CC command for $self->{'BASEEXT'}\n"
607 if ($Config{$name});
608
09b7f37c 609 if ($quals =~ / -[DIUOg]/) {
610 while ($quals =~ / -([Og])(\d*)\b/) {
611 my($type,$lvl) = ($1,$2);
612 $quals =~ s/ -$type$lvl\b\s*//;
613 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
614 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
615 }
616 while ($quals =~ / -([DIU])(\S+)/) {
617 my($type,$def) = ($1,$2);
618 $quals =~ s/ -$type$def\s*//;
619 $def =~ s/"/""/g;
620 if ($type eq 'D') { $definestr .= qq["$def",]; }
0c2a65fc 621 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
09b7f37c 622 else { $undefstr .= qq["$def",]; }
623 }
624 }
625 if (length $quals and $quals !~ m!/!) {
626 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
627 $quals = '';
628 }
d5e3fa33 629 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
09b7f37c 630 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
631 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
684427cc 632 # Deal with $self->{DEFINE} here since some C compilers pay attention
633 # to only one /Define clause on command line, so we have to
09b7f37c 634 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
1f47e8e2 635 # ($self->{DEFINE} has already been VMSified in constants() above)
636 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
18541947 637 for my $type (qw(Def Undef)) {
1f47e8e2 638 my(@terms);
639 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
640 my $term = $1;
641 $term =~ s:^\((.+)\)$:$1:;
642 push @terms, $term;
643 }
644 if ($type eq 'Def') {
645 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
646 }
647 if (@terms) {
648 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
649 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
650 }
684427cc 651 }
652
653 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
684427cc 654
655 # Likewise with $self->{INC} and /Include
684427cc 656 if ($self->{'INC'}) {
657 my(@includes) = split(/\s+/,$self->{INC});
658 foreach (@includes) {
659 s/^-I//;
0c2a65fc 660 $incstr .= ','.$self->fixpath($_,1);
684427cc 661 }
662 }
5ab4150f 663 $quals .= "$incstr)";
1f47e8e2 664# $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
09b7f37c 665 $self->{CCFLAGS} = $quals;
684427cc 666
e0678a30 667 $self->{PERLTYPE} ||= '';
668
09b7f37c 669 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
670 if ($self->{OPTIMIZE} !~ m!/!) {
c1c69de6 671 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
09b7f37c 672 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
673 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
674 }
675 else {
676 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
677 $self->{OPTIMIZE} = '/Optimize';
678 }
679 }
8e03a37c 680
681 return $self->{CFLAGS} = qq{
09b7f37c 682CCFLAGS = $self->{CCFLAGS}
683OPTIMIZE = $self->{OPTIMIZE}
684PERLTYPE = $self->{PERLTYPE}
8e03a37c 685};
686}
687
688=item const_cccmd (override)
689
690Adds directives to point C preprocessor to the right place when
81ff29e3 691handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
8e03a37c 692command line a bit differently than MM_Unix method.
684427cc 693
8e03a37c 694=cut
695
696sub const_cccmd {
697 my($self,$libperl) = @_;
8e03a37c 698 my(@m);
699
700 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
701 return '' unless $self->needs_linking();
702 if ($Config{'vms_cc_type'} eq 'gcc') {
684427cc 703 push @m,'
704.FIRST
8e03a37c 705 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
706 }
707 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
708 push @m,'
709.FIRST
710 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
711 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
712 }
713 else {
714 push @m,'
715.FIRST
716 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
e0678a30 717 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
8e03a37c 718 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
719 }
684427cc 720
8e03a37c 721 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
684427cc 722
8e03a37c 723 $self->{CONST_CCCMD} = join('',@m);
684427cc 724}
725
8e03a37c 726=item pm_to_blib (override)
684427cc 727
8e03a37c 728DCL I<still> accepts a maximum of 255 characters on a command
729line, so we write the (potentially) long list of file names
730to a temp file, then persuade Perl to read it instead of the
731command line to find args.
732
733=cut
734
735sub pm_to_blib {
736 my($self) = @_;
8e03a37c 737 my($line,$from,$to,@m);
73eb9af1 738 my($autodir) = File::Spec->catdir($self->{INST_LIB},'auto');
8e03a37c 739 my(@files) = @{$self->{PM_TO_BLIB}};
740
741 push @m, q{
5ab4150f 742
743# Dummy target to match Unix target name; we use pm_to_blib.ts as
744# timestamp file to avoid repeated invocations under VMS
745pm_to_blib : pm_to_blib.ts
746 $(NOECHO) $(NOOP)
747
8e03a37c 748# As always, keep under DCL's 255-char limit
5ab4150f 749pm_to_blib.ts : $(TO_INST_PM)
3ced6111 750};
751
752 if (scalar(@files) > 0) { # protect ourselves from empty PM_TO_BLIB
8e03a37c 753
3ced6111 754 push(@m,qq[\t\$(NOECHO) \$(RM_F) .MM_tmp\n]);
755 $line = ''; # avoid uninitialized var warning
756 while ($from = shift(@files),$to = shift(@files)) {
8e03a37c 757 $line .= " $from $to";
758 if (length($line) > 128) {
5ab4150f 759 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
8e03a37c 760 $line = '';
761 }
3ced6111 762 }
763 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
8e03a37c 764
3ced6111 765 push(@m,q[ $(PERLRUN) "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
766 push(@m,qq[\n\t\$(NOECHO) \$(RM_F) .MM_tmp\n]);
767
768 }
769 push(@m,qq[\t\$(NOECHO) \$(TOUCH) pm_to_blib.ts]);
8e03a37c 770
771 join('',@m);
772}
773
774=item tool_autosplit (override)
775
776Use VMS-style quoting on command line.
777
778=cut
684427cc 779
f6d6199c 780sub tool_autosplit {
684427cc 781 my($self, %attribs) = @_;
684427cc 782 my($asl) = "";
783 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
784 q{
785# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
f6d6199c 786AUTOSPLITFILE = $(PERLRUN) -e "use AutoSplit;}.$asl.q{autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
684427cc 787};
788}
789
8e03a37c 790=item tool_sxubpp (override)
791
792Use VMS-style quoting on xsubpp command line.
793
794=cut
795
f1387719 796sub tool_xsubpp {
684427cc 797 my($self) = @_;
f1387719 798 return '' unless $self->needs_linking;
ecf68df6 799 my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils');
684427cc 800 # drop back to old location if xsubpp is not in new location yet
ecf68df6 801 $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp'));
684427cc 802 my(@tmdeps) = '$(XSUBPPDIR)typemap';
803 if( $self->{TYPEMAPS} ){
804 my $typemap;
805 foreach $typemap (@{$self->{TYPEMAPS}}){
806 if( ! -f $typemap ){
807 warn "Typemap $typemap not found.\n";
808 }
809 else{
b7b1864f 810 push(@tmdeps, $self->fixpath($typemap,0));
684427cc 811 }
812 }
813 }
814 push(@tmdeps, "typemap") if -f "typemap";
815 my(@tmargs) = map("-typemap $_", @tmdeps);
816 if( exists $self->{XSOPT} ){
817 unshift( @tmargs, $self->{XSOPT} );
818 }
819
e3830a4e 820 if ($Config{'ldflags'} &&
821 $Config{'ldflags'} =~ m!/Debug!i &&
822 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
823 unshift(@tmargs,'-nolinenumbers');
824 }
ecf68df6 825 my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp'));
684427cc 826
827 # What are the correct thresholds for version 1 && 2 Paul?
828 if ( $xsubpp_version > 1.923 ){
829 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
830 } else {
831 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
832 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
833 Your version of xsubpp is $xsubpp_version and cannot handle this.
834 Please upgrade to a more recent version of xsubpp.
835};
836 } else {
837 $self->{XSPROTOARG} = "";
838 }
839 }
840
841 "
8e03a37c 842XSUBPPDIR = $xsdir
f6d6199c 843XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
684427cc 844XSPROTOARG = $self->{XSPROTOARG}
845XSUBPPDEPS = @tmdeps
846XSUBPPARGS = @tmargs
847";
848}
849
8e03a37c 850=item xsubpp_version (override)
851
81ff29e3 852Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
853rather than Unix rules ($sts == 0 ==E<gt> good).
8e03a37c 854
855=cut
684427cc 856
857sub xsubpp_version
858{
859 my($self,$xsubpp) = @_;
860 my ($version) ;
f1387719 861 return '' unless $self->needs_linking;
684427cc 862
863 # try to figure out the version number of the xsubpp on the system
864
865 # first try the -v flag, introduced in 1.921 & 2.000a2
866
75e2e551 867 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
684427cc 868 print "Running: $command\n" if $Verbose;
869 $version = `$command` ;
ff0cee69 870 if ($?) {
871 use vmsish 'status';
872 warn "Running '$command' exits with status $?";
873 }
684427cc 874 chop $version ;
875
876 return $1 if $version =~ /^xsubpp version (.*)/ ;
877
878 # nope, then try something else
879
880 my $counter = '000';
881 my ($file) = 'temp' ;
882 $counter++ while -e "$file$counter"; # don't overwrite anything
883 $file .= $counter;
884
885 local(*F);
886 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
887 print F <<EOM ;
888MODULE = fred PACKAGE = fred
889
890int
891fred(a)
892 int a;
893EOM
894
895 close F ;
896
75e2e551 897 $command = "$self->{PERLRUN} $xsubpp $file";
684427cc 898 print "Running: $command\n" if $Verbose;
899 my $text = `$command` ;
68dc0745 900 if ($?) {
901 use vmsish 'status';
902 warn "Running '$command' exits with status $?";
903 }
684427cc 904 unlink $file ;
905
906 # gets 1.2 -> 1.92 and 2.000a1
907 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
908
909 # it is either 1.0 or 1.1
910 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
911
912 # none of the above, so 1.0
913 return "1.0" ;
914}
915
8e03a37c 916=item tools_other (override)
917
918Adds a few MM[SK] macros, and shortens some the installatin commands,
919in order to stay under DCL's 255-character limit. Also changes
920EQUALIZE_TIMESTAMP to set revision date of target file to one second
921later than source file, since MMK interprets precisely equal revision
922dates for a source and target file as a sign that the target needs
923to be updated.
924
925=cut
684427cc 926
927sub tools_other {
928 my($self) = @_;
a5f75d66 929 qq!
684427cc 930# Assumes \$(MMS) invokes MMS or MMK
931# (It is assumed in some cases later that the default makefile name
932# (Descrip.MMS for MM[SK]) is used.)
933USEMAKEFILE = /Descrip=
934USEMACROS = /Macro=(
935MACROEND = )
936MAKEFILE = Descrip.MMS
937SHELL = Posix
684427cc 938TOUCH = $self->{TOUCH}
939CHMOD = $self->{CHMOD}
940CP = $self->{CP}
941MV = $self->{MV}
942RM_F = $self->{RM_F}
943RM_RF = $self->{RM_RF}
774d564b 944SAY = Write Sys\$Output
684427cc 945UMASK_NULL = $self->{UMASK_NULL}
946MKPATH = Create/Directory
a5f75d66 947EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
8e03a37c 948!. ($self->{PARENT} ? '' :
f1387719 949qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
75e2e551 950MOD_INSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
81ff29e3 951DOC_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]"
75e2e551 952UNINSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
8e03a37c 953!);
684427cc 954}
955
8e03a37c 956=item dist (override)
957
958Provide VMSish defaults for some values, then hand off to
959default MM_Unix method.
960
961=cut
684427cc 962
963sub dist {
964 my($self, %attribs) = @_;
f1387719 965 $attribs{VERSION} ||= $self->{VERSION_SYM};
2ae324a7 966 $attribs{NAME} ||= $self->{DISTNAME};
8e03a37c 967 $attribs{ZIPFLAGS} ||= '-Vu';
968 $attribs{COMPRESS} ||= 'gzip';
969 $attribs{SUFFIX} ||= '-gz';
970 $attribs{SHAR} ||= 'vms_share';
971 $attribs{DIST_DEFAULT} ||= 'zipdist';
972
2ae324a7 973 # Sanitize these for use in $(DISTVNAME) filespec
974 $attribs{VERSION} =~ s/[^\w\$]/_/g;
62ecdc92 975 $attribs{NAME} =~ s/[^\w\$]/-/g;
2ae324a7 976
e0678a30 977 $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)';
978
f6d6199c 979 return $self->SUPER::dist(%attribs);
684427cc 980}
981
8e03a37c 982=item c_o (override)
684427cc 983
8e03a37c 984Use VMS syntax on command line. In particular, $(DEFINE) and
985$(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
986
987=cut
684427cc 988
989sub c_o {
990 my($self) = @_;
684427cc 991 return '' unless $self->needs_linking();
992 '
993.c$(OBJ_EXT) :
994 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
8e03a37c 995
996.cpp$(OBJ_EXT) :
997 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
998
999.cxx$(OBJ_EXT) :
1000 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
1001
684427cc 1002';
1003}
1004
8e03a37c 1005=item xs_c (override)
1006
1007Use MM[SK] macros.
1008
1009=cut
1010
684427cc 1011sub xs_c {
1012 my($self) = @_;
684427cc 1013 return '' unless $self->needs_linking();
1014 '
1015.xs.c :
1016 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1017';
1018}
1019
8e03a37c 1020=item xs_o (override)
1021
1022Use MM[SK] macros, and VMS command line for C compiler.
1023
1024=cut
1025
684427cc 1026sub xs_o { # many makes are too dumb to use xs_c then c_o
1027 my($self) = @_;
684427cc 1028 return '' unless $self->needs_linking();
1029 '
1030.xs$(OBJ_EXT) :
1031 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1032 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1033';
1034}
1035
8e03a37c 1036=item top_targets (override)
684427cc 1037
f6d6199c 1038Path seperator differences.
684427cc 1039
8e03a37c 1040=cut
684427cc 1041
1042sub top_targets {
1043 my($self) = shift;
684427cc 1044 my(@m);
1045 push @m, '
8e03a37c 1046all :: pure_all manifypods
5ab4150f 1047 $(NOECHO) $(NOOP)
8e03a37c 1048
1049pure_all :: config pm_to_blib subdirs linkext
5ab4150f 1050 $(NOECHO) $(NOOP)
684427cc 1051
1052subdirs :: $(MYEXTLIB)
5ab4150f 1053 $(NOECHO) $(NOOP)
684427cc 1054
1055config :: $(MAKEFILE) $(INST_LIBDIR).exists
5ab4150f 1056 $(NOECHO) $(NOOP)
684427cc 1057
a5f75d66 1058config :: $(INST_ARCHAUTODIR).exists
5ab4150f 1059 $(NOECHO) $(NOOP)
684427cc 1060
1061config :: $(INST_AUTODIR).exists
5ab4150f 1062 $(NOECHO) $(NOOP)
684427cc 1063';
1064
684427cc 1065 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1066 if (%{$self->{MAN1PODS}}) {
1067 push @m, q[
c07a80fd 1068config :: $(INST_MAN1DIR).exists
5ab4150f 1069 $(NOECHO) $(NOOP)
684427cc 1070];
1071 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1072 }
1073 if (%{$self->{MAN3PODS}}) {
1074 push @m, q[
1075config :: $(INST_MAN3DIR).exists
5ab4150f 1076 $(NOECHO) $(NOOP)
684427cc 1077];
1078 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1079 }
1080
1081 push @m, '
1082$(O_FILES) : $(H_FILES)
1083' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1084
1085 push @m, q{
1086help :
1087 perldoc ExtUtils::MakeMaker
1088};
1089
684427cc 1090 join('',@m);
1091}
1092
8e03a37c 1093=item dlsyms (override)
1094
1095Create VMS linker options files specifying universal symbols for this
1096extension's shareable image, and listing other shareable images or
1097libraries to which it should be linked.
1098
1099=cut
684427cc 1100
1101sub dlsyms {
1102 my($self,%attribs) = @_;
0d8023a2 1103
1104 return '' unless $self->needs_linking();
1105
684427cc 1106 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
a5f75d66 1107 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
762efda7 1108 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
684427cc 1109 my(@m);
1110
a5f75d66 1111 unless ($self->{SKIPHASH}{'dynamic'}) {
1112 push(@m,'
09b7f37c 1113dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
5ab4150f 1114 $(NOECHO) $(NOOP)
a5f75d66 1115');
a5f75d66 1116 }
684427cc 1117
1118 push(@m,'
1119static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
5ab4150f 1120 $(NOECHO) $(NOOP)
684427cc 1121') unless $self->{SKIPHASH}{'static'};
1122
f0585323 1123 push @m,'
684427cc 1124$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1125 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
684427cc 1126
c07a80fd 1127$(BASEEXT).opt : Makefile.PL
f6d6199c 1128 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
c07a80fd 1129 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
762efda7 1130 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
f0585323 1131 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1132
1133 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1134 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
b6837a3b 1135 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1136 push @m, ($Config{d_vms_case_sensitive_symbols}
1137 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1138 }
f0585323 1139 else { # We don't have a "main" object file, so pull 'em all in
b6837a3b 1140 # Upcase module names if linker is being case-sensitive
1141 my($upcase) = $Config{d_vms_case_sensitive_symbols};
f0585323 1142 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1143 s[\$\(\w+_EXT\)][]; # even as a macro
1144 s/.*[:>\/\]]//; # Trim off dir spec
b6837a3b 1145 $upcase ? uc($_) : $_;
1146 } split ' ', $self->eliminate_macros($self->{OBJECT});
e3830a4e 1147 my($tmp,@lines,$elt) = '';
62ecdc92 1148 $tmp = shift @omods;
f0585323 1149 foreach $elt (@omods) {
1150 $tmp .= ",$elt";
1151 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1152 }
1153 push @lines, $tmp;
1154 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1155 }
1156 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
684427cc 1157
55497cff 1158 if (length $self->{LDLOADLIBS}) {
1159 my($lib); my($line) = '';
1160 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1161 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1162 if (length($line) + length($lib) > 160) {
9607fc9c 1163 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
55497cff 1164 $line = $lib . '\n';
1165 }
1166 else { $line .= $lib . '\n'; }
1167 }
9607fc9c 1168 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
55497cff 1169 }
1170
684427cc 1171 join('',@m);
55497cff 1172
684427cc 1173}
1174
8e03a37c 1175=item dynamic_lib (override)
1176
1177Use VMS Link command.
684427cc 1178
8e03a37c 1179=cut
684427cc 1180
1181sub dynamic_lib {
1182 my($self, %attribs) = @_;
684427cc 1183 return '' unless $self->needs_linking(); #might be because of a subdir
1184
0d8023a2 1185 return '' unless $self->has_link_code();
684427cc 1186
c07a80fd 1187 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1188 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
17f28c40 1189 my $shr = $Config{'dbgprefix'} . 'PerlShr';
684427cc 1190 my(@m);
1191 push @m,"
1192
1193OTHERLDFLAGS = $otherldflags
c07a80fd 1194INST_DYNAMIC_DEP = $inst_dynamic_dep
684427cc 1195
1196";
1197 push @m, '
09b7f37c 1198$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
5ab4150f 1199 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
0c2a65fc 1200 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
09b7f37c 1201 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
684427cc 1202';
1203
1204 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1205 join('',@m);
1206}
1207
8e03a37c 1208=item dynamic_bs (override)
1209
1210Use VMS-style quoting on Mkbootstrap command line.
1211
1212=cut
1213
684427cc 1214sub dynamic_bs {
1215 my($self, %attribs) = @_;
0d8023a2 1216 return '
1217BOOTSTRAP =
1218' unless $self->has_link_code();
684427cc 1219 '
1220BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1221
1222# As MakeMaker mkbootstrap might not write a file (if none is required)
1223# we use touch to prevent make continually trying to remake it.
1224# The DynaLoader only reads a non-empty file.
0d8023a2 1225$(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
774d564b 1226 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
f6d6199c 1227 $(NOECHO) $(PERLRUN) -
684427cc 1228 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
5ab4150f 1229 $(NOECHO) $(TOUCH) $(MMS$TARGET)
684427cc 1230
0d8023a2 1231$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
5ab4150f 1232 $(NOECHO) $(RM_RF) $(INST_BOOT)
684427cc 1233 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
684427cc 1234';
1235}
8e03a37c 1236
1237=item static_lib (override)
1238
1239Use VMS commands to manipulate object library.
1240
1241=cut
684427cc 1242
1243sub static_lib {
1244 my($self) = @_;
684427cc 1245 return '' unless $self->needs_linking();
1246
1247 return '
1248$(INST_STATIC) :
5ab4150f 1249 $(NOECHO) $(NOOP)
684427cc 1250' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1251
0c2a65fc 1252 my(@m,$lib);
684427cc 1253 push @m,'
1254# Rely on suffix rule for update action
1255$(OBJECT) : $(INST_ARCHAUTODIR).exists
1256
1257$(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1258';
022735b4 1259 # If this extension has its own library (eg SDBM_File)
684427cc 1260 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
17f28c40 1261 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1262
1263 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
684427cc 1264
bf99883d 1265 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1266 # 'cause it's a library and you can't stick them in other libraries.
1267 # In that case, we use $OBJECT instead and hope for the best
1268 if ($self->{MYEXTLIB}) {
17f28c40 1269 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
bf99883d 1270 } else {
17f28c40 1271 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
bf99883d 1272 }
1273
562a7b0c 1274 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1275 foreach $lib (split ' ', $self->{EXTRALIBS}) {
0c2a65fc 1276 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1277 }
684427cc 1278 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1279 join('',@m);
1280}
1281
1282
8e03a37c 1283=item manifypods (override)
1284
1285Use VMS-style quoting on command line, and VMS logical name
1286to specify fallback location at build time if we can't find pod2man.
1287
1288=cut
684427cc 1289
f1387719 1290
684427cc 1291sub manifypods {
1292 my($self, %attribs) = @_;
5ab4150f 1293 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
684427cc 1294 my($dist);
f1387719 1295 my($pod2man_exe);
684427cc 1296 if (defined $self->{PERL_SRC}) {
ecf68df6 1297 $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
684427cc 1298 } else {
ecf68df6 1299 $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
684427cc 1300 }
55497cff 1301 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
684427cc 1302 # No pod2man but some MAN3PODS to be installed
1303 print <<END;
1304
1305Warning: I could not locate your pod2man program. As a last choice,
1306 I will look for the file to which the logical name POD2MAN
1307 points when MMK is invoked.
1308
1309END
1310 $pod2man_exe = "pod2man";
1311 }
1312 my(@m);
1313 push @m,
1314qq[POD2MAN_EXE = $pod2man_exe\n],
75e2e551 1315q[POD2MAN = $(PERLRUN) "-MPod::Man" -we "%m=@ARGV;for(keys %m){" -
1316-e "Pod::Man->new->parse_from_file($_,$m{$_}) }"
684427cc 1317];
bbce6d69 1318 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
684427cc 1319 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1320 my($pod);
1321 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1322 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1323 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1324 }
1325 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1326 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1327 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1328 }
1329 }
1330 join('', @m);
1331}
1332
8e03a37c 1333=item processPL (override)
1334
1335Use VMS-style quoting on command line.
1336
1337=cut
684427cc 1338
1339sub processPL {
1340 my($self) = @_;
684427cc 1341 return "" unless $self->{PL_FILES};
1342 my(@m, $plfile);
1343 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3aa35033 1344 my $list = ref($self->{PL_FILES}->{$plfile})
1345 ? $self->{PL_FILES}->{$plfile}
1346 : [$self->{PL_FILES}->{$plfile}];
18541947 1347 foreach my $target (@$list) {
3aa35033 1348 my $vmsplfile = vmsify($plfile);
1349 my $vmsfile = vmsify($target);
1350 push @m, "
bbce6d69 1351all :: $vmsfile
5ab4150f 1352 \$(NOECHO) \$(NOOP)
684427cc 1353
bbce6d69 1354$vmsfile :: $vmsplfile
f6d6199c 1355",' $(PERLRUNINST) '," $vmsplfile $vmsfile
684427cc 1356";
3aa35033 1357 }
684427cc 1358 }
1359 join "", @m;
1360}
1361
8e03a37c 1362=item installbin (override)
1363
1364Stay under DCL's 255 character command line limit once again by
1365splitting potentially long list of files across multiple lines
1366in C<realclean> target.
1367
1368=cut
684427cc 1369
1370sub installbin {
1371 my($self) = @_;
684427cc 1372 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1373 return '' unless @{$self->{EXE_FILES}};
1374 my(@m, $from, $to, %fromto, @to, $line);
bbce6d69 1375 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1376 for $from (@exefiles) {
f1387719 1377 my($path) = '$(INST_SCRIPT)' . basename($from);
684427cc 1378 local($_) = $path; # backward compatibility
c2e89b3d 1379 $to = $self->libscan($path);
1380 print "libscan($from) => '$to'\n" if ($Verbose >=2);
bbce6d69 1381 $fromto{$from} = vmsify($to);
684427cc 1382 }
bbce6d69 1383 @to = values %fromto;
684427cc 1384 push @m, "
bbce6d69 1385EXE_FILES = @exefiles
684427cc 1386
684427cc 1387realclean ::
1388";
1389 $line = ''; #avoid unitialized var warning
1390 foreach $to (@to) {
1391 if (length($line) + length($to) > 80) {
1392 push @m, "\t\$(RM_F) $line\n";
1393 $line = $to;
1394 }
1395 else { $line .= " $to"; }
1396 }
f1387719 1397 push @m, "\t\$(RM_F) $line\n\n" if $line;
684427cc 1398
1399 while (($from,$to) = each %fromto) {
8e03a37c 1400 last unless defined $from;
684427cc 1401 my $todir;
1402 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1403 else { ($todir = $to) =~ s/[^\)]+$//; }
1404 $todir = $self->fixpath($todir,1);
1405 push @m, "
1406$to : $from \$(MAKEFILE) ${todir}.exists
1407 \$(CP) $from $to
1408
1409", $self->dir_target($todir);
1410 }
1411 join "", @m;
1412}
1413
8e03a37c 1414=item subdir_x (override)
684427cc 1415
8e03a37c 1416Use VMS commands to change default directory.
1417
1418=cut
684427cc 1419
684427cc 1420sub subdir_x {
1421 my($self, $subdir) = @_;
684427cc 1422 my(@m,$key);
1423 $subdir = $self->fixpath($subdir,1);
1424 push @m, '
1425
1426subdirs ::
1427 olddef = F$Environment("Default")
1428 Set Default ',$subdir,'
9607fc9c 1429 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
684427cc 1430 Set Default \'olddef\'
1431';
1432 join('',@m);
1433}
1434
8e03a37c 1435=item clean (override)
1436
1437Split potentially long list of files across multiple commands (in
1438order to stay under the magic command line limit). Also use MM[SK]
1439commands for handling subdirectories.
684427cc 1440
8e03a37c 1441=cut
684427cc 1442
1443sub clean {
1444 my($self, %attribs) = @_;
684427cc 1445 my(@m,$dir);
1446 push @m, '
1447# Delete temporary files but do not touch installed files. We don\'t delete
1448# the Descrip.MMS here so that a later make realclean still has it to use.
1449clean ::
1450';
1451 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1452 my($vmsdir) = $self->fixpath($dir,1);
f86702cc 1453 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
9607fc9c 1454 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
684427cc 1455 }
5ab4150f 1456 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
684427cc 1457';
1458
1459 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
4fdae800 1460 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1461 # a list or a macro that expands to a list.
1462 if ($attribs{FILES}) {
1463 my($word,$key,@filist);
1464 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1465 else { @filist = split /\s+/, $attribs{FILES}; }
1466 foreach $word (@filist) {
1467 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1468 push(@otherfiles, @{$self->{$key}});
1469 }
b7b1864f 1470 else { push(@otherfiles, $word); }
4fdae800 1471 }
1472 }
8e03a37c 1473 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
ecf68df6 1474 push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
684427cc 1475 my($file,$line);
1476 $line = ''; #avoid unitialized var warning
17f28c40 1477 # Occasionally files are repeated several times from different sources
1478 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1479
684427cc 1480 foreach $file (@otherfiles) {
1481 $file = $self->fixpath($file);
1482 if (length($line) + length($file) > 80) {
1483 push @m, "\t\$(RM_RF) $line\n";
1484 $line = "$file";
1485 }
1486 else { $line .= " $file"; }
1487 }
5ab4150f 1488 push @m, "\t\$(RM_RF) $line\n" if $line;
684427cc 1489 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1490 join('', @m);
1491}
1492
8e03a37c 1493=item realclean (override)
1494
1495Guess what we're working around? Also, use MM[SK] for subdirectories.
1496
1497=cut
684427cc 1498
1499sub realclean {
1500 my($self, %attribs) = @_;
684427cc 1501 my(@m);
1502 push(@m,'
1503# Delete temporary files (via clean) and also delete installed files
1504realclean :: clean
1505');
1506 foreach(@{$self->{DIR}}){
1507 my($vmsdir) = $self->fixpath($_,1);
1508 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
9607fc9c 1509 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
684427cc 1510 }
f6d6199c 1511 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1512 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
684427cc 1513 # We can't expand several of the MMS macros here, since they don't have
1514 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1515 # combination of macros). In order to stay below DCL's 255 char limit,
1516 # we put only 2 on a line.
1517 my($file,$line,$fcnt);
f1387719 1518 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1519 if ($self->has_link_code) {
1520 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1521 }
8e03a37c 1522 push(@files, values %{$self->{PM}});
684427cc 1523 $line = ''; #avoid unitialized var warning
17f28c40 1524 # Occasionally files are repeated several times from different sources
1525 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
684427cc 1526 foreach $file (@files) {
1527 $file = $self->fixpath($file);
1528 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1529 push @m, "\t\$(RM_F) $line\n";
1530 $line = "$file";
1531 $fcnt = 0;
1532 }
1533 else { $line .= " $file"; }
1534 }
f1387719 1535 push @m, "\t\$(RM_F) $line\n" if $line;
4fdae800 1536 if ($attribs{FILES}) {
1537 my($word,$key,@filist,@allfiles);
1538 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1539 else { @filist = split /\s+/, $attribs{FILES}; }
1540 foreach $word (@filist) {
1541 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1542 push(@allfiles, @{$self->{$key}});
1543 }
b7b1864f 1544 else { push(@allfiles, $word); }
4fdae800 1545 }
684427cc 1546 $line = '';
17f28c40 1547 # Occasionally files are repeated several times from different sources
1548 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
4fdae800 1549 foreach $file (@allfiles) {
684427cc 1550 $file = $self->fixpath($file);
1551 if (length($line) + length($file) > 80) {
1552 push @m, "\t\$(RM_RF) $line\n";
1553 $line = "$file";
1554 }
1555 else { $line .= " $file"; }
1556 }
f1387719 1557 push @m, "\t\$(RM_RF) $line\n" if $line;
684427cc 1558 }
1559 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1560 join('', @m);
1561}
1562
684427cc 1563
f1387719 1564=item dist_core (override)
8e03a37c 1565
1566Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1567so C<shdist> target actions are VMS-specific.
1568
1569=cut
684427cc 1570
1571sub dist_core {
1572 my($self) = @_;
8e03a37c 1573q[
684427cc 1574dist : $(DIST_DEFAULT)
2ae324a7 1575 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
684427cc 1576
8e03a37c 1577zipdist : $(DISTVNAME).zip
5ab4150f 1578 $(NOECHO) $(NOOP)
684427cc 1579
62ecdc92 1580tardist : $(DISTVNAME).tar$(SUFFIX)
1581 $(NOECHO) $(NOOP)
1582
8e03a37c 1583$(DISTVNAME).zip : distdir
684427cc 1584 $(PREOP)
2ae324a7 1585 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
684427cc 1586 $(RM_RF) $(DISTVNAME)
1587 $(POSTOP)
1588
f1387719 1589$(DISTVNAME).tar$(SUFFIX) : distdir
1590 $(PREOP)
1591 $(TO_UNIX)
62ecdc92 1592 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
f1387719 1593 $(RM_RF) $(DISTVNAME)
1594 $(COMPRESS) $(DISTVNAME).tar
1595 $(POSTOP)
1596
684427cc 1597shdist : distdir
1598 $(PREOP)
2ae324a7 1599 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
684427cc 1600 $(RM_RF) $(DISTVNAME)
1601 $(POSTOP)
8e03a37c 1602];
684427cc 1603}
1604
8e03a37c 1605=item dist_test (override)
1606
1607Use VMS commands to change default directory, and use VMS-style
1608quoting on command line.
1609
1610=cut
684427cc 1611
1612sub dist_test {
1613 my($self) = @_;
684427cc 1614q{
1615disttest : distdir
1616 startdir = F$Environment("Default")
1617 Set Default [.$(DISTVNAME)]
e0678a30 1618 $(ABSPERLRUN) Makefile.PL
9607fc9c 1619 $(MMS)$(MMSQUALIFIERS)
1620 $(MMS)$(MMSQUALIFIERS) test
684427cc 1621 Set Default 'startdir'
1622};
1623}
1624
684427cc 1625# --- Test and Installation Sections ---
1626
8e03a37c 1627=item install (override)
1628
1629Work around DCL's 255 character limit several times,and use
1630VMS-style command line quoting in a few cases.
684427cc 1631
8e03a37c 1632=cut
684427cc 1633
1634sub install {
1635 my($self, %attribs) = @_;
a5f75d66 1636 my(@m,@docfiles);
684427cc 1637
a5f75d66 1638 if ($self->{EXE_FILES}) {
1639 my($line,$file) = ('','');
1640 foreach $file (@{$self->{EXE_FILES}}) {
1641 $line .= "$file ";
1642 if (length($line) > 128) {
f6d6199c 1643 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]);
a5f75d66 1644 $line = '';
1645 }
1646 }
f6d6199c 1647 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
c07a80fd 1648 }
c07a80fd 1649
1650 push @m, q[
a5f75d66 1651install :: all pure_install doc_install
5ab4150f 1652 $(NOECHO) $(NOOP)
a5f75d66 1653
1654install_perl :: all pure_perl_install doc_perl_install
5ab4150f 1655 $(NOECHO) $(NOOP)
a5f75d66 1656
1657install_site :: all pure_site_install doc_site_install
5ab4150f 1658 $(NOECHO) $(NOOP)
a5f75d66 1659
a5f75d66 1660pure_install :: pure_$(INSTALLDIRS)_install
5ab4150f 1661 $(NOECHO) $(NOOP)
a5f75d66 1662
1663doc_install :: doc_$(INSTALLDIRS)_install
774d564b 1664 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
a5f75d66 1665
1666pure__install : pure_site_install
774d564b 1667 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
a5f75d66 1668
1669doc__install : doc_site_install
4fdae800 1670 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
a5f75d66 1671
1672# This hack brought to you by DCL's 255-character command line limit
1673pure_perl_install ::
e0678a30 1674 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1675 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
5ab4150f 1676 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1677 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1678 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1679 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1680 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1681 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
a5f75d66 1682 $(MOD_INSTALL) <.MM_tmp
5ab4150f 1683 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
f6d6199c 1684 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
a5f75d66 1685
1686# Likewise
1687pure_site_install ::
e0678a30 1688 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1689 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
5ab4150f 1690 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1691 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
5c161494 1692 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLSITEBIN) '" >>.MM_tmp
5ab4150f 1693 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
5c161494 1694 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) '" >>.MM_tmp
1695 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) '" >>.MM_tmp
a5f75d66 1696 $(MOD_INSTALL) <.MM_tmp
5ab4150f 1697 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
f6d6199c 1698 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
a5f75d66 1699
5c161494 1700pure_vendor_install ::
1701 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLVENDORLIB) '" >>.MM_tmp
1702 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLVENDORARCH) '" >>.MM_tmp
1703 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLVENDORBIN) '" >>.MM_tmp
1704 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1705 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) '" >>.MM_tmp
1706 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) '" >>.MM_tmp
1707 $(MOD_INSTALL) <.MM_tmp
1708 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
1709
a5f75d66 1710# Ditto
1711doc_perl_install ::
5ab4150f 1712 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
b4492ac4 1713 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
5ab4150f 1714],@docfiles,
81ff29e3 1715q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
b4492ac4 1716 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
5ab4150f 1717 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1718 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
f6d6199c 1719 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
5ab4150f 1720 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
a5f75d66 1721
1722# And again
1723doc_site_install ::
5ab4150f 1724 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
b4492ac4 1725 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
5ab4150f 1726],@docfiles,
81ff29e3 1727q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
b4492ac4 1728 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
5ab4150f 1729 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1730 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
f6d6199c 1731 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
5ab4150f 1732 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
a5f75d66 1733
5c161494 1734doc_vendor_install ::
1735
c07a80fd 1736];
1737
a5f75d66 1738 push @m, q[
1739uninstall :: uninstall_from_$(INSTALLDIRS)dirs
5ab4150f 1740 $(NOECHO) $(NOOP)
a5f75d66 1741
1742uninstall_from_perldirs ::
f6d6199c 1743 $(NOECHO) $(UNINSTALL) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
774d564b 1744 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1745 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1746 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
a5f75d66 1747
1748uninstall_from_sitedirs ::
f6d6199c 1749 $(NOECHO) $(UNINSTALL) ],File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[
774d564b 1750 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1751 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1752 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1753];
684427cc 1754
a5f75d66 1755 join('',@m);
684427cc 1756}
1757
8e03a37c 1758=item perldepend (override)
1759
1760Use VMS-style syntax for files; it's cheaper to just do it directly here
97abc6ad 1761than to have the MM_Unix method call C<catfile> repeatedly. Also, if
8e03a37c 1762we have to rebuild Config.pm, use MM[SK] to do it.
1763
1764=cut
684427cc 1765
1766sub perldepend {
1767 my($self) = @_;
684427cc 1768 my(@m);
1769
1770 push @m, '
8c7f0036 1771$(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1772$(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1773$(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1774$(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)fakethr.h, $(PERL_INC)form.h
1775$(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1776$(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1777$(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1778$(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)opnames.h, $(PERL_INC)patchlevel.h
1779$(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlapi.h, $(PERL_INC)perlio.h
1780$(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlsfio.h, $(PERL_INC)perlvars.h
1781$(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1782$(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1783$(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1784$(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h, $(PERL_INC)utf8.h
1785$(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h
684427cc 1786
1787' if $self->{OBJECT};
1788
8e03a37c 1789 if ($self->{PERL_SRC}) {
1790 my(@macros);
1791 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
e0678a30 1792 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
8e03a37c 1793 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1794 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1795 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1796 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1797 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1798 push(@m,q[
684427cc 1799# Check for unpropagated config.sh changes. Should never happen.
1800# We do NOT just update config.h because that is not sufficient.
1801# An out of date config.h is not fatal but complains loudly!
97abc6ad 1802$(PERL_INC)config.h : $(PERL_SRC)config.sh
22d4bb9c 1803 $(NOOP)
684427cc 1804
97abc6ad 1805$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1806 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
684427cc 1807 olddef = F$Environment("Default")
1808 Set Default $(PERL_SRC)
aa689395 1809 $(MMS)],$mmsquals,);
1810 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
b7b1864f 1811 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
aa689395 1812 $target =~ s/\Q$prefix/[/;
1813 push(@m," $target");
1814 }
1815 else { push(@m,' $(MMS$TARGET)'); }
1816 push(@m,q[
8e03a37c 1817 Set Default 'olddef'
1818]);
1819 }
684427cc 1820
b7b1864f 1821 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
684427cc 1822 if %{$self->{XS}};
1823
1824 join('',@m);
1825}
1826
8e03a37c 1827=item makefile (override)
1828
1829Use VMS commands and quoting.
1830
1831=cut
1832
684427cc 1833sub makefile {
1834 my($self) = @_;
684427cc 1835 my(@m,@cmd);
1836 # We do not know what target was originally specified so we
1837 # must force a manual rerun to be sure. But as it should only
1838 # happen very rarely it is not a significant problem.
8e03a37c 1839 push @m, q[
684427cc 1840$(OBJECT) : $(FIRST_MAKEFILE)
8e03a37c 1841] if $self->{OBJECT};
684427cc 1842
8e03a37c 1843 push @m,q[
684427cc 1844# We take a very conservative approach here, but it\'s worth it.
1845# We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1846$(MAKEFILE) : Makefile.PL $(CONFIGDEP)
774d564b 1847 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1848 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
684427cc 1849 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
9607fc9c 1850 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
f6d6199c 1851 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
774d564b 1852 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1853 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
8e03a37c 1854];
684427cc 1855
1856 join('',@m);
1857}
1858
45bc4d3a 1859=item find_tests (override)
1860
1861=cut
1862
1863sub find_tests {
1864 my $self = shift;
1865 return -d 't' ? 't/*.t' : '';
1866}
1867
8e03a37c 1868=item test (override)
1869
1870Use VMS commands for handling subdirectories.
1871
1872=cut
684427cc 1873
1874sub test {
1875 my($self, %attribs) = @_;
45bc4d3a 1876 my($tests) = $attribs{TESTS} || $self->find_tests;
684427cc 1877 my(@m);
1878 push @m,"
1879TEST_VERBOSE = 0
8e03a37c 1880TEST_TYPE = test_\$(LINKTYPE)
f1387719 1881TEST_FILE = test.pl
1882TESTDB_SW = -d
8e03a37c 1883
1884test :: \$(TEST_TYPE)
5ab4150f 1885 \$(NOECHO) \$(NOOP)
684427cc 1886
8e03a37c 1887testdb :: testdb_\$(LINKTYPE)
5ab4150f 1888 \$(NOECHO) \$(NOOP)
8e03a37c 1889
684427cc 1890";
1891 foreach(@{$self->{DIR}}){
1892 my($vmsdir) = $self->fixpath($_,1);
1893 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
9607fc9c 1894 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
684427cc 1895 }
774d564b 1896 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
684427cc 1897 unless $tests or -f "test.pl" or @{$self->{DIR}};
1898 push(@m, "\n");
1899
8e03a37c 1900 push(@m, "test_dynamic :: pure_all\n");
75e2e551 1901 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1902 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
5ab4150f 1903 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
684427cc 1904 push(@m, "\n");
1905
f1387719 1906 push(@m, "testdb_dynamic :: pure_all\n");
75e2e551 1907 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
f1387719 1908 push(@m, "\n");
8e03a37c 1909
684427cc 1910 # Occasionally we may face this degenerate target:
1911 push @m, "test_ : test_dynamic\n\n";
1912
8e03a37c 1913 if ($self->needs_linking()) {
1914 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
684427cc 1915 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
f1387719 1916 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1917 push(@m, "\n");
1918 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1919 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
684427cc 1920 push(@m, "\n");
1921 }
1922 else {
5ab4150f 1923 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1924 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
684427cc 1925 }
1926
1927 join('',@m);
1928}
1929
8e03a37c 1930=item makeaperl (override)
1931
1932Undertake to build a new set of Perl images using VMS commands. Since
1933VMS does dynamic loading, it's not necessary to statically link each
1934extension into the Perl image, so this isn't the normal build path.
1935Consequently, it hasn't really been tested, and may well be incomplete.
1936
1937=cut
684427cc 1938
18541947 1939our %olbs;
1940
684427cc 1941sub makeaperl {
1942 my($self, %attribs) = @_;
684427cc 1943 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1944 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1945 my(@m);
1946 push @m, "
1947# --- MakeMaker makeaperl section ---
1948MAP_TARGET = $target
684427cc 1949";
1950 return join '', @m if $self->{PARENT};
1951
1952 my($dir) = join ":", @{$self->{DIR}};
1953
1954 unless ($self->{MAKEAPERL}) {
1955 push @m, q{
684427cc 1956$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
774d564b 1957 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
f6d6199c 1958 $(NOECHO) $(PERLRUNINST) \
684427cc 1959 Makefile.PL DIR=}, $dir, q{ \
1960 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
d5e3fa33 1961 MAKEAPERL=1 NORECURS=1 };
1962
1963 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
684427cc 1964
0d8023a2 1965$(MAP_TARGET) :: $(MAKE_APERL_FILE)
9607fc9c 1966 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
0d8023a2 1967};
684427cc 1968 push @m, "\n";
1969
1970 return join '', @m;
1971 }
1972
1973
0c2a65fc 1974 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1975 local($_);
684427cc 1976
1977 # The front matter of the linkcommand...
1978 $linkcmd = join ' ', $Config{'ld'},
1979 grep($_, @Config{qw(large split ldflags ccdlflags)});
1980 $linkcmd =~ s/\s+/ /g;
1981
1982 # Which *.olb files could we make use of...
18541947 1983 local(%olbs); # XXX can this be lexical?
684427cc 1984 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
8e03a37c 1985 require File::Find;
684427cc 1986 File::Find::find(sub {
1987 return unless m/\Q$self->{LIB_EXT}\E$/;
1988 return if m/^libperl/;
f1387719 1989
1990 if( exists $self->{INCLUDE_EXT} ){
1991 my $found = 0;
1992 my $incl;
1993 my $xx;
1994
1995 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1996 $xx =~ s,/?$_,,;
1997 $xx =~ s,/,::,g;
1998
1999 # Throw away anything not explicitly marked for inclusion.
2000 # DynaLoader is implied.
2001 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2002 if( $xx eq $incl ){
2003 $found++;
2004 last;
2005 }
2006 }
2007 return unless $found;
2008 }
2009 elsif( exists $self->{EXCLUDE_EXT} ){
2010 my $excl;
2011 my $xx;
2012
2013 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2014 $xx =~ s,/?$_,,;
2015 $xx =~ s,/,::,g;
2016
2017 # Throw away anything explicitly marked for exclusion
2018 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2019 return if( $xx eq $excl );
2020 }
2021 }
2022
684427cc 2023 $olbs{$ENV{DEFAULT}} = $_;
2024 }, grep( -d $_, @{$searchdirs || []}));
2025
2026 # We trust that what has been handed in as argument will be buildable
2027 $static = [] unless $static;
2028 @olbs{@{$static}} = (1) x @{$static};
2029
2030 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2031 # Sort the object libraries in inverse order of
2032 # filespec length to try to insure that dependent extensions
2033 # will appear before their parents, so the linker will
2034 # search the parent library to resolve references.
2035 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2036 # references from [.intuit.dwim]dwim.obj can be found
2037 # in [.intuit]intuit.olb).
0c2a65fc 2038 for (sort { length($a) <=> length($b) } keys %olbs) {
684427cc 2039 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2040 my($dir) = $self->fixpath($_,1);
2041 my($extralibs) = $dir . "extralibs.ld";
2042 my($extopt) = $dir . $olbs{$_};
2043 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
0c2a65fc 2044 push @optlibs, "$dir$olbs{$_}";
2045 # Get external libraries this extension will need
684427cc 2046 if (-f $extralibs ) {
0c2a65fc 2047 my %seenthis;
684427cc 2048 open LIST,$extralibs or warn $!,next;
0c2a65fc 2049 while (<LIST>) {
2050 chomp;
2051 # Include a library in the link only once, unless it's mentioned
2052 # multiple times within a single extension's options file, in which
2053 # case we assume the builder needed to search it again later in the
2054 # link.
2055 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2056 $libseen{$_}++; $seenthis{$_}++;
2057 next if $skip;
2058 push @$extra,$_;
2059 }
684427cc 2060 close LIST;
2061 }
0c2a65fc 2062 # Get full name of extension for ExtUtils::Miniperl
684427cc 2063 if (-f $extopt) {
2064 open OPT,$extopt or die $!;
2065 while (<OPT>) {
2066 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
0c2a65fc 2067 my $pkg = $1;
2068 $pkg =~ s#__*#::#g;
684427cc 2069 push @staticpkgs,$pkg;
2070 }
684427cc 2071 }
2072 }
0c2a65fc 2073 # Place all of the external libraries after all of the Perl extension
2074 # libraries in the final link, in order to maximize the opportunity
2075 # for XS code from multiple extensions to resolve symbols against the
2076 # same external library while only including that library once.
2077 push @optlibs, @$extra;
684427cc 2078
ff0cee69 2079 $target = "Perl$Config{'exe_ext'}" unless $target;
18541947 2080 my $shrtarget;
684427cc 2081 ($shrtarget,$targdir) = fileparse($target);
2082 $shrtarget =~ s/^([^.]*)/$1Shr/;
2083 $shrtarget = $targdir . $shrtarget;
2084 $target = "Perlshr.$Config{'dlext'}" unless $target;
2085 $tmp = "[]" unless $tmp;
2086 $tmp = $self->fixpath($tmp,1);
0c2a65fc 2087 if (@optlibs) { $extralist = join(' ',@optlibs); }
2088 else { $extralist = ''; }
562a7b0c 2089 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
0c2a65fc 2090 # that's what we're building here).
adeacccf 2091 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
684427cc 2092 if ($libperl) {
ecf68df6 2093 unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) {
684427cc 2094 print STDOUT "Warning: $libperl not found\n";
2095 undef $libperl;
2096 }
2097 }
2098 unless ($libperl) {
2099 if (defined $self->{PERL_SRC}) {
ecf68df6 2100 $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2101 } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
684427cc 2102 } else {
2103 print STDOUT "Warning: $libperl not found
2104 If you're going to build a static perl binary, make sure perl is installed
2105 otherwise ignore this warning\n";
2106 }
2107 }
2108 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2109
2110 push @m, '
2111# Fill in the target you want to produce if it\'s not perl
b7b1864f 2112MAP_TARGET = ',$self->fixpath($target,0),'
2113MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
684427cc 2114MAP_LINKCMD = $linkcmd
0c2a65fc 2115MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
684427cc 2116MAP_EXTRA = $extralist
b7b1864f 2117MAP_LIBPERL = ",$self->fixpath($libperl,0),'
684427cc 2118';
2119
2120
0c2a65fc 2121 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2122 foreach (@optlibs) {
2123 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2124 }
2125 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2126 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2127
2128push @m,'
2129$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2130 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
684427cc 2131$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2132 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
774d564b 2133 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
9607fc9c 2134 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
774d564b 2135 $(NOECHO) $(SAY) "To remove the intermediate files, say
9607fc9c 2136 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
684427cc 2137';
0c2a65fc 2138 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2139 push @m, "# More from the 255-char line length limit\n";
2140 foreach (@staticpkgs) {
2141 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2142 }
2143 push @m,'
2144 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2145 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
684427cc 2146
a5f75d66 2147 push @m, q[
0c2a65fc 2148# Still more from the 255-char line length limit
684427cc 2149doc_inst_perl :
5ab4150f 2150 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2151 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
ecf68df6 2152 $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
5ab4150f 2153 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
ecf68df6 2154 $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
5ab4150f 2155 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
a5f75d66 2156];
684427cc 2157
2158 push @m, "
2159inst_perl : pure_inst_perl doc_inst_perl
5ab4150f 2160 \$(NOECHO) \$(NOOP)
684427cc 2161
2162pure_inst_perl : \$(MAP_TARGET)
2163 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2164 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2165
2166clean :: map_clean
5ab4150f 2167 \$(NOECHO) \$(NOOP)
684427cc 2168
2169map_clean :
2170 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
0c2a65fc 2171 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
684427cc 2172";
2173
2174 join '', @m;
2175}
2176
8e03a37c 2177# --- Output postprocessing section ---
684427cc 2178
8e03a37c 2179=item nicetext (override)
684427cc 2180
8e03a37c 2181Insure that colons marking targets are preceded by space, in order
2182to distinguish the target delimiter from a colon appearing as
2183part of a filespec.
684427cc 2184
8e03a37c 2185=cut
684427cc 2186
2187sub nicetext {
684427cc 2188 my($self,$text) = @_;
45bc4d3a 2189 return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
684427cc 2190 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
2191 $text;
2192}
2193
45bc4d3a 2194=item prefixify (override)
2195
2196prefixifying on VMS is simple. Each should simply be:
2197
2198 perl_root:[some.dir]
2199
2200which can just be converted to:
2201
2202 volume:[your.prefix.some.dir]
2203
2204otherwise you get the default layout.
2205
2206In effect, your search prefix is ignored and $Config{vms_prefix} is
2207used instead.
2208
2209=cut
2210
2211sub prefixify {
2212 my($self, $var, $sprefix, $rprefix, $default) = @_;
2213 $default = VMS::Filespec::vmsify($default)
2214 unless $default =~ /\[.*\]/;
2215
2216 (my $var_no_install = $var) =~ s/^install//;
2217 my $path = $self->{uc $var} || $Config{lc $var} ||
2218 $Config{lc $var_no_install};
2219
2220 if( !$path ) {
2221 print STDERR " no Config found for $var.\n" if $Verbose >= 2;
2222 $path = $self->_prefixify_default($rprefix, $default);
2223 }
2224 elsif( $sprefix eq $rprefix ) {
2225 print STDERR " no new prefix.\n" if $Verbose >= 2;
2226 }
2227 else {
2228
2229 print STDERR " prefixify $var => $path\n" if $Verbose >= 2;
2230 print STDERR " from $sprefix to $rprefix\n" if $Verbose >= 2;
2231
2232 my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
2233 if( $path_vol eq $Config{vms_prefix}.':' ) {
2234 print STDERR " $Config{vms_prefix}: seen\n" if $Verbose >= 2;
2235
2236 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
2237 $path = $self->_catprefix($rprefix, $path_dirs);
2238 }
2239 else {
2240 $path = $self->_prefixify_default($rprefix, $default);
2241 }
2242 }
2243
2244 print " now $path\n" if $Verbose >= 2;
2245 return $self->{uc $var} = $path;
2246}
2247
2248
2249sub _prefixify_default {
2250 my($self, $rprefix, $default) = @_;
2251
2252 print STDERR " cannot prefix, using default.\n" if $Verbose >= 2;
2253
2254 if( !$default ) {
2255 print STDERR "No default!\n" if $Verbose >= 1;
2256 return;
2257 }
2258 if( !$rprefix ) {
2259 print STDERR "No replacement prefix!\n" if $Verbose >= 1;
2260 return '';
2261 }
2262
2263 return $self->_catprefix($rprefix, $default);
2264}
2265
2266sub _catprefix {
2267 my($self, $rprefix, $default) = @_;
2268
2269 my($rvol, $rdirs) = File::Spec->splitpath($rprefix);
2270 if( $rvol ) {
2271 return File::Spec->catpath($rvol,
2272 File::Spec->catdir($rdirs, $default),
2273 ''
2274 )
2275 }
2276 else {
2277 return File::Spec->catdir($rdirs, $default);
2278 }
2279}
2280
684427cc 2281
2ae324a7 2282=back
2283
2284=cut
2285
45bc4d3a 22861;
f1387719 2287