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