Unused variables.
[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 [
e0678a30 425 INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB INSTALLPRIVLIB
f1387719 426 INSTALLARCHLIB INSTALLSCRIPT INSTALLBIN PERL_LIB PERL_ARCHLIB
427 PERL_INC PERL_SRC FULLEXT INST_MAN1DIR INSTALLMAN1DIR
428 INST_MAN3DIR INSTALLMAN3DIR INSTALLSITELIB INSTALLSITEARCH
429 SITELIBEXP SITEARCHEXP ] ) {
a5f75d66 430 next unless defined $self->{$macro};
431 $self->{$macro} = $self->fixpath($self->{$macro},1);
432 }
ecf68df6 433 $self->{PERL_VMS} = File::Spec->catdir($self->{PERL_SRC},q(VMS))
a5f75d66 434 if ($self->{PERL_SRC});
435
436
437
438 # Fix up file specs
439 foreach $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKE_APERL_FILE MYEXTLIB] ) {
440 next unless defined $self->{$macro};
b7b1864f 441 $self->{$macro} = $self->fixpath($self->{$macro},0);
a5f75d66 442 }
443
f1387719 444 foreach $macro (qw/
a5f75d66 445 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
e0678a30 446 INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT PREFIX
f1387719 447 INSTALLDIRS INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
448 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
a5f75d66 449 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
450 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC PERL_VMS
75e2e551 451 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
e0678a30 452 FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST
453 PERL_CORE NOECHO NOOP
a5f75d66 454 / ) {
f1387719 455 next unless defined $self->{$macro};
456 push @m, "$macro = $self->{$macro}\n";
a5f75d66 457 }
458
459
460 push @m, q[
461VERSION_MACRO = VERSION
462DEFINE_VERSION = "$(VERSION_MACRO)=""$(VERSION)"""
463XS_VERSION_MACRO = XS_VERSION
464XS_DEFINE_VERSION = "$(XS_VERSION_MACRO)=""$(XS_VERSION)"""
465
ecf68df6 466MAKEMAKER = ],File::Spec->catfile($self->{PERL_LIB},'ExtUtils','MakeMaker.pm'),qq[
a5f75d66 467MM_VERSION = $ExtUtils::MakeMaker::VERSION
468MM_REVISION = $ExtUtils::MakeMaker::Revision
469MM_VMS_REVISION = $ExtUtils::MM_VMS::Revision
470
471# FULLEXT = Pathname for extension directory (eg DBD/Oracle).
472# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
f1387719 473# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
a5f75d66 474# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
475];
476
18541947 477 for my $tmp (qw/
5ab4150f 478 FULLEXT VERSION_FROM OBJECT LDFROM
479 / ) {
480 next unless defined $self->{$tmp};
b7b1864f 481 push @m, "$tmp = ",$self->fixpath($self->{$tmp},0),"\n";
5ab4150f 482 }
483
18541947 484 for my $tmp (qw/
5ab4150f 485 BASEEXT PARENT_NAME DLBASE INC DEFINE LINKTYPE
a5f75d66 486 / ) {
487 next unless defined $self->{$tmp};
488 push @m, "$tmp = $self->{$tmp}\n";
489 }
490
18541947 491 for my $tmp (qw/ XS MAN1PODS MAN3PODS PM /) {
1a535d6f 492 # Where is the space coming from? --jhi
493 next unless $self ne " " && defined $self->{$tmp};
f1387719 494 my(%tmp,$key);
495 for $key (keys %{$self->{$tmp}}) {
b7b1864f 496 $tmp{$self->fixpath($key,0)} = $self->fixpath($self->{$tmp}{$key},0);
f1387719 497 }
498 $self->{$tmp} = \%tmp;
499 }
500
18541947 501 for my $tmp (qw/ C O_FILES H /) {
f1387719 502 next unless defined $self->{$tmp};
503 my(@tmp,$val);
504 for $val (@{$self->{$tmp}}) {
b7b1864f 505 push(@tmp,$self->fixpath($val,0));
f1387719 506 }
507 $self->{$tmp} = \@tmp;
508 }
509
a5f75d66 510 push @m,'
684427cc 511
512# Handy lists of source code files:
17f28c40 513XS_FILES = ',$self->wraplist(sort keys %{$self->{XS}}),'
514C_FILES = ',$self->wraplist(@{$self->{C}}),'
515O_FILES = ',$self->wraplist(@{$self->{O_FILES}} ),'
516H_FILES = ',$self->wraplist(@{$self->{H}}),'
517MAN1PODS = ',$self->wraplist(sort keys %{$self->{MAN1PODS}}),'
518MAN3PODS = ',$self->wraplist(sort keys %{$self->{MAN3PODS}}),'
684427cc 519
a5f75d66 520';
684427cc 521
18541947 522 for my $tmp (qw/
a5f75d66 523 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
524 /) {
525 next unless defined $self->{$tmp};
526 push @m, "$tmp = $self->{$tmp}\n";
527 }
684427cc 528
a5f75d66 529push @m,"
9cae3221 530makemakerdflt : all
f6d6199c 531 \$(NOECHO) \$(NOOP)
9cae3221 532
f86702cc 533.SUFFIXES :
f1387719 534.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
684427cc 535
536# Here is the Config.pm that we are using/depend on
c07a80fd 537CONFIGDEP = \$(PERL_ARCHLIB)Config.pm, \$(PERL_INC)config.h \$(VERSION_FROM)
684427cc 538
539# Where to put things:
5ab4150f 540INST_LIBDIR = $self->{INST_LIBDIR}
541INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR}
684427cc 542
5ab4150f 543INST_AUTODIR = $self->{INST_AUTODIR}
544INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
545";
684427cc 546
547 if ($self->has_link_code()) {
548 push @m,'
549INST_STATIC = $(INST_ARCHAUTODIR)$(BASEEXT)$(LIB_EXT)
4b19af01 550INST_DYNAMIC = $(INST_ARCHAUTODIR)$(DLBASE).$(DLEXT)
684427cc 551INST_BOOT = $(INST_ARCHAUTODIR)$(BASEEXT).bs
552';
553 } else {
17f28c40 554 my $shr = $Config{'dbgprefix'} . 'PERLSHR';
684427cc 555 push @m,'
556INST_STATIC =
557INST_DYNAMIC =
558INST_BOOT =
c07a80fd 559EXPORT_LIST = $(BASEEXT).opt
17f28c40 560PERL_ARCHIVE = ',($ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"),'
684427cc 561';
562 }
563
f1387719 564 $self->{TO_INST_PM} = [ sort keys %{$self->{PM}} ];
565 $self->{PM_TO_BLIB} = [ %{$self->{PM}} ];
684427cc 566 push @m,'
17f28c40 567TO_INST_PM = ',$self->wraplist(@{$self->{TO_INST_PM}}),'
8e03a37c 568
17f28c40 569PM_TO_BLIB = ',$self->wraplist(@{$self->{PM_TO_BLIB}}),'
684427cc 570';
571
572 join('',@m);
573}
574
8e03a37c 575=item cflags (override)
684427cc 576
8e03a37c 577Bypass shell script and produce qualifiers for CC directly (but warn
578user if a shell script for this extension exists). Fold multiple
5ab4150f 579/Defines into one, since some C compilers pay attention to only one
580instance of this qualifier on the command line.
8e03a37c 581
582=cut
583
584sub cflags {
684427cc 585 my($self,$libperl) = @_;
09b7f37c 586 my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
587 my($definestr,$undefstr,$flagoptstr) = ('','','');
588 my($incstr) = '/Include=($(PERL_INC)';
684427cc 589 my($name,$sys,@m);
590
591 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
592 print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
593 " required to modify CC command for $self->{'BASEEXT'}\n"
594 if ($Config{$name});
595
09b7f37c 596 if ($quals =~ / -[DIUOg]/) {
597 while ($quals =~ / -([Og])(\d*)\b/) {
598 my($type,$lvl) = ($1,$2);
599 $quals =~ s/ -$type$lvl\b\s*//;
600 if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
601 else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
602 }
603 while ($quals =~ / -([DIU])(\S+)/) {
604 my($type,$def) = ($1,$2);
605 $quals =~ s/ -$type$def\s*//;
606 $def =~ s/"/""/g;
607 if ($type eq 'D') { $definestr .= qq["$def",]; }
0c2a65fc 608 elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
09b7f37c 609 else { $undefstr .= qq["$def",]; }
610 }
611 }
612 if (length $quals and $quals !~ m!/!) {
613 warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
614 $quals = '';
615 }
d5e3fa33 616 $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
09b7f37c 617 if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
618 if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; }
684427cc 619 # Deal with $self->{DEFINE} here since some C compilers pay attention
620 # to only one /Define clause on command line, so we have to
09b7f37c 621 # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
1f47e8e2 622 # ($self->{DEFINE} has already been VMSified in constants() above)
623 if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
18541947 624 for my $type (qw(Def Undef)) {
1f47e8e2 625 my(@terms);
626 while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
627 my $term = $1;
628 $term =~ s:^\((.+)\)$:$1:;
629 push @terms, $term;
630 }
631 if ($type eq 'Def') {
632 push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
633 }
634 if (@terms) {
635 $quals =~ s:/${type}i?n?e?=[^/]+::ig;
636 $quals .= "/${type}ine=(" . join(',',@terms) . ')';
637 }
684427cc 638 }
639
640 $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
684427cc 641
642 # Likewise with $self->{INC} and /Include
684427cc 643 if ($self->{'INC'}) {
644 my(@includes) = split(/\s+/,$self->{INC});
645 foreach (@includes) {
646 s/^-I//;
0c2a65fc 647 $incstr .= ','.$self->fixpath($_,1);
684427cc 648 }
649 }
5ab4150f 650 $quals .= "$incstr)";
1f47e8e2 651# $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
09b7f37c 652 $self->{CCFLAGS} = $quals;
684427cc 653
e0678a30 654 $self->{PERLTYPE} ||= '';
655
09b7f37c 656 $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
657 if ($self->{OPTIMIZE} !~ m!/!) {
c1c69de6 658 if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
09b7f37c 659 elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
660 $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
661 }
662 else {
663 warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
664 $self->{OPTIMIZE} = '/Optimize';
665 }
666 }
8e03a37c 667
668 return $self->{CFLAGS} = qq{
09b7f37c 669CCFLAGS = $self->{CCFLAGS}
670OPTIMIZE = $self->{OPTIMIZE}
671PERLTYPE = $self->{PERLTYPE}
8e03a37c 672SPLIT =
673LARGE =
674};
675}
676
677=item const_cccmd (override)
678
679Adds directives to point C preprocessor to the right place when
81ff29e3 680handling #include E<lt>sys/foo.hE<gt> directives. Also constructs CC
8e03a37c 681command line a bit differently than MM_Unix method.
684427cc 682
8e03a37c 683=cut
684
685sub const_cccmd {
686 my($self,$libperl) = @_;
8e03a37c 687 my(@m);
688
689 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
690 return '' unless $self->needs_linking();
691 if ($Config{'vms_cc_type'} eq 'gcc') {
684427cc 692 push @m,'
693.FIRST
8e03a37c 694 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
695 }
696 elsif ($Config{'vms_cc_type'} eq 'vaxc') {
697 push @m,'
698.FIRST
699 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
700 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
701 }
702 else {
703 push @m,'
704.FIRST
705 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
e0678a30 706 ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
8e03a37c 707 ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
708 }
684427cc 709
8e03a37c 710 push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
684427cc 711
8e03a37c 712 $self->{CONST_CCCMD} = join('',@m);
684427cc 713}
714
8e03a37c 715=item pm_to_blib (override)
684427cc 716
8e03a37c 717DCL I<still> accepts a maximum of 255 characters on a command
718line, so we write the (potentially) long list of file names
719to a temp file, then persuade Perl to read it instead of the
720command line to find args.
721
722=cut
723
724sub pm_to_blib {
725 my($self) = @_;
8e03a37c 726 my($line,$from,$to,@m);
73eb9af1 727 my($autodir) = File::Spec->catdir($self->{INST_LIB},'auto');
8e03a37c 728 my(@files) = @{$self->{PM_TO_BLIB}};
729
730 push @m, q{
5ab4150f 731
732# Dummy target to match Unix target name; we use pm_to_blib.ts as
733# timestamp file to avoid repeated invocations under VMS
734pm_to_blib : pm_to_blib.ts
735 $(NOECHO) $(NOOP)
736
8e03a37c 737# As always, keep under DCL's 255-char limit
5ab4150f 738pm_to_blib.ts : $(TO_INST_PM)
739 $(NOECHO) $(PERL) -e "print '},shift(@files),q{ },shift(@files),q{'" >.MM_tmp
8e03a37c 740};
741
742 $line = ''; # avoid uninitialized var warning
743 while ($from = shift(@files),$to = shift(@files)) {
744 $line .= " $from $to";
745 if (length($line) > 128) {
5ab4150f 746 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n");
8e03a37c 747 $line = '';
748 }
749 }
5ab4150f 750 push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
8e03a37c 751
75e2e551 752 push(@m,q[ $(PERLRUN) "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
8e03a37c 753 push(@m,qq[
5ab4150f 754 \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
755 \$(NOECHO) \$(TOUCH) pm_to_blib.ts
8e03a37c 756]);
757
758 join('',@m);
759}
760
761=item tool_autosplit (override)
762
763Use VMS-style quoting on command line.
764
765=cut
684427cc 766
f6d6199c 767sub tool_autosplit {
684427cc 768 my($self, %attribs) = @_;
684427cc 769 my($asl) = "";
770 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
771 q{
772# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
f6d6199c 773AUTOSPLITFILE = $(PERLRUN) -e "use AutoSplit;}.$asl.q{autosplit($ARGV[0], $ARGV[1], 0, 1, 1) ;"
684427cc 774};
775}
776
8e03a37c 777=item tool_sxubpp (override)
778
779Use VMS-style quoting on xsubpp command line.
780
781=cut
782
f1387719 783sub tool_xsubpp {
684427cc 784 my($self) = @_;
f1387719 785 return '' unless $self->needs_linking;
ecf68df6 786 my($xsdir) = File::Spec->catdir($self->{PERL_LIB},'ExtUtils');
684427cc 787 # drop back to old location if xsubpp is not in new location yet
ecf68df6 788 $xsdir = File::Spec->catdir($self->{PERL_SRC},'ext') unless (-f File::Spec->catfile($xsdir,'xsubpp'));
684427cc 789 my(@tmdeps) = '$(XSUBPPDIR)typemap';
790 if( $self->{TYPEMAPS} ){
791 my $typemap;
792 foreach $typemap (@{$self->{TYPEMAPS}}){
793 if( ! -f $typemap ){
794 warn "Typemap $typemap not found.\n";
795 }
796 else{
b7b1864f 797 push(@tmdeps, $self->fixpath($typemap,0));
684427cc 798 }
799 }
800 }
801 push(@tmdeps, "typemap") if -f "typemap";
802 my(@tmargs) = map("-typemap $_", @tmdeps);
803 if( exists $self->{XSOPT} ){
804 unshift( @tmargs, $self->{XSOPT} );
805 }
806
e3830a4e 807 if ($Config{'ldflags'} &&
808 $Config{'ldflags'} =~ m!/Debug!i &&
809 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)) {
810 unshift(@tmargs,'-nolinenumbers');
811 }
ecf68df6 812 my $xsubpp_version = $self->xsubpp_version(File::Spec->catfile($xsdir,'xsubpp'));
684427cc 813
814 # What are the correct thresholds for version 1 && 2 Paul?
815 if ( $xsubpp_version > 1.923 ){
816 $self->{XSPROTOARG} = '' unless defined $self->{XSPROTOARG};
817 } else {
818 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
819 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
820 Your version of xsubpp is $xsubpp_version and cannot handle this.
821 Please upgrade to a more recent version of xsubpp.
822};
823 } else {
824 $self->{XSPROTOARG} = "";
825 }
826 }
827
828 "
8e03a37c 829XSUBPPDIR = $xsdir
f6d6199c 830XSUBPP = \$(PERLRUN) \$(XSUBPPDIR)xsubpp
684427cc 831XSPROTOARG = $self->{XSPROTOARG}
832XSUBPPDEPS = @tmdeps
833XSUBPPARGS = @tmargs
834";
835}
836
8e03a37c 837=item xsubpp_version (override)
838
81ff29e3 839Test xsubpp exit status according to VMS rules ($sts & 1 ==E<gt> good)
840rather than Unix rules ($sts == 0 ==E<gt> good).
8e03a37c 841
842=cut
684427cc 843
844sub xsubpp_version
845{
846 my($self,$xsubpp) = @_;
847 my ($version) ;
f1387719 848 return '' unless $self->needs_linking;
684427cc 849
850 # try to figure out the version number of the xsubpp on the system
851
852 # first try the -v flag, introduced in 1.921 & 2.000a2
853
75e2e551 854 my $command = qq{$self->{PERL} "-I$self->{PERL_LIB}" $xsubpp -v};
684427cc 855 print "Running: $command\n" if $Verbose;
856 $version = `$command` ;
ff0cee69 857 if ($?) {
858 use vmsish 'status';
859 warn "Running '$command' exits with status $?";
860 }
684427cc 861 chop $version ;
862
863 return $1 if $version =~ /^xsubpp version (.*)/ ;
864
865 # nope, then try something else
866
867 my $counter = '000';
868 my ($file) = 'temp' ;
869 $counter++ while -e "$file$counter"; # don't overwrite anything
870 $file .= $counter;
871
872 local(*F);
873 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
874 print F <<EOM ;
875MODULE = fred PACKAGE = fred
876
877int
878fred(a)
879 int a;
880EOM
881
882 close F ;
883
75e2e551 884 $command = "$self->{PERLRUN} $xsubpp $file";
684427cc 885 print "Running: $command\n" if $Verbose;
886 my $text = `$command` ;
68dc0745 887 if ($?) {
888 use vmsish 'status';
889 warn "Running '$command' exits with status $?";
890 }
684427cc 891 unlink $file ;
892
893 # gets 1.2 -> 1.92 and 2.000a1
894 return $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
895
896 # it is either 1.0 or 1.1
897 return 1.1 if $text =~ /^Warning: ignored semicolon/ ;
898
899 # none of the above, so 1.0
900 return "1.0" ;
901}
902
8e03a37c 903=item tools_other (override)
904
905Adds a few MM[SK] macros, and shortens some the installatin commands,
906in order to stay under DCL's 255-character limit. Also changes
907EQUALIZE_TIMESTAMP to set revision date of target file to one second
908later than source file, since MMK interprets precisely equal revision
909dates for a source and target file as a sign that the target needs
910to be updated.
911
912=cut
684427cc 913
914sub tools_other {
915 my($self) = @_;
a5f75d66 916 qq!
684427cc 917# Assumes \$(MMS) invokes MMS or MMK
918# (It is assumed in some cases later that the default makefile name
919# (Descrip.MMS for MM[SK]) is used.)
920USEMAKEFILE = /Descrip=
921USEMACROS = /Macro=(
922MACROEND = )
923MAKEFILE = Descrip.MMS
924SHELL = Posix
684427cc 925TOUCH = $self->{TOUCH}
926CHMOD = $self->{CHMOD}
927CP = $self->{CP}
928MV = $self->{MV}
929RM_F = $self->{RM_F}
930RM_RF = $self->{RM_RF}
774d564b 931SAY = Write Sys\$Output
684427cc 932UMASK_NULL = $self->{UMASK_NULL}
933MKPATH = Create/Directory
a5f75d66 934EQUALIZE_TIMESTAMP = \$(PERL) -we "open F,qq{>\$ARGV[1]};close F;utime(0,(stat(\$ARGV[0]))[9]+1,\$ARGV[1])"
8e03a37c 935!. ($self->{PARENT} ? '' :
f1387719 936qq!WARN_IF_OLD_PACKLIST = \$(PERL) -e "if (-f \$ARGV[0]){print qq[WARNING: Old package found (\$ARGV[0]); please check for collisions\\n]}"
75e2e551 937MOD_INSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "install({split(' ',<STDIN>)},1);"
81ff29e3 938DOC_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 939UNINSTALL = \$(PERLRUN) "-MExtUtils::Install" -e "uninstall(\$ARGV[0],1,1);"
8e03a37c 940!);
684427cc 941}
942
8e03a37c 943=item dist (override)
944
945Provide VMSish defaults for some values, then hand off to
946default MM_Unix method.
947
948=cut
684427cc 949
950sub dist {
951 my($self, %attribs) = @_;
f1387719 952 $attribs{VERSION} ||= $self->{VERSION_SYM};
2ae324a7 953 $attribs{NAME} ||= $self->{DISTNAME};
8e03a37c 954 $attribs{ZIPFLAGS} ||= '-Vu';
955 $attribs{COMPRESS} ||= 'gzip';
956 $attribs{SUFFIX} ||= '-gz';
957 $attribs{SHAR} ||= 'vms_share';
958 $attribs{DIST_DEFAULT} ||= 'zipdist';
959
2ae324a7 960 # Sanitize these for use in $(DISTVNAME) filespec
961 $attribs{VERSION} =~ s/[^\w\$]/_/g;
62ecdc92 962 $attribs{NAME} =~ s/[^\w\$]/-/g;
2ae324a7 963
e0678a30 964 $attribs{DISTVNAME} ||= '$(DISTNAME)-$(VERSION_SYM)';
965
f6d6199c 966 return $self->SUPER::dist(%attribs);
684427cc 967}
968
8e03a37c 969=item c_o (override)
684427cc 970
8e03a37c 971Use VMS syntax on command line. In particular, $(DEFINE) and
972$(PERL_INC) have been pulled into $(CCCMD). Also use MM[SK] macros.
973
974=cut
684427cc 975
976sub c_o {
977 my($self) = @_;
684427cc 978 return '' unless $self->needs_linking();
979 '
980.c$(OBJ_EXT) :
981 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
8e03a37c 982
983.cpp$(OBJ_EXT) :
984 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
985
986.cxx$(OBJ_EXT) :
987 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
988
684427cc 989';
990}
991
8e03a37c 992=item xs_c (override)
993
994Use MM[SK] macros.
995
996=cut
997
684427cc 998sub xs_c {
999 my($self) = @_;
684427cc 1000 return '' unless $self->needs_linking();
1001 '
1002.xs.c :
1003 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
1004';
1005}
1006
8e03a37c 1007=item xs_o (override)
1008
1009Use MM[SK] macros, and VMS command line for C compiler.
1010
1011=cut
1012
684427cc 1013sub xs_o { # many makes are too dumb to use xs_c then c_o
1014 my($self) = @_;
684427cc 1015 return '' unless $self->needs_linking();
1016 '
1017.xs$(OBJ_EXT) :
1018 $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
1019 $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
1020';
1021}
1022
8e03a37c 1023=item top_targets (override)
684427cc 1024
f6d6199c 1025Path seperator differences.
684427cc 1026
8e03a37c 1027=cut
684427cc 1028
1029sub top_targets {
1030 my($self) = shift;
684427cc 1031 my(@m);
1032 push @m, '
8e03a37c 1033all :: pure_all manifypods
5ab4150f 1034 $(NOECHO) $(NOOP)
8e03a37c 1035
1036pure_all :: config pm_to_blib subdirs linkext
5ab4150f 1037 $(NOECHO) $(NOOP)
684427cc 1038
1039subdirs :: $(MYEXTLIB)
5ab4150f 1040 $(NOECHO) $(NOOP)
684427cc 1041
1042config :: $(MAKEFILE) $(INST_LIBDIR).exists
5ab4150f 1043 $(NOECHO) $(NOOP)
684427cc 1044
a5f75d66 1045config :: $(INST_ARCHAUTODIR).exists
5ab4150f 1046 $(NOECHO) $(NOOP)
684427cc 1047
1048config :: $(INST_AUTODIR).exists
5ab4150f 1049 $(NOECHO) $(NOOP)
684427cc 1050';
1051
684427cc 1052 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
1053 if (%{$self->{MAN1PODS}}) {
1054 push @m, q[
c07a80fd 1055config :: $(INST_MAN1DIR).exists
5ab4150f 1056 $(NOECHO) $(NOOP)
684427cc 1057];
1058 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1059 }
1060 if (%{$self->{MAN3PODS}}) {
1061 push @m, q[
1062config :: $(INST_MAN3DIR).exists
5ab4150f 1063 $(NOECHO) $(NOOP)
684427cc 1064];
1065 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1066 }
1067
1068 push @m, '
1069$(O_FILES) : $(H_FILES)
1070' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1071
1072 push @m, q{
1073help :
1074 perldoc ExtUtils::MakeMaker
1075};
1076
684427cc 1077 join('',@m);
1078}
1079
8e03a37c 1080=item dlsyms (override)
1081
1082Create VMS linker options files specifying universal symbols for this
1083extension's shareable image, and listing other shareable images or
1084libraries to which it should be linked.
1085
1086=cut
684427cc 1087
1088sub dlsyms {
1089 my($self,%attribs) = @_;
0d8023a2 1090
1091 return '' unless $self->needs_linking();
1092
684427cc 1093 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
a5f75d66 1094 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
762efda7 1095 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
684427cc 1096 my(@m);
1097
a5f75d66 1098 unless ($self->{SKIPHASH}{'dynamic'}) {
1099 push(@m,'
09b7f37c 1100dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
5ab4150f 1101 $(NOECHO) $(NOOP)
a5f75d66 1102');
a5f75d66 1103 }
684427cc 1104
1105 push(@m,'
1106static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
5ab4150f 1107 $(NOECHO) $(NOOP)
684427cc 1108') unless $self->{SKIPHASH}{'static'};
1109
f0585323 1110 push @m,'
684427cc 1111$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
1112 $(CP) $(MMS$SOURCE) $(MMS$TARGET)
684427cc 1113
c07a80fd 1114$(BASEEXT).opt : Makefile.PL
f6d6199c 1115 $(PERLRUN) -e "use ExtUtils::Mksymlists;" -
c07a80fd 1116 ',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
762efda7 1117 neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
f0585323 1118 q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
1119
1120 push @m, ' $(PERL) -e "print ""$(INST_STATIC)/Include=';
1121 if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
b6837a3b 1122 $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) {
1123 push @m, ($Config{d_vms_case_sensitive_symbols}
1124 ? uc($self->{BASEEXT}) :'$(BASEEXT)');
1125 }
f0585323 1126 else { # We don't have a "main" object file, so pull 'em all in
b6837a3b 1127 # Upcase module names if linker is being case-sensitive
1128 my($upcase) = $Config{d_vms_case_sensitive_symbols};
f0585323 1129 my(@omods) = map { s/\.[^.]*$//; # Trim off file type
1130 s[\$\(\w+_EXT\)][]; # even as a macro
1131 s/.*[:>\/\]]//; # Trim off dir spec
b6837a3b 1132 $upcase ? uc($_) : $_;
1133 } split ' ', $self->eliminate_macros($self->{OBJECT});
e3830a4e 1134 my($tmp,@lines,$elt) = '';
62ecdc92 1135 $tmp = shift @omods;
f0585323 1136 foreach $elt (@omods) {
1137 $tmp .= ",$elt";
1138 if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; }
1139 }
1140 push @lines, $tmp;
1141 push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
1142 }
1143 push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
684427cc 1144
55497cff 1145 if (length $self->{LDLOADLIBS}) {
1146 my($lib); my($line) = '';
1147 foreach $lib (split ' ', $self->{LDLOADLIBS}) {
1148 $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs
1149 if (length($line) + length($lib) > 160) {
9607fc9c 1150 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
55497cff 1151 $line = $lib . '\n';
1152 }
1153 else { $line .= $lib . '\n'; }
1154 }
9607fc9c 1155 push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
55497cff 1156 }
1157
684427cc 1158 join('',@m);
55497cff 1159
684427cc 1160}
1161
8e03a37c 1162=item dynamic_lib (override)
1163
1164Use VMS Link command.
684427cc 1165
8e03a37c 1166=cut
684427cc 1167
1168sub dynamic_lib {
1169 my($self, %attribs) = @_;
684427cc 1170 return '' unless $self->needs_linking(); #might be because of a subdir
1171
0d8023a2 1172 return '' unless $self->has_link_code();
684427cc 1173
c07a80fd 1174 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1175 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
17f28c40 1176 my $shr = $Config{'dbgprefix'} . 'PerlShr';
684427cc 1177 my(@m);
1178 push @m,"
1179
1180OTHERLDFLAGS = $otherldflags
c07a80fd 1181INST_DYNAMIC_DEP = $inst_dynamic_dep
684427cc 1182
1183";
1184 push @m, '
09b7f37c 1185$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
5ab4150f 1186 $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
0c2a65fc 1187 If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
09b7f37c 1188 Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
684427cc 1189';
1190
1191 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1192 join('',@m);
1193}
1194
8e03a37c 1195=item dynamic_bs (override)
1196
1197Use VMS-style quoting on Mkbootstrap command line.
1198
1199=cut
1200
684427cc 1201sub dynamic_bs {
1202 my($self, %attribs) = @_;
0d8023a2 1203 return '
1204BOOTSTRAP =
1205' unless $self->has_link_code();
684427cc 1206 '
1207BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1208
1209# As MakeMaker mkbootstrap might not write a file (if none is required)
1210# we use touch to prevent make continually trying to remake it.
1211# The DynaLoader only reads a non-empty file.
0d8023a2 1212$(BOOTSTRAP) : $(MAKEFILE) '."$self->{BOOTDEP}".' $(INST_ARCHAUTODIR).exists
774d564b 1213 $(NOECHO) $(SAY) "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
f6d6199c 1214 $(NOECHO) $(PERLRUN) -
684427cc 1215 -e "use ExtUtils::Mkbootstrap; Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
5ab4150f 1216 $(NOECHO) $(TOUCH) $(MMS$TARGET)
684427cc 1217
0d8023a2 1218$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR).exists
5ab4150f 1219 $(NOECHO) $(RM_RF) $(INST_BOOT)
684427cc 1220 - $(CP) $(BOOTSTRAP) $(INST_BOOT)
684427cc 1221';
1222}
8e03a37c 1223
1224=item static_lib (override)
1225
1226Use VMS commands to manipulate object library.
1227
1228=cut
684427cc 1229
1230sub static_lib {
1231 my($self) = @_;
684427cc 1232 return '' unless $self->needs_linking();
1233
1234 return '
1235$(INST_STATIC) :
5ab4150f 1236 $(NOECHO) $(NOOP)
684427cc 1237' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
1238
0c2a65fc 1239 my(@m,$lib);
684427cc 1240 push @m,'
1241# Rely on suffix rule for update action
1242$(OBJECT) : $(INST_ARCHAUTODIR).exists
1243
1244$(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
1245';
022735b4 1246 # If this extension has its own library (eg SDBM_File)
684427cc 1247 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
17f28c40 1248 push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
1249
1250 push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
684427cc 1251
bf99883d 1252 # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
1253 # 'cause it's a library and you can't stick them in other libraries.
1254 # In that case, we use $OBJECT instead and hope for the best
1255 if ($self->{MYEXTLIB}) {
17f28c40 1256 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
bf99883d 1257 } else {
17f28c40 1258 push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
bf99883d 1259 }
1260
562a7b0c 1261 push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
1262 foreach $lib (split ' ', $self->{EXTRALIBS}) {
0c2a65fc 1263 push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
1264 }
684427cc 1265 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1266 join('',@m);
1267}
1268
1269
8e03a37c 1270=item manifypods (override)
1271
1272Use VMS-style quoting on command line, and VMS logical name
1273to specify fallback location at build time if we can't find pod2man.
1274
1275=cut
684427cc 1276
f1387719 1277
684427cc 1278sub manifypods {
1279 my($self, %attribs) = @_;
5ab4150f 1280 return "\nmanifypods :\n\t\$(NOECHO) \$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
684427cc 1281 my($dist);
f1387719 1282 my($pod2man_exe);
684427cc 1283 if (defined $self->{PERL_SRC}) {
ecf68df6 1284 $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
684427cc 1285 } else {
ecf68df6 1286 $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
684427cc 1287 }
55497cff 1288 if (not ($pod2man_exe = $self->perl_script($pod2man_exe))) {
684427cc 1289 # No pod2man but some MAN3PODS to be installed
1290 print <<END;
1291
1292Warning: I could not locate your pod2man program. As a last choice,
1293 I will look for the file to which the logical name POD2MAN
1294 points when MMK is invoked.
1295
1296END
1297 $pod2man_exe = "pod2man";
1298 }
1299 my(@m);
1300 push @m,
1301qq[POD2MAN_EXE = $pod2man_exe\n],
75e2e551 1302q[POD2MAN = $(PERLRUN) "-MPod::Man" -we "%m=@ARGV;for(keys %m){" -
1303-e "Pod::Man->new->parse_from_file($_,$m{$_}) }"
684427cc 1304];
bbce6d69 1305 push @m, "\nmanifypods : \$(MAN1PODS) \$(MAN3PODS)\n";
684427cc 1306 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
1307 my($pod);
1308 foreach $pod (sort keys %{$self->{MAN1PODS}}) {
1309 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1310 push @m, "$pod $self->{MAN1PODS}{$pod}\n";
1311 }
1312 foreach $pod (sort keys %{$self->{MAN3PODS}}) {
1313 push @m, qq[\t\@- If F\$Search("\$(POD2MAN_EXE)").nes."" Then \$(POD2MAN) ];
1314 push @m, "$pod $self->{MAN3PODS}{$pod}\n";
1315 }
1316 }
1317 join('', @m);
1318}
1319
8e03a37c 1320=item processPL (override)
1321
1322Use VMS-style quoting on command line.
1323
1324=cut
684427cc 1325
1326sub processPL {
1327 my($self) = @_;
684427cc 1328 return "" unless $self->{PL_FILES};
1329 my(@m, $plfile);
1330 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3aa35033 1331 my $list = ref($self->{PL_FILES}->{$plfile})
1332 ? $self->{PL_FILES}->{$plfile}
1333 : [$self->{PL_FILES}->{$plfile}];
18541947 1334 foreach my $target (@$list) {
3aa35033 1335 my $vmsplfile = vmsify($plfile);
1336 my $vmsfile = vmsify($target);
1337 push @m, "
bbce6d69 1338all :: $vmsfile
5ab4150f 1339 \$(NOECHO) \$(NOOP)
684427cc 1340
bbce6d69 1341$vmsfile :: $vmsplfile
f6d6199c 1342",' $(PERLRUNINST) '," $vmsplfile $vmsfile
684427cc 1343";
3aa35033 1344 }
684427cc 1345 }
1346 join "", @m;
1347}
1348
8e03a37c 1349=item installbin (override)
1350
1351Stay under DCL's 255 character command line limit once again by
1352splitting potentially long list of files across multiple lines
1353in C<realclean> target.
1354
1355=cut
684427cc 1356
1357sub installbin {
1358 my($self) = @_;
684427cc 1359 return '' unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1360 return '' unless @{$self->{EXE_FILES}};
1361 my(@m, $from, $to, %fromto, @to, $line);
bbce6d69 1362 my(@exefiles) = map { vmsify($_) } @{$self->{EXE_FILES}};
1363 for $from (@exefiles) {
f1387719 1364 my($path) = '$(INST_SCRIPT)' . basename($from);
684427cc 1365 local($_) = $path; # backward compatibility
c2e89b3d 1366 $to = $self->libscan($path);
1367 print "libscan($from) => '$to'\n" if ($Verbose >=2);
bbce6d69 1368 $fromto{$from} = vmsify($to);
684427cc 1369 }
bbce6d69 1370 @to = values %fromto;
684427cc 1371 push @m, "
bbce6d69 1372EXE_FILES = @exefiles
684427cc 1373
684427cc 1374realclean ::
1375";
1376 $line = ''; #avoid unitialized var warning
1377 foreach $to (@to) {
1378 if (length($line) + length($to) > 80) {
1379 push @m, "\t\$(RM_F) $line\n";
1380 $line = $to;
1381 }
1382 else { $line .= " $to"; }
1383 }
f1387719 1384 push @m, "\t\$(RM_F) $line\n\n" if $line;
684427cc 1385
1386 while (($from,$to) = each %fromto) {
8e03a37c 1387 last unless defined $from;
684427cc 1388 my $todir;
1389 if ($to =~ m#[/>:\]]#) { $todir = dirname($to); }
1390 else { ($todir = $to) =~ s/[^\)]+$//; }
1391 $todir = $self->fixpath($todir,1);
1392 push @m, "
1393$to : $from \$(MAKEFILE) ${todir}.exists
1394 \$(CP) $from $to
1395
1396", $self->dir_target($todir);
1397 }
1398 join "", @m;
1399}
1400
8e03a37c 1401=item subdir_x (override)
684427cc 1402
8e03a37c 1403Use VMS commands to change default directory.
1404
1405=cut
684427cc 1406
684427cc 1407sub subdir_x {
1408 my($self, $subdir) = @_;
684427cc 1409 my(@m,$key);
1410 $subdir = $self->fixpath($subdir,1);
1411 push @m, '
1412
1413subdirs ::
1414 olddef = F$Environment("Default")
1415 Set Default ',$subdir,'
9607fc9c 1416 - $(MMS)$(MMSQUALIFIERS) all $(USEMACROS)$(PASTHRU)$(MACROEND)
684427cc 1417 Set Default \'olddef\'
1418';
1419 join('',@m);
1420}
1421
8e03a37c 1422=item clean (override)
1423
1424Split potentially long list of files across multiple commands (in
1425order to stay under the magic command line limit). Also use MM[SK]
1426commands for handling subdirectories.
684427cc 1427
8e03a37c 1428=cut
684427cc 1429
1430sub clean {
1431 my($self, %attribs) = @_;
684427cc 1432 my(@m,$dir);
1433 push @m, '
1434# Delete temporary files but do not touch installed files. We don\'t delete
1435# the Descrip.MMS here so that a later make realclean still has it to use.
1436clean ::
1437';
1438 foreach $dir (@{$self->{DIR}}) { # clean subdirectories first
1439 my($vmsdir) = $self->fixpath($dir,1);
f86702cc 1440 push( @m, ' If F$Search("'.$vmsdir.'$(MAKEFILE)").nes."" Then \\',"\n\t",
9607fc9c 1441 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) clean`;"',"\n");
684427cc 1442 }
5ab4150f 1443 push @m, ' $(RM_F) *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *$(OBJ_EXT) *$(LIB_EXT) *.Opt $(BOOTSTRAP) $(BASEEXT).bso .MM_Tmp
684427cc 1444';
1445
1446 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
4fdae800 1447 # Unlink realclean, $attribs{FILES} is a string here; it may contain
1448 # a list or a macro that expands to a list.
1449 if ($attribs{FILES}) {
1450 my($word,$key,@filist);
1451 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1452 else { @filist = split /\s+/, $attribs{FILES}; }
1453 foreach $word (@filist) {
1454 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1455 push(@otherfiles, @{$self->{$key}});
1456 }
b7b1864f 1457 else { push(@otherfiles, $word); }
4fdae800 1458 }
1459 }
8e03a37c 1460 push(@otherfiles, qw[ blib $(MAKE_APERL_FILE) extralibs.ld perlmain.c pm_to_blib.ts ]);
ecf68df6 1461 push(@otherfiles,File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
684427cc 1462 my($file,$line);
1463 $line = ''; #avoid unitialized var warning
17f28c40 1464 # Occasionally files are repeated several times from different sources
1465 { my(%of) = map { ($_,1) } @otherfiles; @otherfiles = keys %of; }
1466
684427cc 1467 foreach $file (@otherfiles) {
1468 $file = $self->fixpath($file);
1469 if (length($line) + length($file) > 80) {
1470 push @m, "\t\$(RM_RF) $line\n";
1471 $line = "$file";
1472 }
1473 else { $line .= " $file"; }
1474 }
5ab4150f 1475 push @m, "\t\$(RM_RF) $line\n" if $line;
684427cc 1476 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1477 join('', @m);
1478}
1479
8e03a37c 1480=item realclean (override)
1481
1482Guess what we're working around? Also, use MM[SK] for subdirectories.
1483
1484=cut
684427cc 1485
1486sub realclean {
1487 my($self, %attribs) = @_;
684427cc 1488 my(@m);
1489 push(@m,'
1490# Delete temporary files (via clean) and also delete installed files
1491realclean :: clean
1492');
1493 foreach(@{$self->{DIR}}){
1494 my($vmsdir) = $self->fixpath($_,1);
1495 push(@m, ' If F$Search("'."$vmsdir".'$(MAKEFILE)").nes."" Then \\',"\n\t",
9607fc9c 1496 '$(PERL) -e "chdir ',"'$vmsdir'",'; print `$(MMS)$(MMSQUALIFIERS) realclean`;"',"\n");
684427cc 1497 }
f6d6199c 1498 push @m, " \$(RM_RF) \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n";
1499 push @m, " \$(RM_RF) \$(DISTVNAME)\n";
684427cc 1500 # We can't expand several of the MMS macros here, since they don't have
1501 # corresponding %$self keys (i.e. they're defined in Descrip.MMS as a
1502 # combination of macros). In order to stay below DCL's 255 char limit,
1503 # we put only 2 on a line.
1504 my($file,$line,$fcnt);
f1387719 1505 my(@files) = qw{ $(MAKEFILE) $(MAKEFILE)_old };
1506 if ($self->has_link_code) {
1507 push(@files,qw{ $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT) $(OBJECT) });
1508 }
8e03a37c 1509 push(@files, values %{$self->{PM}});
684427cc 1510 $line = ''; #avoid unitialized var warning
17f28c40 1511 # Occasionally files are repeated several times from different sources
1512 { my(%f) = map { ($_,1) } @files; @files = keys %f; }
684427cc 1513 foreach $file (@files) {
1514 $file = $self->fixpath($file);
1515 if (length($line) + length($file) > 80 || ++$fcnt >= 2) {
1516 push @m, "\t\$(RM_F) $line\n";
1517 $line = "$file";
1518 $fcnt = 0;
1519 }
1520 else { $line .= " $file"; }
1521 }
f1387719 1522 push @m, "\t\$(RM_F) $line\n" if $line;
4fdae800 1523 if ($attribs{FILES}) {
1524 my($word,$key,@filist,@allfiles);
1525 if (ref $attribs{FILES} eq 'ARRAY') { @filist = @{$attribs{FILES}}; }
1526 else { @filist = split /\s+/, $attribs{FILES}; }
1527 foreach $word (@filist) {
1528 if (($key) = $word =~ m#^\$\((.*)\)$# and ref $self->{$key} eq 'ARRAY') {
1529 push(@allfiles, @{$self->{$key}});
1530 }
b7b1864f 1531 else { push(@allfiles, $word); }
4fdae800 1532 }
684427cc 1533 $line = '';
17f28c40 1534 # Occasionally files are repeated several times from different sources
1535 { my(%af) = map { ($_,1) } @allfiles; @allfiles = keys %af; }
4fdae800 1536 foreach $file (@allfiles) {
684427cc 1537 $file = $self->fixpath($file);
1538 if (length($line) + length($file) > 80) {
1539 push @m, "\t\$(RM_RF) $line\n";
1540 $line = "$file";
1541 }
1542 else { $line .= " $file"; }
1543 }
f1387719 1544 push @m, "\t\$(RM_RF) $line\n" if $line;
684427cc 1545 }
1546 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1547 join('', @m);
1548}
1549
684427cc 1550
f1387719 1551=item dist_core (override)
8e03a37c 1552
1553Syntax for invoking F<VMS_Share> differs from that for Unix F<shar>,
1554so C<shdist> target actions are VMS-specific.
1555
1556=cut
684427cc 1557
1558sub dist_core {
1559 my($self) = @_;
8e03a37c 1560q[
684427cc 1561dist : $(DIST_DEFAULT)
2ae324a7 1562 $(NOECHO) $(PERL) -le "print 'Warning: $m older than $vf' if -e ($vf = '$(VERSION_FROM)') && -M $vf < -M ($m = '$(MAKEFILE)')"
684427cc 1563
8e03a37c 1564zipdist : $(DISTVNAME).zip
5ab4150f 1565 $(NOECHO) $(NOOP)
684427cc 1566
62ecdc92 1567tardist : $(DISTVNAME).tar$(SUFFIX)
1568 $(NOECHO) $(NOOP)
1569
8e03a37c 1570$(DISTVNAME).zip : distdir
684427cc 1571 $(PREOP)
2ae324a7 1572 $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
684427cc 1573 $(RM_RF) $(DISTVNAME)
1574 $(POSTOP)
1575
f1387719 1576$(DISTVNAME).tar$(SUFFIX) : distdir
1577 $(PREOP)
1578 $(TO_UNIX)
62ecdc92 1579 $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
f1387719 1580 $(RM_RF) $(DISTVNAME)
1581 $(COMPRESS) $(DISTVNAME).tar
1582 $(POSTOP)
1583
684427cc 1584shdist : distdir
1585 $(PREOP)
2ae324a7 1586 $(SHAR) [.$(DISTVNAME...]*.*; $(DISTVNAME).share
684427cc 1587 $(RM_RF) $(DISTVNAME)
1588 $(POSTOP)
8e03a37c 1589];
684427cc 1590}
1591
8e03a37c 1592=item dist_test (override)
1593
1594Use VMS commands to change default directory, and use VMS-style
1595quoting on command line.
1596
1597=cut
684427cc 1598
1599sub dist_test {
1600 my($self) = @_;
684427cc 1601q{
1602disttest : distdir
1603 startdir = F$Environment("Default")
1604 Set Default [.$(DISTVNAME)]
e0678a30 1605 $(ABSPERLRUN) Makefile.PL
9607fc9c 1606 $(MMS)$(MMSQUALIFIERS)
1607 $(MMS)$(MMSQUALIFIERS) test
684427cc 1608 Set Default 'startdir'
1609};
1610}
1611
684427cc 1612# --- Test and Installation Sections ---
1613
8e03a37c 1614=item install (override)
1615
1616Work around DCL's 255 character limit several times,and use
1617VMS-style command line quoting in a few cases.
684427cc 1618
8e03a37c 1619=cut
684427cc 1620
1621sub install {
1622 my($self, %attribs) = @_;
a5f75d66 1623 my(@m,@docfiles);
684427cc 1624
a5f75d66 1625 if ($self->{EXE_FILES}) {
1626 my($line,$file) = ('','');
1627 foreach $file (@{$self->{EXE_FILES}}) {
1628 $line .= "$file ";
1629 if (length($line) > 128) {
f6d6199c 1630 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]);
a5f75d66 1631 $line = '';
1632 }
1633 }
f6d6199c 1634 push(@docfiles,qq[\t\$(NOECHO) \$(PERL) -e "print '$line'" >>.MM_tmp\n]) if $line;
c07a80fd 1635 }
c07a80fd 1636
1637 push @m, q[
a5f75d66 1638install :: all pure_install doc_install
5ab4150f 1639 $(NOECHO) $(NOOP)
a5f75d66 1640
1641install_perl :: all pure_perl_install doc_perl_install
5ab4150f 1642 $(NOECHO) $(NOOP)
a5f75d66 1643
1644install_site :: all pure_site_install doc_site_install
5ab4150f 1645 $(NOECHO) $(NOOP)
a5f75d66 1646
a5f75d66 1647pure_install :: pure_$(INSTALLDIRS)_install
5ab4150f 1648 $(NOECHO) $(NOOP)
a5f75d66 1649
1650doc_install :: doc_$(INSTALLDIRS)_install
774d564b 1651 $(NOECHO) $(SAY) "Appending installation info to $(INSTALLARCHLIB)perllocal.pod"
a5f75d66 1652
1653pure__install : pure_site_install
774d564b 1654 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
a5f75d66 1655
1656doc__install : doc_site_install
4fdae800 1657 $(NOECHO) $(SAY) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
a5f75d66 1658
1659# This hack brought to you by DCL's 255-character command line limit
1660pure_perl_install ::
e0678a30 1661 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1662 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
5ab4150f 1663 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLPRIVLIB) '" >>.MM_tmp
1664 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLARCHLIB) '" >>.MM_tmp
1665 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1666 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1667 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1668 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
a5f75d66 1669 $(MOD_INSTALL) <.MM_tmp
5ab4150f 1670 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
f6d6199c 1671 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
a5f75d66 1672
1673# Likewise
1674pure_site_install ::
e0678a30 1675 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
1676 $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
5ab4150f 1677 $(NOECHO) $(PERL) -e "print '$(INST_LIB) $(INSTALLSITELIB) '" >>.MM_tmp
1678 $(NOECHO) $(PERL) -e "print '$(INST_ARCHLIB) $(INSTALLSITEARCH) '" >>.MM_tmp
1679 $(NOECHO) $(PERL) -e "print '$(INST_BIN) $(INSTALLBIN) '" >>.MM_tmp
1680 $(NOECHO) $(PERL) -e "print '$(INST_SCRIPT) $(INSTALLSCRIPT) '" >>.MM_tmp
1681 $(NOECHO) $(PERL) -e "print '$(INST_MAN1DIR) $(INSTALLMAN1DIR) '" >>.MM_tmp
1682 $(NOECHO) $(PERL) -e "print '$(INST_MAN3DIR) $(INSTALLMAN3DIR) '" >>.MM_tmp
a5f75d66 1683 $(MOD_INSTALL) <.MM_tmp
5ab4150f 1684 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
f6d6199c 1685 $(NOECHO) $(WARN_IF_OLD_PACKLIST) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
a5f75d66 1686
1687# Ditto
1688doc_perl_install ::
5ab4150f 1689 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLPRIVLIB)|'" >.MM_tmp
b4492ac4 1690 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
5ab4150f 1691],@docfiles,
81ff29e3 1692q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
b4492ac4 1693 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
5ab4150f 1694 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1695 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
f6d6199c 1696 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
5ab4150f 1697 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
a5f75d66 1698
1699# And again
1700doc_site_install ::
5ab4150f 1701 $(NOECHO) $(PERL) -e "print 'Module $(NAME)|installed into|$(INSTALLSITELIB)|'" >.MM_tmp
b4492ac4 1702 $(NOECHO) $(PERL) -e "print 'LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES)|'" >>.MM_tmp
5ab4150f 1703],@docfiles,
81ff29e3 1704q% $(NOECHO) $(PERL) -e "print q[@ARGV=split(/\\|/,<STDIN>);]" >.MM2_tmp
b4492ac4 1705 $(NOECHO) $(PERL) -e "print q[print '=head2 ',scalar(localtime),': C<',shift,qq[>\\n\\n=over 4\\n\\n];]" >>.MM2_tmp
5ab4150f 1706 $(NOECHO) $(PERL) -e "print q[while(($key=shift) && ($val=shift)) ]" >>.MM2_tmp
1707 $(NOECHO) $(PERL) -e "print q[{print qq[=item *\\n\\nC<$key: $val>\\n\\n];}print qq[=back\\n\\n];]" >>.MM2_tmp
f6d6199c 1708 $(NOECHO) $(PERL) .MM2_tmp <.MM_tmp >>%.File::Spec->catfile($self->{INSTALLARCHLIB},'perllocal.pod').q[
5ab4150f 1709 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;,.MM2_tmp;
a5f75d66 1710
c07a80fd 1711];
1712
a5f75d66 1713 push @m, q[
1714uninstall :: uninstall_from_$(INSTALLDIRS)dirs
5ab4150f 1715 $(NOECHO) $(NOOP)
a5f75d66 1716
1717uninstall_from_perldirs ::
f6d6199c 1718 $(NOECHO) $(UNINSTALL) ].File::Spec->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
774d564b 1719 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1720 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1721 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
a5f75d66 1722
1723uninstall_from_sitedirs ::
f6d6199c 1724 $(NOECHO) $(UNINSTALL) ],File::Spec->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist'),"\n",q[
774d564b 1725 $(NOECHO) $(SAY) "Uninstall is now deprecated and makes no actual changes."
1726 $(NOECHO) $(SAY) "Please check the list above carefully for errors, and manually remove"
1727 $(NOECHO) $(SAY) "the appropriate files. Sorry for the inconvenience."
1728];
684427cc 1729
a5f75d66 1730 join('',@m);
684427cc 1731}
1732
8e03a37c 1733=item perldepend (override)
1734
1735Use VMS-style syntax for files; it's cheaper to just do it directly here
97abc6ad 1736than to have the MM_Unix method call C<catfile> repeatedly. Also, if
8e03a37c 1737we have to rebuild Config.pm, use MM[SK] to do it.
1738
1739=cut
684427cc 1740
1741sub perldepend {
1742 my($self) = @_;
684427cc 1743 my(@m);
1744
1745 push @m, '
8c7f0036 1746$(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
1747$(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
1748$(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
1749$(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)fakethr.h, $(PERL_INC)form.h
1750$(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
1751$(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
1752$(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
1753$(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)opnames.h, $(PERL_INC)patchlevel.h
1754$(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlapi.h, $(PERL_INC)perlio.h
1755$(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlsfio.h, $(PERL_INC)perlvars.h
1756$(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
1757$(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
1758$(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
1759$(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h, $(PERL_INC)utf8.h
1760$(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h, $(PERL_INC)warnings.h
684427cc 1761
1762' if $self->{OBJECT};
1763
8e03a37c 1764 if ($self->{PERL_SRC}) {
1765 my(@macros);
1766 my($mmsquals) = '$(USEMAKEFILE)[.vms]$(MAKEFILE)';
e0678a30 1767 push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
8e03a37c 1768 push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc';
1769 push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc';
1770 push(@macros,'SOCKET=1') if $Config{'d_has_sockets'};
1771 push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!;
1772 $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
1773 push(@m,q[
684427cc 1774# Check for unpropagated config.sh changes. Should never happen.
1775# We do NOT just update config.h because that is not sufficient.
1776# An out of date config.h is not fatal but complains loudly!
97abc6ad 1777$(PERL_INC)config.h : $(PERL_SRC)config.sh
22d4bb9c 1778 $(NOOP)
684427cc 1779
97abc6ad 1780$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
1781 $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
684427cc 1782 olddef = F$Environment("Default")
1783 Set Default $(PERL_SRC)
aa689395 1784 $(MMS)],$mmsquals,);
1785 if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
b7b1864f 1786 my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
aa689395 1787 $target =~ s/\Q$prefix/[/;
1788 push(@m," $target");
1789 }
1790 else { push(@m,' $(MMS$TARGET)'); }
1791 push(@m,q[
8e03a37c 1792 Set Default 'olddef'
1793]);
1794 }
684427cc 1795
b7b1864f 1796 push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
684427cc 1797 if %{$self->{XS}};
1798
1799 join('',@m);
1800}
1801
8e03a37c 1802=item makefile (override)
1803
1804Use VMS commands and quoting.
1805
1806=cut
1807
684427cc 1808sub makefile {
1809 my($self) = @_;
684427cc 1810 my(@m,@cmd);
1811 # We do not know what target was originally specified so we
1812 # must force a manual rerun to be sure. But as it should only
1813 # happen very rarely it is not a significant problem.
8e03a37c 1814 push @m, q[
684427cc 1815$(OBJECT) : $(FIRST_MAKEFILE)
8e03a37c 1816] if $self->{OBJECT};
684427cc 1817
8e03a37c 1818 push @m,q[
684427cc 1819# We take a very conservative approach here, but it\'s worth it.
1820# We move $(MAKEFILE) to $(MAKEFILE)_old here to avoid gnu make looping.
1821$(MAKEFILE) : Makefile.PL $(CONFIGDEP)
774d564b 1822 $(NOECHO) $(SAY) "$(MAKEFILE) out-of-date with respect to $(MMS$SOURCE_LIST)"
1823 $(NOECHO) $(SAY) "Cleaning current config before rebuilding $(MAKEFILE) ..."
684427cc 1824 - $(MV) $(MAKEFILE) $(MAKEFILE)_old
9607fc9c 1825 - $(MMS)$(MMSQUALIFIERS) $(USEMAKEFILE)$(MAKEFILE)_old clean
f6d6199c 1826 $(PERLRUN) Makefile.PL ],join(' ',map(qq["$_"],@ARGV)),q[
774d564b 1827 $(NOECHO) $(SAY) "$(MAKEFILE) has been rebuilt."
1828 $(NOECHO) $(SAY) "Please run $(MMS) to build the extension."
8e03a37c 1829];
684427cc 1830
1831 join('',@m);
1832}
1833
8e03a37c 1834=item test (override)
1835
1836Use VMS commands for handling subdirectories.
1837
1838=cut
684427cc 1839
1840sub test {
1841 my($self, %attribs) = @_;
684427cc 1842 my($tests) = $attribs{TESTS} || ( -d 't' ? 't/*.t' : '');
1843 my(@m);
1844 push @m,"
1845TEST_VERBOSE = 0
8e03a37c 1846TEST_TYPE = test_\$(LINKTYPE)
f1387719 1847TEST_FILE = test.pl
1848TESTDB_SW = -d
8e03a37c 1849
1850test :: \$(TEST_TYPE)
5ab4150f 1851 \$(NOECHO) \$(NOOP)
684427cc 1852
8e03a37c 1853testdb :: testdb_\$(LINKTYPE)
5ab4150f 1854 \$(NOECHO) \$(NOOP)
8e03a37c 1855
684427cc 1856";
1857 foreach(@{$self->{DIR}}){
1858 my($vmsdir) = $self->fixpath($_,1);
1859 push(@m, ' If F$Search("',$vmsdir,'$(MAKEFILE)").nes."" Then $(PERL) -e "chdir ',"'$vmsdir'",
9607fc9c 1860 '; print `$(MMS)$(MMSQUALIFIERS) $(PASTHRU2) test`'."\n");
684427cc 1861 }
774d564b 1862 push(@m, "\t\$(NOECHO) \$(SAY) \"No tests defined for \$(NAME) extension.\"\n")
684427cc 1863 unless $tests or -f "test.pl" or @{$self->{DIR}};
1864 push(@m, "\n");
1865
8e03a37c 1866 push(@m, "test_dynamic :: pure_all\n");
75e2e551 1867 push(@m, $self->test_via_harness('$(FULLPERLRUN)', $tests)) if $tests;
1868 push(@m, $self->test_via_script('$(FULLPERLRUN)', 'test.pl')) if -f "test.pl";
5ab4150f 1869 push(@m, "\t\$(NOECHO) \$(NOOP)\n") if (!$tests && ! -f "test.pl");
684427cc 1870 push(@m, "\n");
1871
f1387719 1872 push(@m, "testdb_dynamic :: pure_all\n");
75e2e551 1873 push(@m, $self->test_via_script('$(FULLPERLRUN) "$(TESTDB_SW)"', '$(TEST_FILE)'));
f1387719 1874 push(@m, "\n");
8e03a37c 1875
684427cc 1876 # Occasionally we may face this degenerate target:
1877 push @m, "test_ : test_dynamic\n\n";
1878
8e03a37c 1879 if ($self->needs_linking()) {
1880 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
684427cc 1881 push(@m, $self->test_via_harness('$(MAP_TARGET)', $tests)) if $tests;
f1387719 1882 push(@m, $self->test_via_script('$(MAP_TARGET)', 'test.pl')) if -f 'test.pl';
1883 push(@m, "\n");
1884 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
1885 push(@m, $self->test_via_script('$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
684427cc 1886 push(@m, "\n");
1887 }
1888 else {
5ab4150f 1889 push @m, "test_static :: test_dynamic\n\t\$(NOECHO) \$(NOOP)\n\n";
1890 push @m, "testdb_static :: testdb_dynamic\n\t\$(NOECHO) \$(NOOP)\n";
684427cc 1891 }
1892
1893 join('',@m);
1894}
1895
8e03a37c 1896=item makeaperl (override)
1897
1898Undertake to build a new set of Perl images using VMS commands. Since
1899VMS does dynamic loading, it's not necessary to statically link each
1900extension into the Perl image, so this isn't the normal build path.
1901Consequently, it hasn't really been tested, and may well be incomplete.
1902
1903=cut
684427cc 1904
18541947 1905our %olbs;
1906
684427cc 1907sub makeaperl {
1908 my($self, %attribs) = @_;
684427cc 1909 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1910 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1911 my(@m);
1912 push @m, "
1913# --- MakeMaker makeaperl section ---
1914MAP_TARGET = $target
684427cc 1915";
1916 return join '', @m if $self->{PARENT};
1917
1918 my($dir) = join ":", @{$self->{DIR}};
1919
1920 unless ($self->{MAKEAPERL}) {
1921 push @m, q{
684427cc 1922$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
774d564b 1923 $(NOECHO) $(SAY) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
f6d6199c 1924 $(NOECHO) $(PERLRUNINST) \
684427cc 1925 Makefile.PL DIR=}, $dir, q{ \
1926 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
d5e3fa33 1927 MAKEAPERL=1 NORECURS=1 };
1928
1929 push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
684427cc 1930
0d8023a2 1931$(MAP_TARGET) :: $(MAKE_APERL_FILE)
9607fc9c 1932 $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
0d8023a2 1933};
684427cc 1934 push @m, "\n";
1935
1936 return join '', @m;
1937 }
1938
1939
0c2a65fc 1940 my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
1941 local($_);
684427cc 1942
1943 # The front matter of the linkcommand...
1944 $linkcmd = join ' ', $Config{'ld'},
1945 grep($_, @Config{qw(large split ldflags ccdlflags)});
1946 $linkcmd =~ s/\s+/ /g;
1947
1948 # Which *.olb files could we make use of...
18541947 1949 local(%olbs); # XXX can this be lexical?
684427cc 1950 $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
8e03a37c 1951 require File::Find;
684427cc 1952 File::Find::find(sub {
1953 return unless m/\Q$self->{LIB_EXT}\E$/;
1954 return if m/^libperl/;
f1387719 1955
1956 if( exists $self->{INCLUDE_EXT} ){
1957 my $found = 0;
1958 my $incl;
1959 my $xx;
1960
1961 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1962 $xx =~ s,/?$_,,;
1963 $xx =~ s,/,::,g;
1964
1965 # Throw away anything not explicitly marked for inclusion.
1966 # DynaLoader is implied.
1967 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
1968 if( $xx eq $incl ){
1969 $found++;
1970 last;
1971 }
1972 }
1973 return unless $found;
1974 }
1975 elsif( exists $self->{EXCLUDE_EXT} ){
1976 my $excl;
1977 my $xx;
1978
1979 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
1980 $xx =~ s,/?$_,,;
1981 $xx =~ s,/,::,g;
1982
1983 # Throw away anything explicitly marked for exclusion
1984 foreach $excl (@{$self->{EXCLUDE_EXT}}){
1985 return if( $xx eq $excl );
1986 }
1987 }
1988
684427cc 1989 $olbs{$ENV{DEFAULT}} = $_;
1990 }, grep( -d $_, @{$searchdirs || []}));
1991
1992 # We trust that what has been handed in as argument will be buildable
1993 $static = [] unless $static;
1994 @olbs{@{$static}} = (1) x @{$static};
1995
1996 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1997 # Sort the object libraries in inverse order of
1998 # filespec length to try to insure that dependent extensions
1999 # will appear before their parents, so the linker will
2000 # search the parent library to resolve references.
2001 # (e.g. Intuit::DWIM will precede Intuit, so unresolved
2002 # references from [.intuit.dwim]dwim.obj can be found
2003 # in [.intuit]intuit.olb).
0c2a65fc 2004 for (sort { length($a) <=> length($b) } keys %olbs) {
684427cc 2005 next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
2006 my($dir) = $self->fixpath($_,1);
2007 my($extralibs) = $dir . "extralibs.ld";
2008 my($extopt) = $dir . $olbs{$_};
2009 $extopt =~ s/$self->{LIB_EXT}$/.opt/;
0c2a65fc 2010 push @optlibs, "$dir$olbs{$_}";
2011 # Get external libraries this extension will need
684427cc 2012 if (-f $extralibs ) {
0c2a65fc 2013 my %seenthis;
684427cc 2014 open LIST,$extralibs or warn $!,next;
0c2a65fc 2015 while (<LIST>) {
2016 chomp;
2017 # Include a library in the link only once, unless it's mentioned
2018 # multiple times within a single extension's options file, in which
2019 # case we assume the builder needed to search it again later in the
2020 # link.
2021 my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
2022 $libseen{$_}++; $seenthis{$_}++;
2023 next if $skip;
2024 push @$extra,$_;
2025 }
684427cc 2026 close LIST;
2027 }
0c2a65fc 2028 # Get full name of extension for ExtUtils::Miniperl
684427cc 2029 if (-f $extopt) {
2030 open OPT,$extopt or die $!;
2031 while (<OPT>) {
2032 next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
0c2a65fc 2033 my $pkg = $1;
2034 $pkg =~ s#__*#::#g;
684427cc 2035 push @staticpkgs,$pkg;
2036 }
684427cc 2037 }
2038 }
0c2a65fc 2039 # Place all of the external libraries after all of the Perl extension
2040 # libraries in the final link, in order to maximize the opportunity
2041 # for XS code from multiple extensions to resolve symbols against the
2042 # same external library while only including that library once.
2043 push @optlibs, @$extra;
684427cc 2044
ff0cee69 2045 $target = "Perl$Config{'exe_ext'}" unless $target;
18541947 2046 my $shrtarget;
684427cc 2047 ($shrtarget,$targdir) = fileparse($target);
2048 $shrtarget =~ s/^([^.]*)/$1Shr/;
2049 $shrtarget = $targdir . $shrtarget;
2050 $target = "Perlshr.$Config{'dlext'}" unless $target;
2051 $tmp = "[]" unless $tmp;
2052 $tmp = $self->fixpath($tmp,1);
0c2a65fc 2053 if (@optlibs) { $extralist = join(' ',@optlibs); }
2054 else { $extralist = ''; }
562a7b0c 2055 # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
0c2a65fc 2056 # that's what we're building here).
adeacccf 2057 push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
684427cc 2058 if ($libperl) {
ecf68df6 2059 unless (-f $libperl || -f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',$libperl))) {
684427cc 2060 print STDOUT "Warning: $libperl not found\n";
2061 undef $libperl;
2062 }
2063 }
2064 unless ($libperl) {
2065 if (defined $self->{PERL_SRC}) {
ecf68df6 2066 $libperl = File::Spec->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
2067 } elsif (-f ($libperl = File::Spec->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
684427cc 2068 } else {
2069 print STDOUT "Warning: $libperl not found
2070 If you're going to build a static perl binary, make sure perl is installed
2071 otherwise ignore this warning\n";
2072 }
2073 }
2074 $libperldir = $self->fixpath((fileparse($libperl))[1],1);
2075
2076 push @m, '
2077# Fill in the target you want to produce if it\'s not perl
b7b1864f 2078MAP_TARGET = ',$self->fixpath($target,0),'
2079MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
684427cc 2080MAP_LINKCMD = $linkcmd
0c2a65fc 2081MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
684427cc 2082MAP_EXTRA = $extralist
b7b1864f 2083MAP_LIBPERL = ",$self->fixpath($libperl,0),'
684427cc 2084';
2085
2086
0c2a65fc 2087 push @m,"\n${tmp}Makeaperl.Opt : \$(MAP_EXTRA)\n";
2088 foreach (@optlibs) {
2089 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
2090 }
2091 push @m,"\n${tmp}PerlShr.Opt :\n\t";
2092 push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
2093
2094push @m,'
2095$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
2096 $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
684427cc 2097$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmp}perlmain\$(OBJ_EXT) ${tmp}PerlShr.Opt",'
2098 $(MAP_LINKCMD) ',"${tmp}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
774d564b 2099 $(NOECHO) $(SAY) "To install the new ""$(MAP_TARGET)"" binary, say"
9607fc9c 2100 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
774d564b 2101 $(NOECHO) $(SAY) "To remove the intermediate files, say
9607fc9c 2102 $(NOECHO) $(SAY) " $(MMS)$(MMSQUALIFIERS)$(USEMAKEFILE)$(MAKEFILE) map_clean"
684427cc 2103';
0c2a65fc 2104 push @m,"\n${tmp}perlmain.c : \$(MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmp}Writemain.tmp\n";
2105 push @m, "# More from the 255-char line length limit\n";
2106 foreach (@staticpkgs) {
2107 push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmp}Writemain.tmp\n];
2108 }
2109 push @m,'
2110 $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" ',$tmp,'Writemain.tmp >$(MMS$TARGET)
2111 $(NOECHO) $(RM_F) ',"${tmp}Writemain.tmp\n";
684427cc 2112
a5f75d66 2113 push @m, q[
0c2a65fc 2114# Still more from the 255-char line length limit
684427cc 2115doc_inst_perl :
5ab4150f 2116 $(NOECHO) $(PERL) -e "print 'Perl binary $(MAP_TARGET)|'" >.MM_tmp
2117 $(NOECHO) $(PERL) -e "print 'MAP_STATIC|$(MAP_STATIC)|'" >>.MM_tmp
ecf68df6 2118 $(NOECHO) $(PERL) -pl040 -e " " ].File::Spec->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
5ab4150f 2119 $(NOECHO) $(PERL) -e "print 'MAP_LIBPERL|$(MAP_LIBPERL)|'" >>.MM_tmp
ecf68df6 2120 $(DOC_INSTALL) <.MM_tmp >>].File::Spec->catfile('$(INSTALLARCHLIB)','perllocal.pod').q[
5ab4150f 2121 $(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
a5f75d66 2122];
684427cc 2123
2124 push @m, "
2125inst_perl : pure_inst_perl doc_inst_perl
5ab4150f 2126 \$(NOECHO) \$(NOOP)
684427cc 2127
2128pure_inst_perl : \$(MAP_TARGET)
2129 $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
2130 $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
2131
2132clean :: map_clean
5ab4150f 2133 \$(NOECHO) \$(NOOP)
684427cc 2134
2135map_clean :
2136 \$(RM_F) ${tmp}perlmain\$(OBJ_EXT) ${tmp}perlmain.c \$(MAKEFILE)
0c2a65fc 2137 \$(RM_F) ${tmp}Makeaperl.Opt ${tmp}PerlShr.Opt \$(MAP_TARGET)
684427cc 2138";
2139
2140 join '', @m;
2141}
2142
8e03a37c 2143# --- Output postprocessing section ---
684427cc 2144
8e03a37c 2145=item nicetext (override)
684427cc 2146
8e03a37c 2147Insure that colons marking targets are preceded by space, in order
2148to distinguish the target delimiter from a colon appearing as
2149part of a filespec.
684427cc 2150
8e03a37c 2151=cut
684427cc 2152
2153sub nicetext {
684427cc 2154
2155 my($self,$text) = @_;
684427cc 2156 $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
2157 $text;
2158}
2159
21601;
2161
2ae324a7 2162=back
2163
2164=cut
2165
684427cc 2166__END__
f1387719 2167