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