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