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