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