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