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