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