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