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