This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Cleanup
[perl5.git] / lib / ExtUtils / MM_Unix.pm
CommitLineData
1e44e2bf
PP
1package ExtUtils::MM_Unix;
2
b75c8c73
MS
3use strict;
4
dbc738d9 5use Exporter ();
f1387719
PP
6use Config;
7use File::Basename qw(basename dirname fileparse);
8use DirHandle;
dbc738d9 9use strict;
acfe0abc 10our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos,
f168a5e7 11 $Verbose,%pm,%static,$Xsubpp_Version);
dbc738d9 12
b75c8c73 13our $VERSION = '1.12603';
1e44e2bf 14
b75c8c73
MS
15require ExtUtils::MakeMaker;
16ExtUtils::MakeMaker->import(qw($Verbose &neatvalue));
1e44e2bf 17
bab2b58e 18$Is_OS2 = $^O eq 'os2';
137443ea
PP
19$Is_Mac = $^O eq 'MacOS';
20$Is_Win32 = $^O eq 'MSWin32';
39e571d4 21$Is_Dos = $^O eq 'dos';
f1387719
PP
22
23if ($Is_VMS = $^O eq 'VMS') {
24 require VMS::Filespec;
25 import VMS::Filespec qw( &vmsify );
26}
1e44e2bf
PP
27
28=head1 NAME
29
30ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
31
32=head1 SYNOPSIS
33
34C<require ExtUtils::MM_Unix;>
35
36=head1 DESCRIPTION
37
38The methods provided by this package are designed to be used in
39conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
40Makefile, it creates one or more objects that inherit their methods
41from a package C<MM>. MM itself doesn't provide any methods, but it
42ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
43specific packages take the responsibility for all the methods provided
44by MM_Unix. We are trying to reduce the number of the necessary
45overrides by defining rather primitive operations within
46ExtUtils::MM_Unix.
47
48If you are going to write a platform specific MM package, please try
1fef88e7
JM
49to limit the necessary overrides to primitive methods, and if it is not
50possible to do so, let's work out how to achieve that gain.
1e44e2bf 51
f4ae0f5e
PP
52If you are overriding any of these methods in your Makefile.PL (in the
53MY class), please report that to the makemaker mailing list. We are
54trying to minimize the necessary method overrides and switch to data
55driven Makefile.PLs wherever possible. In the long run less methods
56will be overridable via the MY class.
57
1e44e2bf
PP
58=head1 METHODS
59
60The following description of methods is still under
61development. Please refer to the code for not suitably documented
62sections and complain loudly to the makemaker mailing list.
63
f1387719 64Not all of the methods below are overridable in a
f4ae0f5e
PP
65Makefile.PL. Overridable methods are marked as (o). All methods are
66overridable by a platform specific MM_*.pm file (See
bab2b58e 67L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
f4ae0f5e 68
1e44e2bf
PP
69=head2 Preloaded methods
70
71=over 2
72
f1387719
PP
73=item canonpath
74
75No physical check on the filesystem, but a logical cleanup of a
76path. On UNIX eliminated successive slashes and successive "/.".
77
78=cut
79
80sub canonpath {
81 my($self,$path) = @_;
89bb8afa
NA
82
83 # Handle POSIX-style node names beginning with double slash
f9020f68 84 my $node = '';
61c0c206 85 if ( $^O =~ m/^(?:qnx|nto)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) {
f9020f68
NA
86 $node = $1;
87 }
9204dbe0 88 $path =~ s|(?<=[^/])/+|/|g ; # xx////xx -> xx/xx
f1387719 89 $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
ccb17063 90 $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx
4f44ac69 91 $path =~ s|(?<=[^/])/\z|| ; # xx/ -> xx
89bb8afa 92 return "$node$path";
f1387719
PP
93}
94
1e44e2bf
PP
95=item catdir
96
97Concatenate two or more directory names to form a complete path ending
f1387719
PP
98with a directory. But remove the trailing slash from the resulting
99string, because it doesn't look good, isn't necessary and confuses
100OS2. Of course, if this is the root directory, don't cut off the
101trailing slash :-)
1e44e2bf
PP
102
103=cut
104
105# ';
106
f1387719 107sub catdir {
354f3b56 108 my $self = shift @_;
f1387719
PP
109 my @args = @_;
110 for (@args) {
111 # append a slash to each argument unless it has one there
93f9cb4b 112 $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
f1387719 113 }
354f3b56 114 $self->canonpath(join('', @args));
1e44e2bf
PP
115}
116
117=item catfile
118
f1387719 119Concatenate one or more directory names and a filename to form a
1e44e2bf
PP
120complete path ending with a filename
121
122=cut
123
124sub catfile {
f1387719
PP
125 my $self = shift @_;
126 my $file = pop @_;
354f3b56 127 return $self->canonpath($file) unless @_;
f1387719
PP
128 my $dir = $self->catdir(@_);
129 for ($dir) {
130 $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
131 }
354f3b56 132 return $self->canonpath($dir.$file);
1e44e2bf
PP
133}
134
f1387719
PP
135=item curdir
136
137Returns a string representing of the current directory. "." on UNIX.
138
139=cut
140
141sub curdir {
142 return "." ;
143}
144
145=item rootdir
146
147Returns a string representing of the root directory. "/" on UNIX.
148
149=cut
150
151sub rootdir {
152 return "/";
153}
154
155=item updir
156
157Returns a string representing of the parent directory. ".." on UNIX.
158
159=cut
160
161sub updir {
162 return "..";
163}
164
165sub ExtUtils::MM_Unix::c_o ;
166sub ExtUtils::MM_Unix::clean ;
167sub ExtUtils::MM_Unix::const_cccmd ;
f4ae0f5e 168sub ExtUtils::MM_Unix::const_config ;
f4ae0f5e 169sub ExtUtils::MM_Unix::const_loadlibs ;
f1387719 170sub ExtUtils::MM_Unix::constants ;
f4ae0f5e 171sub ExtUtils::MM_Unix::depend ;
f1387719
PP
172sub ExtUtils::MM_Unix::dir_target ;
173sub ExtUtils::MM_Unix::dist ;
174sub ExtUtils::MM_Unix::dist_basics ;
175sub ExtUtils::MM_Unix::dist_ci ;
176sub ExtUtils::MM_Unix::dist_core ;
177sub ExtUtils::MM_Unix::dist_dir ;
178sub ExtUtils::MM_Unix::dist_test ;
f4ae0f5e
PP
179sub ExtUtils::MM_Unix::dlsyms ;
180sub ExtUtils::MM_Unix::dynamic ;
181sub ExtUtils::MM_Unix::dynamic_bs ;
182sub ExtUtils::MM_Unix::dynamic_lib ;
f1387719 183sub ExtUtils::MM_Unix::exescan ;
68dc0745 184sub ExtUtils::MM_Unix::export_list ;
f1387719
PP
185sub ExtUtils::MM_Unix::extliblist ;
186sub ExtUtils::MM_Unix::file_name_is_absolute ;
187sub ExtUtils::MM_Unix::find_perl ;
84902520 188sub ExtUtils::MM_Unix::fixin ;
f1387719
PP
189sub ExtUtils::MM_Unix::force ;
190sub ExtUtils::MM_Unix::guess_name ;
191sub ExtUtils::MM_Unix::has_link_code ;
cae6c631 192sub ExtUtils::MM_Unix::htmlifypods ;
f1387719
PP
193sub ExtUtils::MM_Unix::init_dirscan ;
194sub ExtUtils::MM_Unix::init_main ;
195sub ExtUtils::MM_Unix::init_others ;
196sub ExtUtils::MM_Unix::install ;
197sub ExtUtils::MM_Unix::installbin ;
198sub ExtUtils::MM_Unix::libscan ;
199sub ExtUtils::MM_Unix::linkext ;
200sub ExtUtils::MM_Unix::lsdir ;
201sub ExtUtils::MM_Unix::macro ;
202sub ExtUtils::MM_Unix::makeaperl ;
203sub ExtUtils::MM_Unix::makefile ;
f4ae0f5e 204sub ExtUtils::MM_Unix::manifypods ;
f1387719
PP
205sub ExtUtils::MM_Unix::maybe_command ;
206sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
207sub ExtUtils::MM_Unix::needs_linking ;
208sub ExtUtils::MM_Unix::nicetext ;
209sub ExtUtils::MM_Unix::parse_version ;
210sub ExtUtils::MM_Unix::pasthru ;
211sub ExtUtils::MM_Unix::path ;
68dc0745 212sub ExtUtils::MM_Unix::perl_archive;
5ba48348 213sub ExtUtils::MM_Unix::perl_archive_after;
f1387719
PP
214sub ExtUtils::MM_Unix::perl_script ;
215sub ExtUtils::MM_Unix::perldepend ;
216sub ExtUtils::MM_Unix::pm_to_blib ;
217sub ExtUtils::MM_Unix::post_constants ;
218sub ExtUtils::MM_Unix::post_initialize ;
219sub ExtUtils::MM_Unix::postamble ;
8f993c78 220sub ExtUtils::MM_Unix::ppd ;
f1387719 221sub ExtUtils::MM_Unix::prefixify ;
f4ae0f5e 222sub ExtUtils::MM_Unix::processPL ;
fa048ccd 223sub ExtUtils::MM_Unix::quote_paren ;
f4ae0f5e 224sub ExtUtils::MM_Unix::realclean ;
f1387719
PP
225sub ExtUtils::MM_Unix::replace_manpage_separator ;
226sub ExtUtils::MM_Unix::static ;
227sub ExtUtils::MM_Unix::static_lib ;
f4ae0f5e 228sub ExtUtils::MM_Unix::staticmake ;
f1387719
PP
229sub ExtUtils::MM_Unix::subdir_x ;
230sub ExtUtils::MM_Unix::subdirs ;
f4ae0f5e
PP
231sub ExtUtils::MM_Unix::test ;
232sub ExtUtils::MM_Unix::test_via_harness ;
233sub ExtUtils::MM_Unix::test_via_script ;
f1387719
PP
234sub ExtUtils::MM_Unix::tool_autosplit ;
235sub ExtUtils::MM_Unix::tool_xsubpp ;
236sub ExtUtils::MM_Unix::tools_other ;
237sub ExtUtils::MM_Unix::top_targets ;
f4ae0f5e 238sub ExtUtils::MM_Unix::writedoc ;
f1387719 239sub ExtUtils::MM_Unix::xs_c ;
875fa795 240sub ExtUtils::MM_Unix::xs_cpp ;
f1387719
PP
241sub ExtUtils::MM_Unix::xs_o ;
242sub ExtUtils::MM_Unix::xsubpp_version ;
f4ae0f5e
PP
243
244package ExtUtils::MM_Unix;
245
93f9cb4b 246use SelfLoader;
f4ae0f5e
PP
247
2481;
93f9cb4b
PP
249
250__DATA__
f4ae0f5e 251
bab2b58e
AK
252=back
253
f4ae0f5e
PP
254=head2 SelfLoaded methods
255
bab2b58e
AK
256=over 2
257
f1387719 258=item c_o (o)
1e44e2bf 259
f1387719
PP
260Defines the suffix rules to compile different flavors of C files to
261object files.
1e44e2bf
PP
262
263=cut
264
f1387719
PP
265sub c_o {
266# --- Translation Sections ---
1e44e2bf 267
f1387719
PP
268 my($self) = shift;
269 return '' unless $self->needs_linking();
270 my(@m);
b207e5e2
DM
271 if (my $cpp = $Config{cpprun}) {
272 my $cpp_cmd = $self->const_cccmd;
273 $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
274 push @m, '
275.c.i:
289e7e34 276 '. $cpp_cmd . ' $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
b207e5e2
DM
277';
278 }
f1387719 279 push @m, '
58486d1a 280.c.s:
289e7e34 281 $(CCCMD) -S $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
58486d1a
DM
282';
283 push @m, '
f1387719 284.c$(OBJ_EXT):
289e7e34 285 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
a0d6894c
PP
286';
287 push @m, '
f1387719 288.C$(OBJ_EXT):
289e7e34 289 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.C
39e571d4 290' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific
a0d6894c 291 push @m, '
f1387719 292.cpp$(OBJ_EXT):
289e7e34 293 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
1e44e2bf 294
f1387719 295.cxx$(OBJ_EXT):
289e7e34 296 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
1e44e2bf 297
f1387719 298.cc$(OBJ_EXT):
289e7e34 299 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.cc
f1387719
PP
300';
301 join "", @m;
1e44e2bf
PP
302}
303
f1387719 304=item cflags (o)
1e44e2bf 305
f1387719
PP
306Does very much the same as the cflags script in the perl
307distribution. It doesn't return the whole compiler command line, but
308initializes all of its parts. The const_cccmd method then actually
309returns the definition of the CCCMD macro which uses these parts.
1e44e2bf
PP
310
311=cut
312
f1387719 313#'
1e44e2bf 314
f1387719
PP
315sub cflags {
316 my($self,$libperl)=@_;
317 return $self->{CFLAGS} if $self->{CFLAGS};
318 return '' unless $self->needs_linking();
1e44e2bf 319
f1387719
PP
320 my($prog, $uc, $perltype, %cflags);
321 $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
322 $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
1e44e2bf 323
5869b1f1
JH
324 @cflags{qw(cc ccflags optimize shellflags)}
325 = @Config{qw(cc ccflags optimize shellflags)};
f1387719 326 my($optdebug) = "";
1e44e2bf 327
f1387719 328 $cflags{shellflags} ||= '';
1e44e2bf 329
f1387719
PP
330 my(%map) = (
331 D => '-DDEBUGGING',
332 E => '-DEMBED',
333 DE => '-DDEBUGGING -DEMBED',
334 M => '-DEMBED -DMULTIPLICITY',
335 DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
336 );
1e44e2bf 337
f1387719
PP
338 if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
339 $uc = uc($1);
340 } else {
341 $uc = ""; # avoid warning
342 }
343 $perltype = $map{$uc} ? $map{$uc} : "";
1e44e2bf 344
f1387719
PP
345 if ($uc =~ /^D/) {
346 $optdebug = "-g";
347 }
1e44e2bf 348
1e44e2bf 349
f1387719
PP
350 my($name);
351 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
352 if ($prog = $Config::Config{$name}) {
353 # Expand hints for this extension via the shell
354 print STDOUT "Processing $name hint:\n" if $Verbose;
355 my(@o)=`cc=\"$cflags{cc}\"
356 ccflags=\"$cflags{ccflags}\"
357 optimize=\"$cflags{optimize}\"
358 perltype=\"$cflags{perltype}\"
359 optdebug=\"$cflags{optdebug}\"
f1387719
PP
360 eval '$prog'
361 echo cc=\$cc
362 echo ccflags=\$ccflags
363 echo optimize=\$optimize
364 echo perltype=\$perltype
365 echo optdebug=\$optdebug
f1387719
PP
366 `;
367 my($line);
368 foreach $line (@o){
369 chomp $line;
370 if ($line =~ /(.*?)=\s*(.*)\s*$/){
371 $cflags{$1} = $2;
372 print STDOUT " $1 = $2\n" if $Verbose;
373 } else {
374 print STDOUT "Unrecognised result from hint: '$line'\n";
375 }
376 }
377 }
1e44e2bf 378
f1387719
PP
379 if ($optdebug) {
380 $cflags{optimize} = $optdebug;
381 }
1e44e2bf 382
5869b1f1 383 for (qw(ccflags optimize perltype)) {
f1387719
PP
384 $cflags{$_} =~ s/^\s+//;
385 $cflags{$_} =~ s/\s+/ /g;
386 $cflags{$_} =~ s/\s+$//;
387 $self->{uc $_} ||= $cflags{$_}
388 }
1e44e2bf 389
2aea4d40
JD
390 if ($self->{POLLUTE}) {
391 $self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
392 }
393
ee13e175
JH
394 my $pollute = '';
395 if ($Config{usemymalloc} and not $Config{bincompat5005}
396 and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
397 and $self->{PERL_MALLOC_OK}) {
398 $pollute = '$(PERL_MALLOC_DEF)';
399 }
400
fa048ccd 401 $self->{CCFLAGS} = quote_paren($self->{CCFLAGS});
9b475917 402 $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE});
ac25e0e7 403
f1387719
PP
404 return $self->{CFLAGS} = qq{
405CCFLAGS = $self->{CCFLAGS}
406OPTIMIZE = $self->{OPTIMIZE}
407PERLTYPE = $self->{PERLTYPE}
ee13e175 408MPOLLUTE = $pollute
f1387719 409};
1e44e2bf 410
1e44e2bf
PP
411}
412
f1387719 413=item clean (o)
1e44e2bf 414
f1387719 415Defines the clean target.
1e44e2bf
PP
416
417=cut
418
f1387719
PP
419sub clean {
420# --- Cleanup and Distribution Sections ---
1e44e2bf 421
f1387719
PP
422 my($self, %attribs) = @_;
423 my(@m,$dir);
424 push(@m, '
425# Delete temporary files but do not touch installed files. We don\'t delete
426# the Makefile here so a later make realclean still has a makefile to use.
1e44e2bf 427
f1387719
PP
428clean ::
429');
430 # clean subdirectories first
431 for $dir (@{$self->{DIR}}) {
882a4479
GS
432 if ($Is_Win32 && Win32::IsWin95()) {
433 push @m, <<EOT;
434 cd $dir
435 \$(TEST_F) $self->{MAKEFILE}
436 \$(MAKE) clean
437 cd ..
438EOT
439 }
440 else {
441 push @m, <<EOT;
442 -cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean
443EOT
444 }
1e44e2bf 445 }
f1387719
PP
446
447 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
2bfcb3f2
NA
448 if ( $^O eq 'qnx' ) {
449 my @errfiles = @{$self->{C}};
450 for ( @errfiles ) {
451 s/.c$/.err/;
452 }
453 push( @otherfiles, @errfiles, 'perlmain.err' );
454 }
f1387719
PP
455 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
456 push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
4dac24e9 457 perlmain.c tmon.out mon.out core core.*perl.*.?
cc846176 458 *perl.core so_locations pm_to_blib
5f929d0c 459 *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
4cbec17f
JH
460 $(BOOTSTRAP) $(BASEEXT).bso
461 $(BASEEXT).def lib$(BASEEXT).def
c855ea65 462 $(BASEEXT).exp $(BASEEXT).x
f1387719
PP
463 ]);
464 push @m, "\t-$self->{RM_RF} @otherfiles\n";
465 # See realclean and ext/utils/make_ext for usage of Makefile.old
466 push(@m,
68dc0745 467 "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old \$(DEV_NULL)\n");
f1387719
PP
468 push(@m,
469 "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
470 join("", @m);
1e44e2bf
PP
471}
472
f1387719 473=item const_cccmd (o)
1e44e2bf 474
f1387719
PP
475Returns the full compiler call for C programs and stores the
476definition in CONST_CCCMD.
1e44e2bf
PP
477
478=cut
479
f1387719
PP
480sub const_cccmd {
481 my($self,$libperl)=@_;
482 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
483 return '' unless $self->needs_linking();
484 return $self->{CONST_CCCMD} =
289e7e34
JH
485 q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
486 $(CCFLAGS) $(OPTIMIZE) \\
5869b1f1 487 $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
f1387719 488 $(XS_DEFINE_VERSION)};
1e44e2bf
PP
489}
490
f1387719 491=item const_config (o)
1e44e2bf 492
f1387719
PP
493Defines a couple of constants in the Makefile that are imported from
494%Config.
1e44e2bf
PP
495
496=cut
497
f1387719
PP
498sub const_config {
499# --- Constants Sections ---
500
501 my($self) = shift;
502 my(@m,$m);
503 push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
504 push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
505 my(%once_only);
506 foreach $m (@{$self->{CONFIG}}){
507 # SITE*EXP macros are defined in &constants; avoid duplicates here
508 next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
f8968d56
JH
509 $self->{uc $m} = quote_paren($self->{uc $m});
510 push @m, uc($m) , ' = ' , $self->{uc $m}, "\n";
f1387719
PP
511 $once_only{$m} = 1;
512 }
513 join('', @m);
1e44e2bf
PP
514}
515
f1387719 516=item const_loadlibs (o)
1e44e2bf 517
f1387719
PP
518Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
519L<ExtUtils::Liblist> for details.
1e44e2bf
PP
520
521=cut
522
f1387719
PP
523sub const_loadlibs {
524 my($self) = shift;
525 return "" unless $self->needs_linking;
526 my @m;
527 push @m, qq{
528# $self->{NAME} might depend on some other libraries:
529# See ExtUtils::Liblist for details
530#
531};
532 my($tmp);
533 for $tmp (qw/
534 EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
535 /) {
536 next unless defined $self->{$tmp};
537 push @m, "$tmp = $self->{$tmp}\n";
538 }
539 return join "", @m;
1e44e2bf
PP
540}
541
f1387719 542=item constants (o)
1e44e2bf 543
f1387719 544Initializes lots of constants and .SUFFIXES and .PHONY
1e44e2bf
PP
545
546=cut
547
f1387719 548sub constants {
1e44e2bf 549 my($self) = @_;
f1387719 550 my(@m,$tmp);
1e44e2bf 551
f1387719 552 for $tmp (qw/
1e44e2bf 553
f1387719
PP
554 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
555 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
bab2b58e 556 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
f1387719
PP
557 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
558 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
559 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
560 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
4bfb3f62
MS
561 PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS
562 FULL_AR PERL_CORE
1e44e2bf 563
f1387719
PP
564 / ) {
565 next unless defined $self->{$tmp};
566 push @m, "$tmp = $self->{$tmp}\n";
1e44e2bf
PP
567 }
568
f1387719
PP
569 push @m, qq{
570VERSION_MACRO = VERSION
571DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
572XS_VERSION_MACRO = XS_VERSION
573XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
ee13e175 574PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
f1387719 575};
1e44e2bf 576
f1387719
PP
577 push @m, qq{
578MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
579MM_VERSION = $ExtUtils::MakeMaker::VERSION
580};
1e44e2bf 581
f1387719
PP
582 push @m, q{
583# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
584# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
585# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
586# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
587# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
588};
1e44e2bf 589
f1387719
PP
590 for $tmp (qw/
591 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
131aa089 592 LDFROM LINKTYPE PM_FILTER
f1387719
PP
593 / ) {
594 next unless defined $self->{$tmp};
595 push @m, "$tmp = $self->{$tmp}\n";
596 }
1e44e2bf 597
f1387719
PP
598 push @m, "
599# Handy lists of source code files:
600XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
601C_FILES = ".join(" \\\n\t", @{$self->{C}})."
602O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
603H_FILES = ".join(" \\\n\t", @{$self->{H}})."
cae6c631
JD
604HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
605HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
f1387719
PP
606MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
607MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
608";
1e44e2bf 609
f1387719 610 for $tmp (qw/
cae6c631
JD
611 INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
612 INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
613 INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
614 INST_HTMLLIBDIR HTMLEXT
615 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
616 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
f1387719
PP
617 /) {
618 next unless defined $self->{$tmp};
619 push @m, "$tmp = $self->{$tmp}\n";
620 }
1e44e2bf 621
2366100d
A
622 for $tmp (qw(
623 PERM_RW PERM_RWX
624 )
625 ) {
626 my $method = lc($tmp);
627 # warn "self[$self] method[$method]";
628 push @m, "$tmp = ", $self->$method(), "\n";
629 }
630
f1387719
PP
631 push @m, q{
632.NO_CONFIG_REC: Makefile
633} if $ENV{CLEARCASE_ROOT};
1e44e2bf 634
f1387719
PP
635 # why not q{} ? -- emacs
636 push @m, qq{
637# work around a famous dec-osf make(1) feature(?):
638makemakerdflt: all
1e44e2bf 639
58486d1a 640.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc \$(OBJ_EXT)
1e44e2bf 641
f1387719
PP
642# Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
643# some make implementations will delete the Makefile when we rebuild it. Because
644# we call false(1) when we rebuild it. So make(1) is not completely wrong when it
645# does so. Our milage may vary.
646# .PRECIOUS: Makefile # seems to be not necessary anymore
1e44e2bf 647
f1387719 648.PHONY: all config static dynamic test linkext manifest
1e44e2bf 649
f1387719
PP
650# Where is the Config information that we are using/depend on
651CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
dbc738d9 652};
1e44e2bf 653
dbc738d9
PP
654 my @parentdir = split(/::/, $self->{PARENT_NAME});
655 push @m, q{
f1387719 656# Where to put things:
dbc738d9
PP
657INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
658INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
1e44e2bf 659
dbc738d9
PP
660INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
661INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
f1387719 662};
1e44e2bf 663
f1387719
PP
664 if ($self->has_link_code()) {
665 push @m, '
666INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
667INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
668INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
669';
670 } else {
671 push @m, '
672INST_STATIC =
673INST_DYNAMIC =
674INST_BOOT =
675';
1e44e2bf
PP
676 }
677
68dc0745 678 $tmp = $self->export_list;
f1387719
PP
679 push @m, "
680EXPORT_LIST = $tmp
681";
68dc0745 682 $tmp = $self->perl_archive;
f1387719
PP
683 push @m, "
684PERL_ARCHIVE = $tmp
685";
5ba48348
JH
686 $tmp = $self->perl_archive_after;
687 push @m, "
688PERL_ARCHIVE_AFTER = $tmp
689";
1e44e2bf 690
f1387719
PP
691# push @m, q{
692#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
693#
694#PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
695#};
1e44e2bf 696
f1387719
PP
697 push @m, q{
698TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
1e44e2bf 699
f1387719
PP
700PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
701};
1e44e2bf 702
f1387719
PP
703 join('',@m);
704}
1e44e2bf 705
f1387719 706=item depend (o)
1e44e2bf 707
f1387719 708Same as macro for the depend attribute.
1e44e2bf 709
f1387719 710=cut
1e44e2bf 711
f1387719
PP
712sub depend {
713 my($self,%attribs) = @_;
714 my(@m,$key,$val);
715 while (($key,$val) = each %attribs){
716 last unless defined $key;
717 push @m, "$key: $val\n";
1e44e2bf 718 }
f1387719
PP
719 join "", @m;
720}
1e44e2bf 721
f1387719 722=item dir_target (o)
1e44e2bf 723
f1387719
PP
724Takes an array of directories that need to exist and returns a
725Makefile entry for a .exists file in these directories. Returns
726nothing, if the entry has already been processed. We're helpless
727though, if the same directory comes as $(FOO) _and_ as "bar". Both of
728them get an entry, that's why we use "::".
1e44e2bf 729
f1387719 730=cut
1e44e2bf 731
f1387719
PP
732sub dir_target {
733# --- Make-Directories section (internal method) ---
734# dir_target(@array) returns a Makefile entry for the file .exists in each
735# named directory. Returns nothing, if the entry has already been processed.
736# We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
737# Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
738# prerequisite, because there has to be one, something that doesn't change
739# too often :)
1e44e2bf 740
f1387719 741 my($self,@dirs) = @_;
8cc95fdb 742 my(@m,$dir,$targdir);
f1387719
PP
743 foreach $dir (@dirs) {
744 my($src) = $self->catfile($self->{PERL_INC},'perl.h');
745 my($targ) = $self->catfile($dir,'.exists');
8cc95fdb
PP
746 # catfile may have adapted syntax of $dir to target OS, so...
747 if ($Is_VMS) { # Just remove file name; dirspec is often in macro
4f44ac69 748 ($targdir = $targ) =~ s:/?\.exists\z::;
8cc95fdb
PP
749 }
750 else { # while elsewhere we expect to see the dir separator in $targ
751 $targdir = dirname($targ);
752 }
f1387719
PP
753 next if $self->{DIR_TARGET}{$self}{$targdir}++;
754 push @m, qq{
755$targ :: $src
756 $self->{NOECHO}\$(MKPATH) $targdir
757 $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
758};
2366100d
A
759 push(@m, qq{
760 -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $targdir
f1387719
PP
761}) unless $Is_VMS;
762 }
763 join "", @m;
764}
1e44e2bf 765
f1387719 766=item dist (o)
1e44e2bf 767
f1387719 768Defines a lot of macros for distribution support.
1e44e2bf 769
f1387719 770=cut
1e44e2bf 771
f1387719
PP
772sub dist {
773 my($self, %attribs) = @_;
1e44e2bf 774
f1387719
PP
775 my(@m);
776 # VERSION should be sanitised before use as a file name
777 my($version) = $attribs{VERSION} || '$(VERSION)';
778 my($name) = $attribs{NAME} || '$(DISTNAME)';
779 my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar
780 my($tarflags) = $attribs{TARFLAGS} || 'cvf';
781 my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck!
782 my($zipflags) = $attribs{ZIPFLAGS} || '-r';
5f8e730b
A
783 my($compress) = $attribs{COMPRESS} || 'gzip --best';
784 my($suffix) = $attribs{SUFFIX} || '.gz'; # eg .gz
f1387719
PP
785 my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip"
786 my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
787 my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
1e44e2bf 788
f1387719
PP
789 my($to_unix) = $attribs{TO_UNIX} || ($Is_OS2
790 ? "$self->{NOECHO}"
68dc0745 791 . '$(TEST_F) tmp.zip && $(RM) tmp.zip;'
f1387719
PP
792 . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip'
793 : "$self->{NOECHO}\$(NOOP)");
1e44e2bf 794
f1387719
PP
795 my($ci) = $attribs{CI} || 'ci -u';
796 my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
797 my($dist_cp) = $attribs{DIST_CP} || 'best';
798 my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
1e44e2bf 799
f1387719
PP
800 push @m, "
801DISTVNAME = ${name}-$version
802TAR = $tar
803TARFLAGS = $tarflags
804ZIP = $zip
805ZIPFLAGS = $zipflags
806COMPRESS = $compress
807SUFFIX = $suffix
808SHAR = $shar
809PREOP = $preop
810POSTOP = $postop
811TO_UNIX = $to_unix
812CI = $ci
813RCS_LABEL = $rcs_label
814DIST_CP = $dist_cp
815DIST_DEFAULT = $dist_default
816";
817 join "", @m;
1e44e2bf
PP
818}
819
f1387719 820=item dist_basics (o)
1e44e2bf 821
2edbd6da 822Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
1e44e2bf
PP
823
824=cut
825
f1387719
PP
826sub dist_basics {
827 my($self) = shift;
828 my @m;
829 push @m, q{
830distclean :: realclean distcheck
831};
1e44e2bf 832
f1387719
PP
833 push @m, q{
834distcheck :
4bfb3f62 835 $(PERLRUN) -MExtUtils::Manifest=fullcheck \\
68dc0745 836 -e fullcheck
f1387719 837};
1e44e2bf 838
f1387719
PP
839 push @m, q{
840skipcheck :
4bfb3f62 841 $(PERLRUN) -MExtUtils::Manifest=skipcheck \\
68dc0745 842 -e skipcheck
f1387719 843};
1e44e2bf 844
f1387719
PP
845 push @m, q{
846manifest :
4bfb3f62 847 $(PERLRUN) -MExtUtils::Manifest=mkmanifest \\
68dc0745 848 -e mkmanifest
f1387719 849};
2edbd6da
JH
850
851 push @m, q{
852veryclean : realclean
853 $(RM_F) *~ *.orig */*~ */*.orig
854};
f1387719 855 join "", @m;
1e44e2bf
PP
856}
857
f1387719 858=item dist_ci (o)
1e44e2bf 859
f1387719 860Defines a check in target for RCS.
1e44e2bf
PP
861
862=cut
863
f1387719 864sub dist_ci {
1e44e2bf 865 my($self) = shift;
f1387719
PP
866 my @m;
867 push @m, q{
868ci :
4bfb3f62 869 $(PERLRUN) -MExtUtils::Manifest=maniread \\
68dc0745 870 -e "@all = keys %{ maniread() };" \\
f1387719
PP
871 -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
872 -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
873};
874 join "", @m;
875}
1e44e2bf 876
f1387719 877=item dist_core (o)
1e44e2bf 878
de592821 879Defines the targets dist, tardist, zipdist, uutardist, shdist
1e44e2bf 880
f1387719 881=cut
1e44e2bf 882
f1387719
PP
883sub dist_core {
884 my($self) = shift;
885 my @m;
886 push @m, q{
887dist : $(DIST_DEFAULT)
888 }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
889 -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
1e44e2bf 890
f1387719 891tardist : $(DISTVNAME).tar$(SUFFIX)
1e44e2bf 892
f1387719 893zipdist : $(DISTVNAME).zip
1e44e2bf 894
f1387719
PP
895$(DISTVNAME).tar$(SUFFIX) : distdir
896 $(PREOP)
897 $(TO_UNIX)
898 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
899 $(RM_RF) $(DISTVNAME)
900 $(COMPRESS) $(DISTVNAME).tar
901 $(POSTOP)
1e44e2bf 902
f1387719
PP
903$(DISTVNAME).zip : distdir
904 $(PREOP)
905 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
906 $(RM_RF) $(DISTVNAME)
907 $(POSTOP)
1e44e2bf 908
f1387719
PP
909uutardist : $(DISTVNAME).tar$(SUFFIX)
910 uuencode $(DISTVNAME).tar$(SUFFIX) \\
911 $(DISTVNAME).tar$(SUFFIX) > \\
912 $(DISTVNAME).tar$(SUFFIX)_uu
f4ae0f5e 913
f1387719
PP
914shdist : distdir
915 $(PREOP)
916 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
917 $(RM_RF) $(DISTVNAME)
918 $(POSTOP)
919};
920 join "", @m;
f4ae0f5e
PP
921}
922
f1387719 923=item dist_dir (o)
f4ae0f5e 924
f1387719
PP
925Defines the scratch directory target that will hold the distribution
926before tar-ing (or shar-ing).
1e44e2bf
PP
927
928=cut
929
f1387719
PP
930sub dist_dir {
931 my($self) = shift;
932 my @m;
933 push @m, q{
934distdir :
935 $(RM_RF) $(DISTVNAME)
4bfb3f62 936 $(PERLRUN) -MExtUtils::Manifest=manicopy,maniread \\
68dc0745 937 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
f1387719
PP
938};
939 join "", @m;
1e44e2bf
PP
940}
941
f1387719 942=item dist_test (o)
1e44e2bf 943
f1387719
PP
944Defines a target that produces the distribution in the
945scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
946subdirectory.
1e44e2bf
PP
947
948=cut
949
f1387719 950sub dist_test {
1e44e2bf 951 my($self) = shift;
f1387719
PP
952 my @m;
953 push @m, q{
954disttest : distdir
4bfb3f62 955 cd $(DISTVNAME) && $(PERLRUN) Makefile.PL
f1387719
PP
956 cd $(DISTVNAME) && $(MAKE)
957 cd $(DISTVNAME) && $(MAKE) test
958};
959 join "", @m;
1e44e2bf
PP
960}
961
f1387719 962=item dlsyms (o)
1e44e2bf 963
f1387719
PP
964Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
965files.
1e44e2bf
PP
966
967=cut
968
f1387719
PP
969sub dlsyms {
970 my($self,%attribs) = @_;
1e44e2bf 971
f1387719 972 return '' unless ($^O eq 'aix' && $self->needs_linking() );
1e44e2bf 973
f1387719
PP
974 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
975 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
762efda7 976 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
f1387719 977 my(@m);
1e44e2bf 978
f1387719
PP
979 push(@m,"
980dynamic :: $self->{BASEEXT}.exp
1e44e2bf 981
f1387719 982") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
1e44e2bf 983
f1387719
PP
984 push(@m,"
985static :: $self->{BASEEXT}.exp
1e44e2bf 986
f1387719 987") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
1e44e2bf 988
f1387719
PP
989 push(@m,"
990$self->{BASEEXT}.exp: Makefile.PL
4bfb3f62 991",' $(PERLRUN) -e \'use ExtUtils::Mksymlists; \\
f1387719 992 Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
762efda7
JD
993 neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
994 ', "DL_VARS" => ', neatvalue($vars), ');\'
f1387719 995');
1e44e2bf 996
f1387719
PP
997 join('',@m);
998}
1e44e2bf 999
f1387719 1000=item dynamic (o)
1e44e2bf 1001
f1387719 1002Defines the dynamic target.
1e44e2bf 1003
f1387719 1004=cut
1e44e2bf 1005
f1387719
PP
1006sub dynamic {
1007# --- Dynamic Loading Sections ---
1e44e2bf 1008
f1387719
PP
1009 my($self) = shift;
1010 '
1011## $(INST_PM) has been moved to the all: target.
1012## It remains here for awhile to allow for old usage: "make dynamic"
1013#dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
1014dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
1015 '.$self->{NOECHO}.'$(NOOP)
1016';
1017}
1e44e2bf 1018
f1387719 1019=item dynamic_bs (o)
1e44e2bf 1020
f1387719 1021Defines targets for bootstrap files.
1e44e2bf 1022
f1387719 1023=cut
1e44e2bf 1024
f1387719
PP
1025sub dynamic_bs {
1026 my($self, %attribs) = @_;
1027 return '
1028BOOTSTRAP =
1029' unless $self->has_link_code();
1e44e2bf 1030
f1387719
PP
1031 return '
1032BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1e44e2bf 1033
f1387719
PP
1034# As Mkbootstrap might not write a file (if none is required)
1035# we use touch to prevent make continually trying to remake it.
1036# The DynaLoader only reads a non-empty file.
1037$(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
1038 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
4bfb3f62 1039 '.$self->{NOECHO}.'$(PERLRUN) \
68dc0745
PP
1040 -MExtUtils::Mkbootstrap \
1041 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
f1387719 1042 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
2366100d 1043 $(CHMOD) $(PERM_RW) $@
1e44e2bf 1044
f1387719
PP
1045$(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
1046 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
1047 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
2366100d 1048 $(CHMOD) $(PERM_RW) $@
1e44e2bf 1049';
f1387719 1050}
1e44e2bf 1051
f1387719 1052=item dynamic_lib (o)
1e44e2bf 1053
f1387719
PP
1054Defines how to produce the *.so (or equivalent) files.
1055
1056=cut
1057
1058sub dynamic_lib {
1059 my($self, %attribs) = @_;
1060 return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 1061
f1387719 1062 return '' unless $self->has_link_code;
f4ae0f5e 1063
f1387719
PP
1064 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1065 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1066 my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
1067 my($ldfrom) = '$(LDFROM)';
1068 $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
1069 my(@m);
f07bc2fb 1070 my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : ''; # Useful on other systems too?
f1387719
PP
1071 push(@m,'
1072# This section creates the dynamically loadable $(INST_DYNAMIC)
1073# from $(OBJECT) and possibly $(MYEXTLIB).
1074ARMAYBE = '.$armaybe.'
f07bc2fb 1075OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
f1387719 1076INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
f4ae0f5e 1077
5ba48348 1078$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
f1387719
PP
1079');
1080 if ($armaybe ne ':'){
1081 $ldfrom = 'tmp$(LIB_EXT)';
1082 push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
1083 push(@m,' $(RANLIB) '."$ldfrom\n");
1084 }
1085 $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
ff0cee69 1086
7f0187cb 1087 # The IRIX linker doesn't use LD_RUN_PATH
4194d490 1088 my $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
1d2dff63 1089 if ($^O eq 'irix' && $self->{LD_RUN_PATH});
491527d0 1090
2719e44e
JH
1091 my $libs = $self->{LDLOADLIBS};
1092
1093 if ($^O eq 'netbsd') {
1094 $libs = '$(LLIBPERL)';
1095 }
1096
a84e0cef
JH
1097 # For example in AIX the shared objects/libraries from previous builds
1098 # linger quite a while in the shared dynalinker cache even when nobody
1099 # is using them. This is painful if one for instance tries to restart
1100 # a failed build because the link command will fail unnecessarily 'cos
1101 # the shared object/library is 'busy'.
1102 push(@m,' $(RM_F) $@
1103');
1104
2719e44e
JH
1105 push(@m,
1106' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
1107' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
f1387719 1108 push @m, '
2366100d 1109 $(CHMOD) $(PERM_RWX) $@
f1387719 1110';
1e44e2bf 1111
f1387719 1112 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1e44e2bf
PP
1113 join('',@m);
1114}
1115
f1387719 1116=item exescan
1e44e2bf 1117
f1387719 1118Deprecated method. Use libscan instead.
1e44e2bf
PP
1119
1120=cut
1121
f1387719
PP
1122sub exescan {
1123 my($self,$path) = @_;
1124 $path;
1e44e2bf
PP
1125}
1126
f1387719 1127=item extliblist
1e44e2bf 1128
f1387719
PP
1129Called by init_others, and calls ext ExtUtils::Liblist. See
1130L<ExtUtils::Liblist> for details.
1e44e2bf
PP
1131
1132=cut
1133
f1387719
PP
1134sub extliblist {
1135 my($self,$libs) = @_;
1136 require ExtUtils::Liblist;
1137 $self->ext($libs, $Verbose);
1138}
f4ae0f5e 1139
f1387719 1140=item file_name_is_absolute
f4ae0f5e 1141
1fef88e7 1142Takes as argument a path and returns true, if it is an absolute path.
1e44e2bf 1143
f1387719 1144=cut
1e44e2bf 1145
f1387719
PP
1146sub file_name_is_absolute {
1147 my($self,$file) = @_;
39e571d4 1148 if ($Is_Dos){
4f44ac69 1149 $file =~ m{^([a-z]:)?[\\/]}is ;
39e571d4
ML
1150 }
1151 else {
4f44ac69 1152 $file =~ m:^/:s ;
39e571d4 1153 }
f1387719 1154}
1e44e2bf 1155
f1387719 1156=item find_perl
1e44e2bf 1157
f1387719 1158Finds the executables PERL and FULLPERL
1e44e2bf 1159
f1387719 1160=cut
1e44e2bf 1161
f1387719
PP
1162sub find_perl {
1163 my($self, $ver, $names, $dirs, $trace) = @_;
1164 my($name, $dir);
1165 if ($trace >= 2){
1166 print "Looking for perl $ver by these names:
1167@$names
1168in these dirs:
1169@$dirs
1170";
1171 }
ec751b0b
DB
1172 foreach $name (@$names){
1173 foreach $dir (@$dirs){
1174 next unless defined $dir; # $self->{PERL_SRC} may be undefined
a1f8e286 1175 my ($abs, $val);
f1387719
PP
1176 if ($self->file_name_is_absolute($name)) { # /foo/bar
1177 $abs = $name;
1178 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1179 $abs = $self->catfile($dir, $name);
1180 } else { # foo/bar
1181 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1182 }
1183 print "Checking $abs\n" if ($trace >= 2);
1184 next unless $self->maybe_command($abs);
1185 print "Executing $abs\n" if ($trace >= 2);
a1f8e286
IZ
1186 $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1187 if ($val =~ /VER_OK/) {
f1387719
PP
1188 print "Using PERL=$abs\n" if $trace;
1189 return $abs;
a1f8e286
IZ
1190 } elsif ($trace >= 2) {
1191 print "Result: `$val'\n";
1e44e2bf
PP
1192 }
1193 }
1e44e2bf 1194 }
f1387719
PP
1195 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1196 0; # false and not empty
1197}
1e44e2bf 1198
bab2b58e
AK
1199=back
1200
f1387719 1201=head2 Methods to actually produce chunks of text for the Makefile
1e44e2bf 1202
bab2b58e
AK
1203The methods here are called for each MakeMaker object in the order
1204specified by @ExtUtils::MakeMaker::MM_Sections.
1205
1206=over 2
f4ae0f5e 1207
84902520
TB
1208=item fixin
1209
1210Inserts the sharpbang or equivalent magic number to a script
1211
1212=cut
1213
1214sub fixin { # stolen from the pink Camel book, more or less
1215 my($self,@files) = @_;
1216 my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/;
1217 my($file,$interpreter);
1218 for $file (@files) {
1219 local(*FIXIN);
1220 local(*FIXOUT);
1221 open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
1222 local $/ = "\n";
1223 chomp(my $line = <FIXIN>);
1224 next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
1225 # Now figure out the interpreter name.
1226 my($cmd,$arg) = split ' ', $line, 2;
1227 $cmd =~ s!^.*/!!;
1228
1229 # Now look (in reverse) for interpreter in absolute PATH (unless perl).
1230 if ($cmd eq "perl") {
fb73857a
PP
1231 if ($Config{startperl} =~ m,^\#!.*/perl,) {
1232 $interpreter = $Config{startperl};
1233 $interpreter =~ s,^\#!,,;
1234 } else {
1235 $interpreter = $Config{perlpath};
1236 }
84902520
TB
1237 } else {
1238 my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
1239 $interpreter = '';
1240 my($dir);
1241 foreach $dir (@absdirs) {
1242 if ($self->maybe_command($cmd)) {
1243 warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
1244 $interpreter = $self->catfile($dir,$cmd);
1245 }
1246 }
1247 }
1248 # Figure out how to invoke interpreter on this machine.
1249
1250 my($shb) = "";
1251 if ($interpreter) {
1252 print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
f5cd9d9c 1253 # this is probably value-free on DOSISH platforms
84902520
TB
1254 if ($does_shbang) {
1255 $shb .= "$Config{'sharpbang'}$interpreter";
1256 $shb .= ' ' . $arg if defined $arg;
1257 $shb .= "\n";
1258 }
1259 $shb .= qq{
1260eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
90248788 1261 if 0; # not running under some shell
f5cd9d9c 1262} unless $Is_Win32; # this won't work on win32, so don't
84902520
TB
1263 } else {
1264 warn "Can't find $cmd in PATH, $file unchanged"
1265 if $Verbose;
1266 next;
1267 }
1268
f5cd9d9c 1269 unless ( open(FIXOUT,">$file.new") ) {
84902520
TB
1270 warn "Can't create new $file: $!\n";
1271 next;
1272 }
1273 my($dev,$ino,$mode) = stat FIXIN;
84902520
TB
1274
1275 # Print out the new #! line (or equivalent).
1276 local $\;
1277 undef $/;
1278 print FIXOUT $shb, <FIXIN>;
1279 close FIXIN;
1280 close FIXOUT;
985777a9
GS
1281
1282 # can't rename/chmod open files on some DOSISH platforms
1283
1284 # If they override perm_rwx, we won't notice it during fixin,
1285 # because fixin is run through a new instance of MakeMaker.
1286 # That is why we must run another CHMOD later.
1287 $mode = oct($self->perm_rwx) unless $dev;
1288 chmod $mode, $file;
1289
f5cd9d9c
GS
1290 unless ( rename($file, "$file.bak") ) {
1291 warn "Can't rename $file to $file.bak: $!";
1292 next;
1293 }
1294 unless ( rename("$file.new", $file) ) {
1295 warn "Can't rename $file.new to $file: $!";
1296 unless ( rename("$file.bak", $file) ) {
1297 warn "Can't rename $file.bak back to $file either: $!";
1298 warn "Leaving $file renamed as $file.bak\n";
1299 }
1300 next;
1301 }
84902520
TB
1302 unlink "$file.bak";
1303 } continue {
985777a9 1304 close(FIXIN) if fileno(FIXIN);
2366100d
A
1305 chmod oct($self->perm_rwx), $file or
1306 die "Can't reset permissions for $file: $!\n";
84902520
TB
1307 system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
1308 }
1309}
1310
f1387719
PP
1311=item force (o)
1312
1313Just writes FORCE:
1314
1315=cut
1e44e2bf 1316
f1387719
PP
1317sub force {
1318 my($self) = shift;
1319 '# Phony target to force checking subdirectories.
1320FORCE:
3e3baf6d 1321 '.$self->{NOECHO}.'$(NOOP)
f1387719 1322';
1e44e2bf
PP
1323}
1324
f1387719 1325=item guess_name
1e44e2bf 1326
f1387719
PP
1327Guess the name of this package by examining the working directory's
1328name. MakeMaker calls this only if the developer has not supplied a
1329NAME attribute.
1e44e2bf 1330
f1387719 1331=cut
f4ae0f5e 1332
f1387719
PP
1333# ';
1334
1335sub guess_name {
1336 my($self) = @_;
1337 use Cwd 'cwd';
1338 my $name = basename(cwd());
4f44ac69 1339 $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
f1387719
PP
1340 # strip minus or underline
1341 # followed by a float or some such
1342 print "Warning: Guessing NAME [$name] from current directory name.\n";
1343 $name;
1344}
1345
1346=item has_link_code
1347
1348Returns true if C, XS, MYEXTLIB or similar objects exist within this
1349object that need a compiler. Does not descend into subdirectories as
1350needs_linking() does.
f4ae0f5e
PP
1351
1352=cut
1353
f1387719
PP
1354sub has_link_code {
1355 my($self) = shift;
1356 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1357 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1358 $self->{HAS_LINK_CODE} = 1;
1359 return 1;
f4ae0f5e 1360 }
f1387719 1361 return $self->{HAS_LINK_CODE} = 0;
f4ae0f5e
PP
1362}
1363
cae6c631
JD
1364=item htmlifypods (o)
1365
1366Defines targets and routines to translate the pods into HTML manpages
1367and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
1368directories.
1369
1370=cut
1371
1372sub htmlifypods {
1373 my($self, %attribs) = @_;
1374 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
1375 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
1376 my($dist);
1377 my($pod2html_exe);
1378 if (defined $self->{PERL_SRC}) {
1379 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
1380 } else {
1381 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
1382 }
1383 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
1384 # No pod2html but some HTMLxxxPODS to be installed
1385 print <<END;
1386
1387Warning: I could not locate your pod2html program. Please make sure,
1388 your pod2html program is in your PATH before you execute 'make'
1389
1390END
1391 $pod2html_exe = "-S pod2html";
1392 }
1393 my(@m);
1394 push @m,
1395qq[POD2HTML_EXE = $pod2html_exe\n],
1396qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
1397q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
1398 $self->{MAKEFILE}, q[";' \\
1399-e 'print "Htmlifying $$m{$$_}\n";' \\
1400-e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
4bfb3f62 1401-e 'system(q[$(PERLRUN) $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
cae6c631
JD
1402-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1403];
1404 push @m, "\nhtmlifypods : pure_all ";
1405 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
1406
1407 push(@m,"\n");
1408 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
1409 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
1410 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
1411 }
1412 join('', @m);
1413}
1414
f1387719 1415=item init_dirscan
f4ae0f5e 1416
cae6c631 1417Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
f1387719
PP
1418
1419=cut
1420
1421sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
1422 my($self) = @_;
1423 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1424 local(%pm); #the sub in find() has to see this hash
6ee623d5 1425 @ignore{qw(Makefile.PL test.pl)} = (1,1);
f1387719
PP
1426 $ignore{'makefile.pl'} = 1 if $Is_VMS;
1427 foreach $name ($self->lsdir($self->curdir)){
4ecf31dc 1428 next if $name =~ /\#/;
f1387719
PP
1429 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1430 next unless $self->libscan($name);
1431 if (-d $name){
760ac839 1432 next if -l $name; # We do not support symlinks at all
f1387719 1433 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
4f44ac69
GS
1434 } elsif ($name =~ /\.xs\z/){
1435 my($c); ($c = $name) =~ s/\.xs\z/.c/;
f1387719
PP
1436 $xs{$name} = $c;
1437 $c{$c} = 1;
4f44ac69 1438 } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
f1387719
PP
1439 $c{$name} = 1
1440 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
4f44ac69 1441 } elsif ($name =~ /\.h\z/i){
f1387719 1442 $h{$name} = 1;
4f44ac69
GS
1443 } elsif ($name =~ /\.PL\z/) {
1444 ($pl_files{$name} = $name) =~ s/\.PL\z// ;
933fea7f 1445 } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
918c0b2d 1446 # case-insensitive filesystem, one dot per name, so foo.h.PL
933fea7f 1447 # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
6ee623d5
GS
1448 local($/); open(PL,$name); my $txt = <PL>; close PL;
1449 if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
4f44ac69 1450 ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
6ee623d5
GS
1451 }
1452 else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
4f44ac69 1453 } elsif ($name =~ /\.(p[ml]|pod)\z/){
f1387719 1454 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
f1387719
PP
1455 }
1456 }
f4ae0f5e 1457
f1387719
PP
1458 # Some larger extensions often wish to install a number of *.pm/pl
1459 # files into the library in various locations.
f4ae0f5e 1460
f1387719
PP
1461 # The attribute PMLIBDIRS holds an array reference which lists
1462 # subdirectories which we should search for library files to
1463 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1464 # recursively search through the named directories (skipping any
1465 # which don't exist or contain Makefile.PL files).
f4ae0f5e 1466
f1387719
PP
1467 # For each *.pm or *.pl file found $self->libscan() is called with
1468 # the default installation path in $_[1]. The return value of
1469 # libscan defines the actual installation location. The default
1470 # libscan function simply returns the path. The file is skipped
1471 # if libscan returns false.
f4ae0f5e 1472
f1387719
PP
1473 # The default installation location passed to libscan in $_[1] is:
1474 #
1475 # ./*.pm => $(INST_LIBDIR)/*.pm
1476 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1477 # ./lib/... => $(INST_LIB)/...
1478 #
1479 # In this way the 'lib' directory is seen as the root of the actual
1480 # perl library whereas the others are relative to INST_LIBDIR
1481 # (which includes PARENT_NAME). This is a subtle distinction but one
1482 # that's important for nested modules.
1e44e2bf 1483
f1387719
PP
1484 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1485 unless $self->{PMLIBDIRS};
1e44e2bf 1486
f1387719 1487 #only existing directories that aren't in $dir are allowed
1e44e2bf 1488
f1387719
PP
1489 # Avoid $_ wherever possible:
1490 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1491 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1492 my ($pmlibdir);
1493 @{$self->{PMLIBDIRS}} = ();
1494 foreach $pmlibdir (@pmlibdirs) {
1495 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1e44e2bf 1496 }
1e44e2bf 1497
f1387719
PP
1498 if (@{$self->{PMLIBDIRS}}){
1499 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1500 if ($Verbose >= 2);
1501 require File::Find;
1502 File::Find::find(sub {
1503 if (-d $_){
1504 if ($_ eq "CVS" || $_ eq "RCS"){
1505 $File::Find::prune = 1;
1506 }
1507 return;
1508 }
4ecf31dc 1509 return if /\#/;
f1387719
PP
1510 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1511 my($striplibpath,$striplibname);
93f9cb4b 1512 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
f1387719
PP
1513 ($striplibname,$striplibpath) = fileparse($striplibpath);
1514 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1515 local($_) = $inst; # for backwards compatibility
1516 $inst = $self->libscan($inst);
1517 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1518 return unless $inst;
1519 $pm{$path} = $inst;
1520 }, @{$self->{PMLIBDIRS}});
1521 }
1e44e2bf 1522
f1387719
PP
1523 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1524 $self->{XS} = \%xs unless $self->{XS};
1525 $self->{PM} = \%pm unless $self->{PM};
1526 $self->{C} = [sort keys %c] unless $self->{C};
1527 my(@o_files) = @{$self->{C}};
4f44ac69 1528 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
f1387719
PP
1529 $self->{H} = [sort keys %h] unless $self->{H};
1530 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1e44e2bf 1531
f1387719 1532 # Set up names of manual pages to generate from pods
cae6c631
JD
1533 my %pods;
1534 foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
1535 unless ($self->{"${man}PODS"}) {
1536 $self->{"${man}PODS"} = {};
1537 $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
1538 }
1539 }
1540
1541 if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
f1387719
PP
1542 if ( exists $self->{EXE_FILES} ) {
1543 foreach $name (@{$self->{EXE_FILES}}) {
f1387719
PP
1544 local *FH;
1545 my($ispod)=0;
f1387719 1546 if (open(FH,"<$name")) {
f1387719
PP
1547 while (<FH>) {
1548 if (/^=head1\s+\w+/) {
1549 $ispod=1;
1550 last;
1551 }
1552 }
f1387719
PP
1553 close FH;
1554 } else {
1555 # If it doesn't exist yet, we assume, it has pods in it
1556 $ispod = 1;
1e44e2bf 1557 }
cae6c631
JD
1558 next unless $ispod;
1559 if ($pods{HTMLSCRIPT}) {
1560 $self->{HTMLSCRIPTPODS}->{$name} =
1561 $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
1562 }
1563 if ($pods{MAN1}) {
1564 $self->{MAN1PODS}->{$name} =
1565 $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
1e44e2bf 1566 }
f1387719 1567 }
1e44e2bf
PP
1568 }
1569 }
cae6c631 1570 if ($pods{MAN3} || $pods{HTMLLIB}) {
f1387719
PP
1571 my %manifypods = (); # we collect the keys first, i.e. the files
1572 # we have to convert to pod
1573 foreach $name (keys %{$self->{PM}}) {
4f44ac69 1574 if ($name =~ /\.pod\z/ ) {
f1387719 1575 $manifypods{$name} = $self->{PM}{$name};
4f44ac69 1576 } elsif ($name =~ /\.p[ml]\z/ ) {
f1387719
PP
1577 local *FH;
1578 my($ispod)=0;
f1387719 1579 if (open(FH,"<$name")) {
f1387719
PP
1580 while (<FH>) {
1581 if (/^=head1\s+\w+/) {
1582 $ispod=1;
1583 last;
1584 }
1585 }
f1387719
PP
1586 close FH;
1587 } else {
1588 $ispod = 1;
1589 }
1590 if( $ispod ) {
1591 $manifypods{$name} = $self->{PM}{$name};
1592 }
1593 }
1594 }
1595
1596 # Remove "Configure.pm" and similar, if it's not the only pod listed
1597 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1598 foreach $name (keys %manifypods) {
40b90ac3 1599 if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
f1387719
PP
1600 delete $manifypods{$name};
1601 next;
1602 }
1603 my($manpagename) = $name;
4f44ac69 1604 $manpagename =~ s/\.p(od|m|l)\z//;
cae6c631
JD
1605 if ($pods{HTMLLIB}) {
1606 $self->{HTMLLIBPODS}->{$name} =
1607 $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
1608 }
4f44ac69 1609 unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
f1387719
PP
1610 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1611 }
cae6c631
JD
1612 if ($pods{MAN3}) {
1613 $manpagename = $self->replace_manpage_separator($manpagename);
1614 $self->{MAN3PODS}->{$name} =
1615 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
1616 }
1e44e2bf
PP
1617 }
1618 }
f1387719 1619}
1e44e2bf 1620
f1387719 1621=item init_main
1e44e2bf 1622
f1387719
PP
1623Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1624PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
8cc95fdb 1625PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
f1387719 1626LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
f4ae0f5e 1627
f1387719 1628=cut
1e44e2bf 1629
f1387719
PP
1630sub init_main {
1631 my($self) = @_;
1e44e2bf 1632
f1387719 1633 # --- Initialize Module Name and Paths
1e44e2bf 1634
f1387719
PP
1635 # NAME = Foo::Bar::Oracle
1636 # FULLEXT = Foo/Bar/Oracle
1637 # BASEEXT = Oracle
1638 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1639 # PARENT_NAME = Foo::Bar
1640### Only UNIX:
1641### ($self->{FULLEXT} =
1642### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1643 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1e44e2bf 1644
1e44e2bf 1645
f1387719 1646 # Copied from DynaLoader:
1e44e2bf 1647
f1387719
PP
1648 my(@modparts) = split(/::/,$self->{NAME});
1649 my($modfname) = $modparts[-1];
1e44e2bf 1650
f1387719
PP
1651 # Some systems have restrictions on files names for DLL's etc.
1652 # mod2fname returns appropriate file base name (typically truncated)
1653 # It may also edit @modparts if required.
1654 if (defined &DynaLoader::mod2fname) {
1655 $modfname = &DynaLoader::mod2fname(\@modparts);
bab2b58e 1656 }
1e44e2bf 1657
4f44ac69 1658 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
f1387719 1659
760ac839 1660 if (defined &DynaLoader::mod2fname) {
f1387719
PP
1661 # As of 5.001m, dl_os2 appends '_'
1662 $self->{DLBASE} = $modfname;
1663 } else {
1664 $self->{DLBASE} = '$(BASEEXT)';
1665 }
1666
1e44e2bf 1667
f1387719
PP
1668 ### ROOTEXT deprecated from MM 5.32
1669### ($self->{ROOTEXT} =
1670### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1671### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1e44e2bf 1672
1e44e2bf 1673
f1387719 1674 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1e44e2bf 1675
f1387719
PP
1676 # *Real* information: where did we get these two from? ...
1677 my $inc_config_dir = dirname($INC{'Config.pm'});
1678 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1e44e2bf 1679
f1387719
PP
1680 unless ($self->{PERL_SRC}){
1681 my($dir);
dfc18e8a 1682 foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir(),$self->updir())){
f1387719
PP
1683 if (
1684 -f $self->catfile($dir,"config.sh")
1685 &&
1686 -f $self->catfile($dir,"perl.h")
1687 &&
1688 -f $self->catfile($dir,"lib","Exporter.pm")
1689 ) {
1690 $self->{PERL_SRC}=$dir ;
1691 last;
1692 }
1693 }
1694 }
1695 if ($self->{PERL_SRC}){
1696 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1697 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
137443ea 1698 $self->{PERL_INC} = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
1e44e2bf 1699
137443ea 1700 # catch a situation that has occurred a few times in the past:
bab2b58e
AK
1701 unless (
1702 -s $self->catfile($self->{PERL_SRC},'cflags')
1703 or
1704 $Is_VMS
1705 &&
1706 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1707 or
1708 $Is_Mac
137443ea
PP
1709 or
1710 $Is_Win32
bab2b58e
AK
1711 ){
1712 warn qq{
f1387719
PP
1713You cannot build extensions below the perl source tree after executing
1714a 'make clean' in the perl source tree.
1e44e2bf 1715
f1387719
PP
1716To rebuild extensions distributed with the perl source you should
1717simply Configure (to include those extensions) and then build perl as
1718normal. After installing perl the source tree can be deleted. It is
1719not needed for building extensions by running 'perl Makefile.PL'
1720usually without extra arguments.
1e44e2bf 1721
f1387719
PP
1722It is recommended that you unpack and build additional extensions away
1723from the perl source tree.
bab2b58e
AK
1724};
1725 }
f1387719
PP
1726 } else {
1727 # we should also consider $ENV{PERL5LIB} here
23614c1f 1728 my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
f1387719
PP
1729 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1730 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1731 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1732 my $perl_h;
23614c1f 1733
0a022e8e 1734 no warnings 'uninitialized' ;
23614c1f
JH
1735 if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
1736 and not $old){
1737 # Maybe somebody tries to build an extension with an
1738 # uninstalled Perl outside of Perl build tree
1739 my $found;
1740 for my $dir (@INC) {
1741 $found = $dir, last if -e $self->catdir($dir, "Config.pm");
1742 }
1743 if ($found) {
1744 my $inc = dirname $found;
1745 if (-e $self->catdir($inc, "perl.h")) {
1746 $self->{PERL_LIB} = $found;
1747 $self->{PERL_ARCHLIB} = $found;
1748 $self->{PERL_INC} = $inc;
1749 $self->{UNINSTALLED_PERL} = 1;
1750 print STDOUT <<EOP;
1751... Detected uninstalled Perl. Trying to continue.
1752EOP
1753 }
1754 }
1755 }
1756
bab2b58e
AK
1757 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1758 die qq{
f1387719 1759Error: Unable to locate installed Perl libraries or Perl source code.
f4ae0f5e 1760
f1387719 1761It is recommended that you install perl in a standard location before
bab2b58e
AK
1762building extensions. Some precompiled versions of perl do not contain
1763these header files, so you cannot build extensions. In such a case,
1764please build and install your perl from a fresh perl distribution. It
1765usually solves this kind of problem.
f4ae0f5e 1766
bab2b58e
AK
1767\(You get this message, because MakeMaker could not find "$perl_h"\)
1768};
1769 }
f1387719
PP
1770# print STDOUT "Using header files found in $self->{PERL_INC}\n"
1771# if $Verbose && $self->needs_linking();
1e44e2bf 1772
f1387719 1773 }
1e44e2bf 1774
f1387719
PP
1775 # We get SITELIBEXP and SITEARCHEXP directly via
1776 # Get_from_Config. When we are running standard modules, these
1777 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1778 # set it to "site". I prefer that INSTALLDIRS be set from outside
1779 # MakeMaker.
1780 $self->{INSTALLDIRS} ||= "site";
1e44e2bf 1781
f1387719
PP
1782 # INST_LIB typically pre-set if building an extension after
1783 # perl has been built and installed. Setting INST_LIB allows
1784 # you to build directly into, say $Config::Config{privlibexp}.
1785 unless ($self->{INST_LIB}){
1e44e2bf 1786
1e44e2bf 1787
f1387719 1788 ##### XXXXX We have to change this nonsense
1e44e2bf 1789
f1387719
PP
1790 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1791 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1792 } else {
1793 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1794 }
1795 }
1796 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1797 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1e44e2bf 1798
93f9cb4b
PP
1799 # We need to set up INST_LIBDIR before init_libscan() for VMS
1800 my @parentdir = split(/::/, $self->{PARENT_NAME});
1801 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1802 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1803 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1804 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1805
f1387719
PP
1806 # INST_EXE is deprecated, should go away March '97
1807 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1808 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1e44e2bf 1809
f1387719 1810 # The user who requests an installation directory explicitly
d1be9408 1811 # should not have to tell us an architecture installation directory
bab2b58e 1812 # as well. We look if a directory exists that is named after the
f1387719
PP
1813 # architecture. If not we take it as a sign that it should be the
1814 # same as the requested installation directory. Otherwise we take
1815 # the found one.
1816 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1817 my($libpair);
1818 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1819 my $lib = "install$libpair->{l}";
1820 my $Lib = uc $lib;
1821 my $Arch = uc "install$libpair->{a}";
1822 if( $self->{$Lib} && ! $self->{$Arch} ){
1823 my($ilib) = $Config{$lib};
1824 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1e44e2bf 1825
f1387719
PP
1826 $self->prefixify($Arch,$ilib,$self->{$Lib});
1827
1828 unless (-d $self->{$Arch}) {
1829 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1830 $self->{$Arch} = $self->{$Lib};
1831 }
1832 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1833 }
1e44e2bf 1834 }
f4ae0f5e 1835
f1387719
PP
1836 # we have to look at the relation between $Config{prefix} and the
1837 # requested values. We're going to set the $Config{prefix} part of
1838 # all the installation path variables to literally $(PREFIX), so
1839 # the user can still say make PREFIX=foo
bab2b58e 1840 my($configure_prefix) = $Config{'prefix'};
8cc95fdb 1841 $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
bab2b58e
AK
1842 $self->{PREFIX} ||= $configure_prefix;
1843
1844
1845 my($install_variable,$search_prefix,$replace_prefix);
1846
b2b3595d 1847 # If the prefix contains perl, Configure shapes the tree as follows:
bab2b58e
AK
1848 # perlprefix/lib/ INSTALLPRIVLIB
1849 # perlprefix/lib/pod/
1850 # perlprefix/lib/site_perl/ INSTALLSITELIB
1851 # perlprefix/bin/ INSTALLBIN
1852 # perlprefix/man/ INSTALLMAN1DIR
1853 # else
1854 # prefix/lib/perl5/ INSTALLPRIVLIB
1855 # prefix/lib/perl5/pod/
1856 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1857 # prefix/bin/ INSTALLBIN
1858 # prefix/lib/perl5/man/ INSTALLMAN1DIR
b2b3595d
GS
1859 #
1860 # The above results in various kinds of breakage on various
1861 # platforms, so we cope with it as follows: if prefix/lib/perl5
1862 # or prefix/lib/perl5/man exist, we'll replace those instead
1863 # of /prefix/{lib,man}
bab2b58e
AK
1864
1865 $replace_prefix = qq[\$\(PREFIX\)];
1866 for $install_variable (qw/
1867 INSTALLBIN
1868 INSTALLSCRIPT
1869 /) {
1870 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1871 }
b2b3595d 1872 my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
71ad7795 1873 $funkylibdir = '' unless -d $funkylibdir;
b2b3595d 1874 $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
bab2b58e
AK
1875 if ($self->{LIB}) {
1876 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1877 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1878 $self->catdir($self->{LIB},$Config{'archname'});
b2b3595d
GS
1879 }
1880 else {
1881 if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
1882 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
1883 }
1884 else {
1885 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
1886 }
bab2b58e
AK
1887 for $install_variable (qw/
1888 INSTALLPRIVLIB
1889 INSTALLARCHLIB
1890 INSTALLSITELIB
1891 INSTALLSITEARCH
b2b3595d
GS
1892 /)
1893 {
bab2b58e
AK
1894 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1895 }
f1387719 1896 }
b2b3595d 1897 my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
71ad7795 1898 $funkymandir = '' unless -d $funkymandir;
b2b3595d
GS
1899 $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
1900 if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
1901 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
1902 }
1903 else {
1904 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
1905 }
f1387719 1906 for $install_variable (qw/
bab2b58e
AK
1907 INSTALLMAN1DIR
1908 INSTALLMAN3DIR
b2b3595d
GS
1909 /)
1910 {
bab2b58e 1911 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
f1387719 1912 }
1e44e2bf 1913
f1387719
PP
1914 # Now we head at the manpages. Maybe they DO NOT want manpages
1915 # installed
1916 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1917 unless defined $self->{INSTALLMAN1DIR};
1918 unless (defined $self->{INST_MAN1DIR}){
1919 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1920 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1921 } else {
1922 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1923 }
1924 }
1925 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1e44e2bf 1926
f1387719
PP
1927 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1928 unless defined $self->{INSTALLMAN3DIR};
1929 unless (defined $self->{INST_MAN3DIR}){
1930 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1931 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1932 } else {
1933 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1934 }
1e44e2bf 1935 }
f1387719
PP
1936 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1937
cae6c631
JD
1938 $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
1939 unless defined $self->{INSTALLHTMLPRIVLIBDIR};
1940 $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
1941 unless defined $self->{INSTALLHTMLSITELIBDIR};
1942
1943 unless (defined $self->{INST_HTMLLIBDIR}){
1944 if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
1945 $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
1946 } else {
1947 $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
1948 }
1949 }
1950
1951 $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
1952 unless defined $self->{INSTALLHTMLSCRIPTDIR};
1953 unless (defined $self->{INST_HTMLSCRIPTDIR}){
1954 if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
1955 $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
1956 } else {
1957 $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
1958 }
1959 }
1960 $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
1961
f1387719
PP
1962
1963 # Get some stuff out of %Config if we haven't yet done so
1964 print STDOUT "CONFIG must be an array ref\n"
1965 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1966 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1967 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1968 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1969 my(%once_only,$m);
1970 foreach $m (@{$self->{CONFIG}}){
1971 next if $once_only{$m};
1972 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1973 unless exists $Config::Config{$m};
1974 $self->{uc $m} ||= $Config::Config{$m};
1975 $once_only{$m} = 1;
1e44e2bf 1976 }
1e44e2bf 1977
f1387719
PP
1978# This is too dangerous:
1979# if ($^O eq "next") {
1980# $self->{AR} = "libtool";
1981# $self->{AR_STATIC_ARGS} = "-o";
1982# }
1983# But I leave it as a placeholder
1e44e2bf 1984
f1387719 1985 $self->{AR_STATIC_ARGS} ||= "cr";
1e44e2bf 1986
f1387719
PP
1987 # These should never be needed
1988 $self->{LD} ||= 'ld';
1989 $self->{OBJ_EXT} ||= '.o';
1990 $self->{LIB_EXT} ||= '.a';
1991
1992 $self->{MAP_TARGET} ||= "perl";
1993
1994 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1995
1996 # make a simple check if we find Exporter
1997 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1998 (Exporter.pm not found)"
1999 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
2000 $self->{NAME} eq "ExtUtils::MakeMaker";
1e44e2bf 2001
f1387719
PP
2002 # Determine VERSION and VERSION_FROM
2003 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
2004 if ($self->{VERSION_FROM}){
2005 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
2006 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1e44e2bf 2007 }
f1387719
PP
2008
2009 # strip blanks
2010 if ($self->{VERSION}) {
2011 $self->{VERSION} =~ s/^\s+//;
2012 $self->{VERSION} =~ s/\s+$//;
1e44e2bf 2013 }
1e44e2bf 2014
f1387719
PP
2015 $self->{VERSION} ||= "0.10";
2016 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1e44e2bf
PP
2017
2018
f1387719
PP
2019 # Graham Barr and Paul Marquess had some ideas how to ensure
2020 # version compatibility between the *.pm file and the
2021 # corresponding *.xs file. The bottomline was, that we need an
2022 # XS_VERSION macro that defaults to VERSION:
2023 $self->{XS_VERSION} ||= $self->{VERSION};
1e44e2bf 2024
f1387719
PP
2025 # --- Initialize Perl Binary Locations
2026
2027 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
2028 # will be working versions of perl 5. miniperl has priority over perl
2029 # for PERL to ensure that $(PERL) is usable while building ./ext/*
2030 my ($component,@defpath);
2031 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
2032 push @defpath, $component if defined $component;
1e44e2bf 2033 }
ff0cee69 2034 $self->{PERL} ||=
0ff3fa1a
GS
2035 $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
2036 'perl','perl5',"perl$Config{version}" ],
ff0cee69 2037 \@defpath, $Verbose );
f1387719
PP
2038 # don't check if perl is executable, maybe they have decided to
2039 # supply switches with perl
2040
2041 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
2042 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
2043 unless ($self->{FULLPERL});
4bfb3f62
MS
2044
2045 # Are we building the core?
2046 $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE};
2047
2048 # How do we run perl?
2049 $self->{PERLRUN} = $self->{PERL};
2050
2051 # How do we run perl when installing libraries?
2052 $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2053
2054 # What extra library dirs do we need when running the tests?
2055 $self->{TEST_LIBS} .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2056
2057 # When building the core, we need to add some helper libs since
2058 # perl's @INC won't work (we're not installed yet).
2059 foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) {
2060 $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)'
2061 if $self->{PERL_CORE};
2062 }
1e44e2bf
PP
2063}
2064
f1387719 2065=item init_others
1e44e2bf 2066
f1387719
PP
2067Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
2068OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
68dc0745 2069MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1e44e2bf
PP
2070
2071=cut
2072
f1387719 2073sub init_others { # --- Initialize Other Attributes
1e44e2bf 2074 my($self) = shift;
1e44e2bf 2075
f1387719
PP
2076 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
2077 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
2078 # undefined. In any case we turn it into an anon array:
1e44e2bf 2079
f1387719
PP
2080 # May check $Config{libs} too, thus not empty.
2081 $self->{LIBS}=[''] unless $self->{LIBS};
f4ae0f5e 2082
a1f8e286 2083 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
f1387719
PP
2084 $self->{LD_RUN_PATH} = "";
2085 my($libs);
2086 foreach $libs ( @{$self->{LIBS}} ){
2087 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
2088 my(@libs) = $self->extliblist($libs);
2089 if ($libs[0] or $libs[1] or $libs[2]){
2090 # LD_RUN_PATH now computed by ExtUtils::Liblist
2091 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
2092 last;
2093 }
2094 }
f4ae0f5e 2095
f1387719
PP
2096 if ( $self->{OBJECT} ) {
2097 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
2098 } else {
2099 # init_dirscan should have found out, if we have C files
2100 $self->{OBJECT} = "";
2101 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1e44e2bf 2102 }
f1387719
PP
2103 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
2104 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
2105 $self->{PERLMAINCC} ||= '$(CC)';
2106 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1e44e2bf 2107
f1387719
PP
2108 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
2109 # the 'dynamic' section of MM. We don't have this problem with
2110 # 'static', since we either must use it (%Config says we can't
2111 # use dynamic loading) or the caller asked for it explicitly.
2112 if (!$self->{LINKTYPE}) {
2113 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
2114 ? 'static'
2115 : ($Config::Config{usedl} ? 'dynamic' : 'static');
2116 };
2117
2118 # These get overridden for VMS and maybe some other systems
55497cff 2119 $self->{NOOP} ||= '$(SHELL) -c true';
f1387719
PP
2120 $self->{FIRST_MAKEFILE} ||= "Makefile";
2121 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
2122 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
2123 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
2124 $self->{RM_F} ||= "rm -f";
2125 $self->{RM_RF} ||= "rm -rf";
2126 $self->{TOUCH} ||= "touch";
68dc0745 2127 $self->{TEST_F} ||= "test -f";
f1387719
PP
2128 $self->{CP} ||= "cp";
2129 $self->{MV} ||= "mv";
2130 $self->{CHMOD} ||= "chmod";
2131 $self->{UMASK_NULL} ||= "umask 0";
68dc0745 2132 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1e44e2bf
PP
2133}
2134
f1387719 2135=item install (o)
1e44e2bf 2136
f1387719 2137Defines the install target.
1e44e2bf
PP
2138
2139=cut
2140
f1387719
PP
2141sub install {
2142 my($self, %attribs) = @_;
1e44e2bf 2143 my(@m);
a5f75d66 2144
f1387719
PP
2145 push @m, q{
2146install :: all pure_install doc_install
1e44e2bf 2147
f1387719 2148install_perl :: all pure_perl_install doc_perl_install
1e44e2bf 2149
f1387719 2150install_site :: all pure_site_install doc_site_install
1e44e2bf 2151
f1387719
PP
2152install_ :: install_site
2153 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2154
f1387719 2155pure_install :: pure_$(INSTALLDIRS)_install
1e44e2bf 2156
f1387719
PP
2157doc_install :: doc_$(INSTALLDIRS)_install
2158 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1e44e2bf 2159
f1387719
PP
2160pure__install : pure_site_install
2161 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2162
f1387719
PP
2163doc__install : doc_site_install
2164 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2165
f1387719
PP
2166pure_perl_install ::
2167 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2168 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2169 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2170 $(INST_LIB) $(INSTALLPRIVLIB) \
2171 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
2172 $(INST_BIN) $(INSTALLBIN) \
2173 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2174 $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
2175 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719
PP
2176 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2177 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2178 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2179 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1e44e2bf 2180
1e44e2bf 2181
f1387719
PP
2182pure_site_install ::
2183 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2184 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
2185 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
2186 $(INST_LIB) $(INSTALLSITELIB) \
2187 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
2188 $(INST_BIN) $(INSTALLBIN) \
2189 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2190 $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
2191 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719
PP
2192 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2193 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2194 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2195 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1e44e2bf 2196
f1387719 2197doc_perl_install ::
082ab410 2198 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2199 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2200 "Module" "$(NAME)" \
f1387719
PP
2201 "installed into" "$(INSTALLPRIVLIB)" \
2202 LINKTYPE "$(LINKTYPE)" \
2203 VERSION "$(VERSION)" \
2204 EXE_FILES "$(EXE_FILES)" \
2205 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2206
f1387719 2207doc_site_install ::
082ab410 2208 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2209 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2210 "Module" "$(NAME)" \
f1387719
PP
2211 "installed into" "$(INSTALLSITELIB)" \
2212 LINKTYPE "$(LINKTYPE)" \
2213 VERSION "$(VERSION)" \
2214 EXE_FILES "$(EXE_FILES)" \
2215 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2216
f1387719 2217};
1e44e2bf 2218
f1387719
PP
2219 push @m, q{
2220uninstall :: uninstall_from_$(INSTALLDIRS)dirs
f4ae0f5e 2221
f1387719
PP
2222uninstall_from_perldirs ::
2223 }.$self->{NOECHO}.
2224 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1e44e2bf 2225
f1387719
PP
2226uninstall_from_sitedirs ::
2227 }.$self->{NOECHO}.
2228 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2229};
1e44e2bf 2230
f1387719
PP
2231 join("",@m);
2232}
1e44e2bf 2233
f1387719 2234=item installbin (o)
1e44e2bf 2235
85fe4bb3 2236Defines targets to make and to install EXE_FILES.
1e44e2bf 2237
f1387719 2238=cut
1e44e2bf 2239
f1387719
PP
2240sub installbin {
2241 my($self) = shift;
2242 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2243 return "" unless @{$self->{EXE_FILES}};
2244 my(@m, $from, $to, %fromto, @to);
2245 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2246 for $from (@{$self->{EXE_FILES}}) {
2247 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2248 local($_) = $path; # for backwards compatibility
2249 $to = $self->libscan($path);
2250 print "libscan($from) => '$to'\n" if ($Verbose >=2);
2251 $fromto{$from}=$to;
2252 }
2253 @to = values %fromto;
84902520 2254 push(@m, qq{
f1387719 2255EXE_FILES = @{$self->{EXE_FILES}}
1e44e2bf 2256
f5cd9d9c 2257} . ($Is_Win32
4bfb3f62 2258 ? q{FIXIN = $(PERLRUN) \
f5cd9d9c 2259 -e "system qq[pl2bat.bat ].shift"
4bfb3f62 2260} : q{FIXIN = $(PERLRUN) -MExtUtils::MakeMaker \
84902520 2261 -e "MY->fixin(shift)"
f5cd9d9c 2262}).qq{
85fe4bb3 2263pure_all :: @to
2d6e8844 2264 $self->{NOECHO}\$(NOOP)
1e44e2bf 2265
f1387719
PP
2266realclean ::
2267 $self->{RM_F} @to
84902520 2268});
1e44e2bf 2269
f1387719
PP
2270 while (($from,$to) = each %fromto) {
2271 last unless defined $from;
2272 my $todir = dirname($to);
2273 push @m, "
84902520 2274$to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
f1387719
PP
2275 $self->{NOECHO}$self->{RM_F} $to
2276 $self->{CP} $from $to
84902520 2277 \$(FIXIN) $to
2366100d 2278 -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
f1387719 2279";
1e44e2bf 2280 }
f1387719
PP
2281 join "", @m;
2282}
1e44e2bf 2283
f1387719 2284=item libscan (o)
1e44e2bf 2285
f1387719
PP
2286Takes a path to a file that is found by init_dirscan and returns false
2287if we don't want to include this file in the library. Mainly used to
2288exclude RCS, CVS, and SCCS directories from installation.
1e44e2bf 2289
f1387719 2290=cut
1e44e2bf 2291
f1387719 2292# ';
1e44e2bf 2293
f1387719
PP
2294sub libscan {
2295 my($self,$path) = @_;
2296 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2297 $path;
1e44e2bf
PP
2298}
2299
f4ae0f5e 2300=item linkext (o)
1e44e2bf 2301
f4ae0f5e 2302Defines the linkext target which in turn defines the LINKTYPE.
1e44e2bf
PP
2303
2304=cut
2305
2306sub linkext {
2307 my($self, %attribs) = @_;
1e44e2bf
PP
2308 # LINKTYPE => static or dynamic or ''
2309 my($linktype) = defined $attribs{LINKTYPE} ?
2310 $attribs{LINKTYPE} : '$(LINKTYPE)';
2311 "
2312linkext :: $linktype
f4ae0f5e 2313 $self->{NOECHO}\$(NOOP)
1e44e2bf
PP
2314";
2315}
2316
f1387719 2317=item lsdir
1e44e2bf 2318
f1387719
PP
2319Takes as arguments a directory name and a regular expression. Returns
2320all entries in the directory that match the regular expression.
1e44e2bf
PP
2321
2322=cut
2323
f1387719
PP
2324sub lsdir {
2325 my($self) = shift;
2326 my($dir, $regex) = @_;
2327 my(@ls);
2328 my $dh = new DirHandle;
2329 $dh->open($dir || ".") or return ();
2330 @ls = $dh->read;
2331 $dh->close;
2332 @ls = grep(/$regex/, @ls) if $regex;
2333 @ls;
2334}
2335
2336=item macro (o)
2337
2338Simple subroutine to insert the macros defined by the macro attribute
2339into the Makefile.
2340
2341=cut
2342
2343sub macro {
1e44e2bf 2344 my($self,%attribs) = @_;
f1387719
PP
2345 my(@m,$key,$val);
2346 while (($key,$val) = each %attribs){
2347 last unless defined $key;
2348 push @m, "$key = $val\n";
1e44e2bf 2349 }
f1387719
PP
2350 join "", @m;
2351}
1e44e2bf 2352
f1387719 2353=item makeaperl (o)
1e44e2bf 2354
f1387719
PP
2355Called by staticmake. Defines how to write the Makefile to produce a
2356static new perl.
2357
55497cff
PP
2358By default the Makefile produced includes all the static extensions in
2359the perl library. (Purified versions of library files, e.g.,
2360DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2361
f1387719
PP
2362=cut
2363
2364sub makeaperl {
2365 my($self, %attribs) = @_;
2366 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2367 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1e44e2bf 2368 my(@m);
f1387719
PP
2369 push @m, "
2370# --- MakeMaker makeaperl section ---
2371MAP_TARGET = $target
2372FULLPERL = $self->{FULLPERL}
2373";
2374 return join '', @m if $self->{PARENT};
1e44e2bf 2375
f1387719 2376 my($dir) = join ":", @{$self->{DIR}};
1e44e2bf 2377
f1387719
PP
2378 unless ($self->{MAKEAPERL}) {
2379 push @m, q{
2380$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2381 $(MAKE) -f $(MAKE_APERL_FILE) $@
1e44e2bf 2382
f1387719
PP
2383$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2384 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
4bfb3f62 2385 }.$self->{NOECHO}.q{$(PERLRUNINST) \
f1387719
PP
2386 Makefile.PL DIR=}, $dir, q{ \
2387 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2388 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
1e44e2bf 2389
f1387719
PP
2390 foreach (@ARGV){
2391 if( /\s/ ){
2392 s/=(.*)/='$1'/;
2393 }
2394 push @m, " \\\n\t\t$_";
2395 }
2396# push @m, map( " \\\n\t\t$_", @ARGV );
2397 push @m, "\n";
1e44e2bf 2398
f1387719
PP
2399 return join '', @m;
2400 }
1e44e2bf 2401
1e44e2bf 2402
1e44e2bf 2403
f1387719 2404 my($cccmd, $linkcmd, $lperl);
1e44e2bf 2405
1e44e2bf 2406
f1387719
PP
2407 $cccmd = $self->const_cccmd($libperl);
2408 $cccmd =~ s/^CCCMD\s*=\s*//;
2409 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
bab2b58e 2410 $cccmd .= " $Config::Config{cccdlflags}"
042ade60 2411 if ($Config::Config{useshrplib} eq 'true');
f1387719 2412 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
1e44e2bf 2413
f1387719
PP
2414 # The front matter of the linkcommand...
2415 $linkcmd = join ' ', "\$(CC)",
5869b1f1 2416 grep($_, @Config{qw(ldflags ccdlflags)});
f1387719 2417 $linkcmd =~ s/\s+/ /g;
93f9cb4b 2418 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
1e44e2bf 2419
f1387719
PP
2420 # Which *.a files could we make use of...
2421 local(%static);
2422 require File::Find;
2423 File::Find::find(sub {
2424 return unless m/\Q$self->{LIB_EXT}\E$/;
2425 return if m/^libperl/;
55497cff
PP
2426 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2427 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
1e44e2bf 2428
f1387719
PP
2429 if( exists $self->{INCLUDE_EXT} ){
2430 my $found = 0;
2431 my $incl;
2432 my $xx;
2433
4f44ac69 2434 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719
PP
2435 $xx =~ s,/?$_,,;
2436 $xx =~ s,/,::,g;
2437
2438 # Throw away anything not explicitly marked for inclusion.
2439 # DynaLoader is implied.
2440 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2441 if( $xx eq $incl ){
2442 $found++;
2443 last;
2444 }
2445 }
2446 return unless $found;
2447 }
2448 elsif( exists $self->{EXCLUDE_EXT} ){
2449 my $excl;
2450 my $xx;
1e44e2bf 2451
4f44ac69 2452 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719
PP
2453 $xx =~ s,/?$_,,;
2454 $xx =~ s,/,::,g;
1e44e2bf 2455
f1387719
PP
2456 # Throw away anything explicitly marked for exclusion
2457 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2458 return if( $xx eq $excl );
2459 }
2460 }
2461
2462 # don't include the installed version of this extension. I
2463 # leave this line here, although it is not necessary anymore:
2464 # I patched minimod.PL instead, so that Miniperl.pm won't
2465 # enclude duplicates
2466
2467 # Once the patch to minimod.PL is in the distribution, I can
2468 # drop it
4f44ac69 2469 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
f1387719
PP
2470 use Cwd 'cwd';
2471 $static{cwd() . "/" . $_}++;
2472 }, grep( -d $_, @{$searchdirs || []}) );
2473
2474 # We trust that what has been handed in as argument, will be buildable
2475 $static = [] unless $static;
2476 @static{@{$static}} = (1) x @{$static};
2477
2478 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2479 for (sort keys %static) {
4f44ac69 2480 next unless /\Q$self->{LIB_EXT}\E\z/;
f1387719
PP
2481 $_ = dirname($_) . "/extralibs.ld";
2482 push @$extra, $_;
1e44e2bf 2483 }
1e44e2bf 2484
f1387719 2485 grep(s/^/-I/, @{$perlinc || []});
1e44e2bf 2486
f1387719
PP
2487 $target = "perl" unless $target;
2488 $tmp = "." unless $tmp;
1e44e2bf 2489
f1387719
PP
2490# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2491# regenerate the Makefiles, MAP_STATIC and the dependencies for
2492# extralibs.all are computed correctly
2493 push @m, "
2494MAP_LINKCMD = $linkcmd
2495MAP_PERLINC = @{$perlinc || []}
2496MAP_STATIC = ",
2497join(" \\\n\t", reverse sort keys %static), "
1e44e2bf 2498
9c839522 2499MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib}
f1387719
PP
2500";
2501
2502 if (defined $libperl) {
2503 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2504 }
2505 unless ($libperl && -f $lperl) { # Ilya's code...
2506 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
3f73c567 2507 $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
f1387719
PP
2508 $libperl ||= "libperl$self->{LIB_EXT}";
2509 $libperl = "$dir/$libperl";
2510 $lperl ||= "libperl$self->{LIB_EXT}";
2511 $lperl = "$dir/$lperl";
ff0cee69
PP
2512
2513 if (! -f $libperl and ! -f $lperl) {
2514 # We did not find a static libperl. Maybe there is a shared one?
2515 if ($^O eq 'solaris' or $^O eq 'sunos') {
2516 $lperl = $libperl = "$dir/$Config::Config{libperl}";
2517 # SUNOS ld does not take the full path to a shared library
2518 $libperl = '' if $^O eq 'sunos';
2519 }
2520 }
2521
f1387719
PP
2522 print STDOUT "Warning: $libperl not found
2523 If you're going to build a static perl binary, make sure perl is installed
2524 otherwise ignore this warning\n"
2525 unless (-f $lperl || defined($self->{PERL_SRC}));
2526 }
1e44e2bf 2527
f1387719
PP
2528 push @m, "
2529MAP_LIBPERL = $libperl
2530";
1e44e2bf 2531
f1387719
PP
2532 push @m, "
2533\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2534 $self->{NOECHO}$self->{RM_F} \$\@
2535 $self->{NOECHO}\$(TOUCH) \$\@
2536";
1e44e2bf 2537
f1387719
PP
2538 my $catfile;
2539 foreach $catfile (@$extra){
2540 push @m, "\tcat $catfile >> \$\@\n";
1e44e2bf 2541 }
ff0cee69
PP
2542 # SUNOS ld does not take the full path to a shared library
2543 my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
1e44e2bf 2544
ff0cee69 2545push @m, "
f1387719 2546\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
4194d490 2547 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
f1387719
PP
2548 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2549 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2550 $self->{NOECHO}echo 'To remove the intermediate files say'
2551 $self->{NOECHO}echo ' make -f $makefilename map_clean'
1e44e2bf 2552
f1387719
PP
2553$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2554";
2555 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
1e44e2bf 2556
f1387719
PP
2557 push @m, qq{
2558$tmp/perlmain.c: $makefilename}, q{
2559 }.$self->{NOECHO}.q{echo Writing $@
68dc0745 2560 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
4f44ac69 2561 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
1e44e2bf 2562
f1387719 2563};
39e571d4
ML
2564 push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2565} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2566
1e44e2bf 2567
f1387719
PP
2568 push @m, q{
2569doc_inst_perl:
2570 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
082ab410 2571 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2572 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2573 "Perl binary" "$(MAP_TARGET)" \
f1387719
PP
2574 MAP_STATIC "$(MAP_STATIC)" \
2575 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2576 MAP_LIBPERL "$(MAP_LIBPERL)" \
2577 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2578
f1387719 2579};
1e44e2bf 2580
f1387719
PP
2581 push @m, q{
2582inst_perl: pure_inst_perl doc_inst_perl
1e44e2bf 2583
f1387719
PP
2584pure_inst_perl: $(MAP_TARGET)
2585 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
1e44e2bf 2586
f1387719
PP
2587clean :: map_clean
2588
2589map_clean :
2590 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2591};
2592
2593 join '', @m;
1e44e2bf
PP
2594}
2595
f1387719 2596=item makefile (o)
1e44e2bf 2597
f1387719 2598Defines how to rewrite the Makefile.
1e44e2bf
PP
2599
2600=cut
2601
f1387719
PP
2602sub makefile {
2603 my($self) = shift;
2604 my @m;
2605 # We do not know what target was originally specified so we
2606 # must force a manual rerun to be sure. But as it should only
2607 # happen very rarely it is not a significant problem.
2608 push @m, '
2609$(OBJECT) : $(FIRST_MAKEFILE)
2610' if $self->{OBJECT};
1e44e2bf 2611
f1387719
PP
2612 push @m, q{
2613# We take a very conservative approach here, but it\'s worth it.
2614# We move Makefile to Makefile.old here to avoid gnu make looping.
2615}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2616 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2617 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
28e8609d 2618 -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
68dc0745
PP
2619 -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2620 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
4bfb3f62 2621 $(PERLRUN) Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
68dc0745
PP
2622 }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2623 }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <=="
2624 false
1e44e2bf 2625
f1387719
PP
2626# To change behavior to :: would be nice, but would break Tk b9.02
2627# so you find such a warning below the dist target.
2628#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2629# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
1e44e2bf
PP
2630};
2631
f1387719 2632 join "", @m;
1e44e2bf
PP
2633}
2634
f4ae0f5e 2635=item manifypods (o)
1e44e2bf 2636
f4ae0f5e
PP
2637Defines targets and routines to translate the pods into manpages and
2638put them into the INST_* directories.
1e44e2bf
PP
2639
2640=cut
2641
2642sub manifypods {
2643 my($self, %attribs) = @_;
f9c559d8
A
2644 return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2645 %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1e44e2bf
PP
2646 my($dist);
2647 my($pod2man_exe);
2648 if (defined $self->{PERL_SRC}) {
2649 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2650 } else {
f1387719 2651 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1e44e2bf 2652 }
cae6c631 2653 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
23614c1f
JH
2654 # Maybe a build by uninstalled Perl?
2655 $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
2656 }
2657 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
1e44e2bf
PP
2658 # No pod2man but some MAN3PODS to be installed
2659 print <<END;
2660
2661Warning: I could not locate your pod2man program. Please make sure,
2662 your pod2man program is in your PATH before you execute 'make'
2663
2664END
2665 $pod2man_exe = "-S pod2man";
2666 }
2667 my(@m);
2668 push @m,
2669qq[POD2MAN_EXE = $pod2man_exe\n],
2366100d
A
2670qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2671q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2672 $self->{MAKEFILE}, q[";' \\
1e44e2bf 2673-e 'print "Manifying $$m{$$_}\n";' \\
4bfb3f62 2674-e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2366100d 2675-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1e44e2bf 2676];
f9c559d8 2677 push @m, "\nmanifypods : pure_all ";
1e44e2bf 2678 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
f1387719
PP
2679
2680 push(@m,"\n");
2681 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2682 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2683 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
1e44e2bf 2684 }
f1387719 2685 join('', @m);
1e44e2bf
PP
2686}
2687
f1387719 2688=item maybe_command
1e44e2bf 2689
f1387719 2690Returns true, if the argument is likely to be a command.
1e44e2bf
PP
2691
2692=cut
2693
f1387719
PP
2694sub maybe_command {
2695 my($self,$file) = @_;
2696 return $file if -x $file && ! -d $file;
2697 return;
1e44e2bf
PP
2698}
2699
f1387719 2700=item maybe_command_in_dirs
1e44e2bf 2701
f1387719 2702method under development. Not yet used. Ask Ilya :-)
1e44e2bf
PP
2703
2704=cut
2705
f1387719
PP
2706sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2707# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2708 my($self, $names, $dirs, $trace, $ver) = @_;
2709 my($name, $dir);
2710 foreach $dir (@$dirs){
2711 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2712 foreach $name (@$names){
2713 my($abs,$tryabs);
2714 if ($self->file_name_is_absolute($name)) { # /foo/bar
2715 $abs = $name;
2716 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2717 $abs = $self->catfile($dir, $name);
2718 } else { # foo/bar
2719 $abs = $self->catfile($self->curdir, $name);
2720 }
2721 print "Checking $abs for $name\n" if ($trace >= 2);
2722 next unless $tryabs = $self->maybe_command($abs);
2723 print "Substituting $tryabs instead of $abs\n"
2724 if ($trace >= 2 and $tryabs ne $abs);
2725 $abs = $tryabs;
2726 if (defined $ver) {
2727 print "Executing $abs\n" if ($trace >= 2);
2728 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2729 print "Using PERL=$abs\n" if $trace;
2730 return $abs;
2731 }
2732 } else { # Do not look for perl
2733 return $abs;
2734 }
2735 }
1e44e2bf 2736 }
1e44e2bf
PP
2737}
2738
f1387719 2739=item needs_linking (o)
1e44e2bf 2740
f1387719
PP
2741Does this module need linking? Looks into subdirectory objects (see
2742also has_link_code())
1e44e2bf
PP
2743
2744=cut
2745
f1387719
PP
2746sub needs_linking {
2747 my($self) = shift;
2748 my($child,$caller);
2749 $caller = (caller(0))[3];
2750 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2751 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2752 if ($self->has_link_code or $self->{MAKEAPERL}){
2753 $self->{NEEDS_LINKING} = 1;
2754 return 1;
1e44e2bf 2755 }
f1387719
PP
2756 foreach $child (keys %{$self->{CHILDREN}}) {
2757 if ($self->{CHILDREN}->{$child}->needs_linking) {
2758 $self->{NEEDS_LINKING} = 1;
2759 return 1;
2760 }
1e44e2bf 2761 }
f1387719 2762 return $self->{NEEDS_LINKING} = 0;
1e44e2bf
PP
2763}
2764
f1387719 2765=item nicetext
1e44e2bf 2766
f1387719
PP
2767misnamed method (will have to be changed). The MM_Unix method just
2768returns the argument without further processing.
2769
2770On VMS used to insure that colons marking targets are preceded by
2771space - most Unix Makes don't need this, but it's necessary under VMS
2772to distinguish the target delimiter from a colon appearing as part of
2773a filespec.
1e44e2bf
PP
2774
2775=cut
2776
f1387719
PP
2777sub nicetext {
2778 my($self,$text) = @_;
2779 $text;
2780}
1e44e2bf 2781
f1387719 2782=item parse_version
1e44e2bf 2783
5a5fd53e
GS
2784parse a file and return what you think is $VERSION in this file set to.
2785It will return the string "undef" if it can't figure out what $VERSION
2786is.
1e44e2bf 2787
f1387719
PP
2788=cut
2789
2790sub parse_version {
2791 my($self,$parsefile) = @_;
2792 my $result;
2793 local *FH;
2794 local $/ = "\n";
2795 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2796 my $inpod = 0;
2797 while (<FH>) {
2798 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
f05db7a1 2799 next if $inpod || /^\s*#/;
f1387719 2800 chop;
84902520
TB
2801 # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2802 next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
dbc738d9
PP
2803 my $eval = qq{
2804 package ExtUtils::MakeMaker::_version;
a1f8e286 2805 no strict;
bab2b58e 2806
84902520
TB
2807 local $1$2;
2808 \$$2=undef; do {
bab2b58e 2809 $_
84902520 2810 }; \$$2
dbc738d9 2811 };
db376a24 2812 no warnings;
84902520 2813 $result = eval($eval);
5a5fd53e 2814 warn "Could not eval '$eval' in $parsefile: $@" if $@;
84902520 2815 $result = "undef" unless defined $result;
f1387719
PP
2816 last;
2817 }
2818 close FH;
2819 return $result;
1e44e2bf
PP
2820}
2821
8f993c78
MN
2822=item parse_abstract
2823
2824parse a file and return what you think is the ABSTRACT
2825
2826=cut
2827
2828sub parse_abstract {
2829 my($self,$parsefile) = @_;
2830 my $result;
2831 local *FH;
2832 local $/ = "\n";
2833 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2834 my $inpod = 0;
2835 my $package = $self->{DISTNAME};
cbadcae4 2836 $package =~ s/-/::/g;
8f993c78
MN
2837 while (<FH>) {
2838 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2839 next if !$inpod;
2840 chop;
2841 next unless /^($package\s-\s)(.*)/;
2842 $result = $2;
2843 last;
2844 }
2845 close FH;
2846 return $result;
2847}
1e44e2bf 2848
f1387719
PP
2849=item pasthru (o)
2850
2851Defines the string that is passed to recursive make calls in
2852subdirectories.
1e44e2bf
PP
2853
2854=cut
2855
f1387719 2856sub pasthru {
1e44e2bf 2857 my($self) = shift;
f1387719 2858 my(@m,$key);
1e44e2bf 2859
f1387719 2860 my(@pasthru);
bbce6d69
PP
2861 my($sep) = $Is_VMS ? ',' : '';
2862 $sep .= "\\\n\t";
1e44e2bf 2863
289e7e34 2864 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
f1387719
PP
2865 push @pasthru, "$key=\"\$($key)\"";
2866 }
f4ae0f5e 2867
289e7e34
JH
2868 foreach $key (qw(DEFINE INC)) {
2869 push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
2870 }
2871
bbce6d69 2872 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
f1387719
PP
2873 join "", @m;
2874}
1e44e2bf 2875
f1387719 2876=item path
f4ae0f5e 2877
f1387719 2878Takes no argument, returns the environment variable PATH as an array.
1e44e2bf 2879
f1387719
PP
2880=cut
2881
2882sub path {
2883 my($self) = @_;
39e571d4 2884 my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
f1387719
PP
2885 my $path = $ENV{PATH};
2886 $path =~ s:\\:/:g if $Is_OS2;
2887 my @path = split $path_sep, $path;
93f9cb4b
PP
2888 foreach(@path) { $_ = '.' if $_ eq '' }
2889 @path;
1e44e2bf
PP
2890}
2891
f1387719 2892=item perl_script
1e44e2bf 2893
f1387719
PP
2894Takes one argument, a file name, and returns the file name, if the
2895argument is likely to be a perl script. On MM_Unix this is true for
2896any ordinary, readable file.
1e44e2bf
PP
2897
2898=cut
2899
f1387719
PP
2900sub perl_script {
2901 my($self,$file) = @_;
2902 return $file if -r $file && -f _;
2903 return;
1e44e2bf
PP
2904}
2905
f1387719 2906=item perldepend (o)
1e44e2bf 2907
f1387719
PP
2908Defines the dependency from all *.h files that come with the perl
2909distribution.
1e44e2bf
PP
2910
2911=cut
2912
f1387719 2913sub perldepend {
1e44e2bf 2914 my($self) = shift;
f1387719
PP
2915 my(@m);
2916 push @m, q{
2917# Check for unpropogated config.sh changes. Should never happen.
2918# We do NOT just update config.h because that is not sufficient.
2919# An out of date config.h is not fatal but complains loudly!
2920$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2921 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2922
2923$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2924 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2925 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2926} if $self->{PERL_SRC};
2927
2928 return join "", @m unless $self->needs_linking;
2929
1e44e2bf 2930 push @m, q{
f1387719 2931PERL_HDRS = \
54fc9134
GS
2932 $(PERL_INC)/EXTERN.h \
2933 $(PERL_INC)/INTERN.h \
2934 $(PERL_INC)/XSUB.h \
2935 $(PERL_INC)/av.h \
2936 $(PERL_INC)/cc_runtime.h \
2937 $(PERL_INC)/config.h \
2938 $(PERL_INC)/cop.h \
2939 $(PERL_INC)/cv.h \
2940 $(PERL_INC)/dosish.h \
2941 $(PERL_INC)/embed.h \
2942 $(PERL_INC)/embedvar.h \
2943 $(PERL_INC)/fakethr.h \
2944 $(PERL_INC)/form.h \
2945 $(PERL_INC)/gv.h \
2946 $(PERL_INC)/handy.h \
2947 $(PERL_INC)/hv.h \
2948 $(PERL_INC)/intrpvar.h \
2949 $(PERL_INC)/iperlsys.h \
2950 $(PERL_INC)/keywords.h \
2951 $(PERL_INC)/mg.h \
2952 $(PERL_INC)/nostdio.h \
54fc9134
GS
2953 $(PERL_INC)/op.h \
2954 $(PERL_INC)/opcode.h \
2955 $(PERL_INC)/opnames.h \
2956 $(PERL_INC)/patchlevel.h \
2957 $(PERL_INC)/perl.h \
2958 $(PERL_INC)/perlapi.h \
2959 $(PERL_INC)/perlio.h \
2960 $(PERL_INC)/perlsdio.h \
2961 $(PERL_INC)/perlsfio.h \
2962 $(PERL_INC)/perlvars.h \
2963 $(PERL_INC)/perly.h \
2964 $(PERL_INC)/pp.h \
2965 $(PERL_INC)/pp_proto.h \
2966 $(PERL_INC)/proto.h \
2967 $(PERL_INC)/regcomp.h \
2968 $(PERL_INC)/regexp.h \
2969 $(PERL_INC)/regnodes.h \
2970 $(PERL_INC)/scope.h \
2971 $(PERL_INC)/sv.h \
2972 $(PERL_INC)/thrdvar.h \
2973 $(PERL_INC)/thread.h \
2974 $(PERL_INC)/unixish.h \
2975 $(PERL_INC)/utf8.h \
2976 $(PERL_INC)/util.h \
2977 $(PERL_INC)/warnings.h
f1387719
PP
2978
2979$(OBJECT) : $(PERL_HDRS)
2980} if $self->{OBJECT};
2981
2982 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
2983
2984 join "\n", @m;
1e44e2bf
PP
2985}
2986
8f993c78
MN
2987=item ppd
2988
2989Defines target that creates a PPD (Perl Package Description) file
2990for a binary distribution.
2991
2992=cut
2993
2994sub ppd {
2995 my($self) = @_;
2996 my(@m);
2997 if ($self->{ABSTRACT_FROM}){
2998 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2999 Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
3000 }
3001 my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
3002 push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
3003 push(@m, "ppd:\n");
3004 push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
3005 push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
3006 my $abstract = $self->{ABSTRACT};
3aa35033 3007 $abstract =~ s/\n/\\n/sg;
8f993c78
MN
3008 $abstract =~ s/</&lt;/g;
3009 $abstract =~ s/>/&gt;/g;
3010 push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
3011 my ($author) = $self->{AUTHOR};
3aa35033
GS
3012 $author =~ s/</&lt;/g;
3013 $author =~ s/>/&gt;/g;
8f993c78
MN
3014 $author =~ s/@/\\@/g;
3015 push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
3016 push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
3017 my ($prereq);
3018 foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
3019 my $pre_req = $prereq;
3020 $pre_req =~ s/::/-/g;
80252599
GS
3021 my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
3022 push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
8f993c78
MN
3023 }
3024 push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
80252599 3025 push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
8f993c78
MN
3026 my ($bin_location) = $self->{BINARY_LOCATION};
3027 $bin_location =~ s/\\/\\\\/g;
3028 if ($self->{PPM_INSTALL_SCRIPT}) {
3029 if ($self->{PPM_INSTALL_EXEC}) {
3030 push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3031 }
3032 else {
3033 push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3034 }
3035 }
3036 push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
3037 push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
3038 push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
3039
3040 join("", @m);
3041}
3042
2366100d
A
3043=item perm_rw (o)
3044
3045Returns the attribute C<PERM_RW> or the string C<644>.
3046Used as the string that is passed
3047to the C<chmod> command to set the permissions for read/writeable files.
32504223 3048MakeMaker chooses C<644> because it has turned out in the past that
de592821 3049relying on the umask provokes hard-to-track bug reports.
2366100d
A
3050When the return value is used by the perl function C<chmod>, it is
3051interpreted as an octal value.
3052
3053=cut
3054
3055sub perm_rw {
32504223 3056 shift->{PERM_RW} || "644";
2366100d
A
3057}
3058
3059=item perm_rwx (o)
3060
32504223 3061Returns the attribute C<PERM_RWX> or the string C<755>,
2366100d
A
3062i.e. the string that is passed
3063to the C<chmod> command to set the permissions for executable files.
3064See also perl_rw.
3065
3066=cut
3067
3068sub perm_rwx {
32504223 3069 shift->{PERM_RWX} || "755";
2366100d
A
3070}
3071
f1387719 3072=item pm_to_blib
1e44e2bf 3073
f1387719 3074Defines target that copies all files in the hash PM to their
55497cff 3075destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
1e44e2bf
PP
3076
3077=cut
3078
158e3910
JH
3079sub _pm_to_blib_flush {
3080 my ($self, $autodir, $rr, $ra, $rl) = @_;
3081 $$rr .=
3082q{ }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \
3083 -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')"
3084};
3085 @$ra = ();
3086 $$rl = 0;
3087}
3088
f1387719
PP
3089sub pm_to_blib {
3090 my $self = shift;
3091 my($autodir) = $self->catdir('$(INST_LIB)','auto');
d2fa5cc0 3092 my $r = q{
f1387719 3093pm_to_blib: $(TO_INST_PM)
1e44e2bf 3094};
d2fa5cc0
JH
3095 my %pm_to_blib = %{$self->{PM}};
3096 my @a;
3097 my $l;
d2fa5cc0
JH
3098 while (my ($pm, $blib) = each %pm_to_blib) {
3099 my $la = length $pm;
3100 my $lb = length $blib;
158e3910
JH
3101 if ($l + $la + $lb + @a / 2 > 200) { # limit line length
3102 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0
JH
3103 }
3104 push @a, $pm, $blib;
3105 $l += $la + $lb;
3106 }
158e3910 3107 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0 3108 return $r.q{ }.$self->{NOECHO}.q{$(TOUCH) $@};
1e44e2bf
PP
3109}
3110
f1387719 3111=item post_constants (o)
1e44e2bf 3112
f1387719
PP
3113Returns an empty string per default. Dedicated to overrides from
3114within Makefile.PL after all constants have been defined.
1e44e2bf
PP
3115
3116=cut
3117
f1387719
PP
3118sub post_constants{
3119 my($self) = shift;
3120 "";
3121}
1e44e2bf 3122
f1387719 3123=item post_initialize (o)
1e44e2bf 3124
1fef88e7 3125Returns an empty string per default. Used in Makefile.PLs to add some
f1387719 3126chunk of text to the Makefile after the object is initialized.
1e44e2bf 3127
f1387719 3128=cut
1e44e2bf 3129
f1387719
PP
3130sub post_initialize {
3131 my($self) = shift;
3132 "";
3133}
1e44e2bf 3134
f1387719 3135=item postamble (o)
1e44e2bf 3136
f1387719
PP
3137Returns an empty string. Can be used in Makefile.PLs to write some
3138text to the Makefile at the end.
1e44e2bf 3139
f1387719 3140=cut
1e44e2bf 3141
f1387719
PP
3142sub postamble {
3143 my($self) = shift;
3144 "";
3145}
1e44e2bf 3146
f1387719 3147=item prefixify
1e44e2bf 3148
f1387719
PP
3149Check a path variable in $self from %Config, if it contains a prefix,
3150and replace it with another one.
1e44e2bf 3151
f1387719
PP
3152Takes as arguments an attribute name, a search prefix and a
3153replacement prefix. Changes the attribute in the object.
1e44e2bf 3154
f1387719 3155=cut
1e44e2bf 3156
f1387719
PP
3157sub prefixify {
3158 my($self,$var,$sprefix,$rprefix) = @_;
3159 $self->{uc $var} ||= $Config{lc $var};
3160 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
a3a27754 3161 $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s;
f1387719 3162}
1e44e2bf 3163
f1387719 3164=item processPL (o)
1e44e2bf 3165
f1387719 3166Defines targets to run *.PL files.
1e44e2bf 3167
f1387719 3168=cut
1e44e2bf 3169
f1387719
PP
3170sub processPL {
3171 my($self) = shift;
3172 return "" unless $self->{PL_FILES};
3173 my(@m, $plfile);
3174 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3aa35033
GS
3175 my $list = ref($self->{PL_FILES}->{$plfile})
3176 ? $self->{PL_FILES}->{$plfile}
3177 : [$self->{PL_FILES}->{$plfile}];
4194d490 3178 my $target;
3aa35033 3179 foreach $target (@$list) {
f1387719 3180 push @m, "
3aa35033 3181all :: $target
2d6e8844 3182 $self->{NOECHO}\$(NOOP)
1e44e2bf 3183
3aa35033 3184$target :: $plfile
4bfb3f62 3185 \$(PERLRUNINST) $plfile $target
f1387719 3186";
3aa35033 3187 }
f1387719
PP
3188 }
3189 join "", @m;
1e44e2bf
PP
3190}
3191
fa048ccd
JH
3192=item quote_paren
3193
3194Backslashes parentheses C<()> in command line arguments.
3195Doesn't handle recursive Makefile C<$(...)> constructs,
3196but handles simple ones.
3197
3198=cut
3199
3200sub quote_paren {
3201 local $_ = shift;
3202 s/\$\((.+?)\)/\$\\\\($1\\\\)/g; # protect $(...)
3203 s/(?<!\\)([()])/\\$1/g; # quote unprotected
3204 s/\$\\\\\((.+?)\\\\\)/\$($1)/g; # unprotect $(...)
3205 return $_;
3206}
3207
f1387719 3208=item realclean (o)
1e44e2bf 3209
f1387719 3210Defines the realclean target.
1e44e2bf
PP
3211
3212=cut
3213
f1387719
PP
3214sub realclean {
3215 my($self, %attribs) = @_;
3216 my(@m);
2719e44e
JH
3217
3218 # Set LLIBPERL to nothing on static perl platforms, and to the flags
3219 # needed to link against the shared libperl library on shared perl
3220 # platforms. We peek at lddlflags to see if we need -Wl,-R or -R
3221 # to add paths to the run-time library search path.
3222 #
3223 my($llibperl) = '';
3224 if ($Config{'useshrplib'}) {
3225 if ($Config{'lddlflags'} =~ /-Wl,-R/) {
3226 $llibperl = '-L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl';
3227 } elsif ($Config{'lddlflags'} =~ /-R/) {
3228 $llibperl = '-L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl';
3229 }
3230 }
3231 push(@m,'LLIBPERL = '.$llibperl."\n");
3232
f1387719
PP
3233 push(@m,'
3234# Delete temporary files (via clean) and also delete installed files
3235realclean purge :: clean
3236');
3237 # realclean subdirectories first (already cleaned)
882a4479
GS
3238 my $sub = ($Is_Win32 && Win32::IsWin95()) ?
3239 "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
3240 "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
f1387719
PP
3241 foreach(@{$self->{DIR}}){
3242 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
3243 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
1e44e2bf 3244 }
f1387719
PP
3245 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
3246 if( $self->has_link_code ){
3247 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
3248 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
3249 }
8dd5ab3a
AD
3250 # Issue a several little RM_F commands rather than risk creating a
3251 # very long command line (useful for extensions such as Encode
3252 # that have many files).
3253 if (keys %{$self->{PM}}) {
3254 my $line = "";
3255 foreach (values %{$self->{PM}}) {
3256 if (length($line) + length($_) > 80) {
3257 push @m, "\t$self->{RM_F} $line\n";
3258 $line = $_;
3259 }
3260 else {
3261 $line .= " $_";
3262 }
3263 }
3264 push @m, "\t$self->{RM_F} $line\n" if $line;
3265 }
f1387719
PP
3266 my(@otherfiles) = ($self->{MAKEFILE},
3267 "$self->{MAKEFILE}.old"); # Makefiles last
3268 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
3269 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
3270 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
3271 join("", @m);
1e44e2bf
PP
3272}
3273
f1387719 3274=item replace_manpage_separator
1e44e2bf 3275
f1387719
PP
3276Takes the name of a package, which may be a nested package, in the
3277form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
1e44e2bf
PP
3278
3279=cut
3280
f1387719
PP
3281sub replace_manpage_separator {
3282 my($self,$man) = @_;
2ebcf328 3283 if ($^O eq 'uwin') {
ed2b665b
PFI
3284 $man =~ s,/+,.,g;
3285 } elsif ($Is_Dos) {
3286 $man =~ s,/+,__,g;
2ebcf328 3287 } else {
ed2b665b 3288 $man =~ s,/+,::,g;
2ebcf328 3289 }
f1387719
PP
3290 $man;
3291}
1e44e2bf 3292
f1387719 3293=item static (o)
1e44e2bf 3294
f1387719 3295Defines the static target.
1e44e2bf 3296
f1387719 3297=cut
1e44e2bf 3298
f1387719
PP
3299sub static {
3300# --- Static Loading Sections ---
1e44e2bf 3301
f1387719
PP
3302 my($self) = shift;
3303 '
3304## $(INST_PM) has been moved to the all: target.
3305## It remains here for awhile to allow for old usage: "make static"
3306#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
3307static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
3308 '.$self->{NOECHO}.'$(NOOP)
3309';
1e44e2bf
PP
3310}
3311
f1387719 3312=item static_lib (o)
1e44e2bf 3313
f1387719 3314Defines how to produce the *.a (or equivalent) files.
1e44e2bf
PP
3315
3316=cut
3317
f1387719
PP
3318sub static_lib {
3319 my($self) = @_;
3320# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
3321# return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 3322
f1387719
PP
3323 return '' unless $self->has_link_code;
3324
3325 my(@m);
3326 push(@m, <<'END');
3327$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
760ac839 3328 $(RM_RF) $@
f1387719 3329END
022735b4 3330 # If this extension has its own library (eg SDBM_File)
f1387719
PP
3331 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3332 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
f4ae0f5e 3333
9f7ff21b
JH
3334 my $ar;
3335 if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
3336 # Prefer the absolute pathed ar if available so that PATH
3337 # doesn't confuse us. Perl itself is built with the full_ar.
3338 $ar = 'FULL_AR';
3339 } else {
3340 $ar = 'AR';
3341 }
f1387719 3342 push @m,
9f7ff21b
JH
3343 "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
3344 push @m,
3345q{ $(CHMOD) $(PERM_RWX) $@
0328fe61 3346 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
f4ae0f5e 3347};
0328fe61
CS
3348 # Old mechanism - still available:
3349 push @m,
3350"\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3351} if $self->{PERL_SRC} && $self->{EXTRALIBS};
3352 push @m, "\n";
f1387719
PP
3353
3354 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3355 join('', "\n",@m);
1e44e2bf
PP
3356}
3357
f4ae0f5e 3358=item staticmake (o)
1e44e2bf 3359
f4ae0f5e 3360Calls makeaperl.
1e44e2bf
PP
3361
3362=cut
3363
3364sub staticmake {
3365 my($self, %attribs) = @_;
1e44e2bf
PP
3366 my(@static);
3367
3368 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
3369
3370 # And as it's not yet built, we add the current extension
3371 # but only if it has some C code (or XS code, which implies C code)
3372 if (@{$self->{C}}) {
f4ae0f5e
PP
3373 @static = $self->catfile($self->{INST_ARCHLIB},
3374 "auto",