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