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