This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
miniperl found before perl
[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
a84e0cef
JH
1091 # For example in AIX the shared objects/libraries from previous builds
1092 # linger quite a while in the shared dynalinker cache even when nobody
1093 # is using them. This is painful if one for instance tries to restart
1094 # a failed build because the link command will fail unnecessarily 'cos
1095 # the shared object/library is 'busy'.
1096 push(@m,' $(RM_F) $@
1097');
1098
ea5fc951
JH
1099 my $libs = $self->{LDLOADLIBS};
1100
1101 if ($^O eq 'netbsd') {
1102 # Use nothing on static perl platforms, and to the flags needed
1103 # to link against the shared libperl library on shared perl
1104 # platforms. We peek at lddlflags to see if we need -Wl,-R
1105 # or -R to add paths to the run-time library search path.
1106 if ($Config{'useshrplib'}) {
1107 if ($Config{'lddlflags'} =~ /-Wl,-R/) {
1108 $libs = '-L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -lperl';
1109 } elsif ($Config{'lddlflags'} =~ /-R/) {
1110 $libs = '-L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -lperl';
1111 }
1112 }
1113 }
1114
2719e44e
JH
1115 push(@m,
1116' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
1117' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) '.$libs.' $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
f1387719 1118 push @m, '
2366100d 1119 $(CHMOD) $(PERM_RWX) $@
f1387719 1120';
1e44e2bf 1121
f1387719 1122 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1e44e2bf
PP
1123 join('',@m);
1124}
1125
f1387719 1126=item exescan
1e44e2bf 1127
f1387719 1128Deprecated method. Use libscan instead.
1e44e2bf
PP
1129
1130=cut
1131
f1387719
PP
1132sub exescan {
1133 my($self,$path) = @_;
1134 $path;
1e44e2bf
PP
1135}
1136
f1387719 1137=item extliblist
1e44e2bf 1138
f1387719
PP
1139Called by init_others, and calls ext ExtUtils::Liblist. See
1140L<ExtUtils::Liblist> for details.
1e44e2bf
PP
1141
1142=cut
1143
f1387719
PP
1144sub extliblist {
1145 my($self,$libs) = @_;
1146 require ExtUtils::Liblist;
1147 $self->ext($libs, $Verbose);
1148}
f4ae0f5e 1149
f1387719 1150=item file_name_is_absolute
f4ae0f5e 1151
1fef88e7 1152Takes as argument a path and returns true, if it is an absolute path.
1e44e2bf 1153
f1387719 1154=cut
1e44e2bf 1155
f1387719
PP
1156sub file_name_is_absolute {
1157 my($self,$file) = @_;
39e571d4 1158 if ($Is_Dos){
4f44ac69 1159 $file =~ m{^([a-z]:)?[\\/]}is ;
39e571d4
ML
1160 }
1161 else {
4f44ac69 1162 $file =~ m:^/:s ;
39e571d4 1163 }
f1387719 1164}
1e44e2bf 1165
f1387719 1166=item find_perl
1e44e2bf 1167
f1387719 1168Finds the executables PERL and FULLPERL
1e44e2bf 1169
f1387719 1170=cut
1e44e2bf 1171
f1387719
PP
1172sub find_perl {
1173 my($self, $ver, $names, $dirs, $trace) = @_;
1174 my($name, $dir);
1175 if ($trace >= 2){
1176 print "Looking for perl $ver by these names:
1177@$names
1178in these dirs:
1179@$dirs
1180";
1181 }
ec751b0b
DB
1182 foreach $name (@$names){
1183 foreach $dir (@$dirs){
1184 next unless defined $dir; # $self->{PERL_SRC} may be undefined
a1f8e286 1185 my ($abs, $val);
f1387719
PP
1186 if ($self->file_name_is_absolute($name)) { # /foo/bar
1187 $abs = $name;
1188 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1189 $abs = $self->catfile($dir, $name);
1190 } else { # foo/bar
1191 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1192 }
1193 print "Checking $abs\n" if ($trace >= 2);
1194 next unless $self->maybe_command($abs);
1195 print "Executing $abs\n" if ($trace >= 2);
a1f8e286
IZ
1196 $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1197 if ($val =~ /VER_OK/) {
f1387719
PP
1198 print "Using PERL=$abs\n" if $trace;
1199 return $abs;
a1f8e286
IZ
1200 } elsif ($trace >= 2) {
1201 print "Result: `$val'\n";
1e44e2bf
PP
1202 }
1203 }
1e44e2bf 1204 }
f1387719
PP
1205 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1206 0; # false and not empty
1207}
1e44e2bf 1208
bab2b58e
AK
1209=back
1210
f1387719 1211=head2 Methods to actually produce chunks of text for the Makefile
1e44e2bf 1212
bab2b58e
AK
1213The methods here are called for each MakeMaker object in the order
1214specified by @ExtUtils::MakeMaker::MM_Sections.
1215
1216=over 2
f4ae0f5e 1217
84902520
TB
1218=item fixin
1219
1220Inserts the sharpbang or equivalent magic number to a script
1221
1222=cut
1223
1224sub fixin { # stolen from the pink Camel book, more or less
1225 my($self,@files) = @_;
1226 my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/;
1227 my($file,$interpreter);
1228 for $file (@files) {
1229 local(*FIXIN);
1230 local(*FIXOUT);
1231 open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
1232 local $/ = "\n";
1233 chomp(my $line = <FIXIN>);
1234 next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
1235 # Now figure out the interpreter name.
1236 my($cmd,$arg) = split ' ', $line, 2;
1237 $cmd =~ s!^.*/!!;
1238
1239 # Now look (in reverse) for interpreter in absolute PATH (unless perl).
1240 if ($cmd eq "perl") {
fb73857a
PP
1241 if ($Config{startperl} =~ m,^\#!.*/perl,) {
1242 $interpreter = $Config{startperl};
1243 $interpreter =~ s,^\#!,,;
1244 } else {
1245 $interpreter = $Config{perlpath};
1246 }
84902520
TB
1247 } else {
1248 my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
1249 $interpreter = '';
1250 my($dir);
1251 foreach $dir (@absdirs) {
1252 if ($self->maybe_command($cmd)) {
1253 warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
1254 $interpreter = $self->catfile($dir,$cmd);
1255 }
1256 }
1257 }
1258 # Figure out how to invoke interpreter on this machine.
1259
1260 my($shb) = "";
1261 if ($interpreter) {
1262 print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
f5cd9d9c 1263 # this is probably value-free on DOSISH platforms
84902520
TB
1264 if ($does_shbang) {
1265 $shb .= "$Config{'sharpbang'}$interpreter";
1266 $shb .= ' ' . $arg if defined $arg;
1267 $shb .= "\n";
1268 }
1269 $shb .= qq{
1270eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
90248788 1271 if 0; # not running under some shell
f5cd9d9c 1272} unless $Is_Win32; # this won't work on win32, so don't
84902520
TB
1273 } else {
1274 warn "Can't find $cmd in PATH, $file unchanged"
1275 if $Verbose;
1276 next;
1277 }
1278
f5cd9d9c 1279 unless ( open(FIXOUT,">$file.new") ) {
84902520
TB
1280 warn "Can't create new $file: $!\n";
1281 next;
1282 }
1283 my($dev,$ino,$mode) = stat FIXIN;
84902520
TB
1284
1285 # Print out the new #! line (or equivalent).
1286 local $\;
1287 undef $/;
1288 print FIXOUT $shb, <FIXIN>;
1289 close FIXIN;
1290 close FIXOUT;
985777a9
GS
1291
1292 # can't rename/chmod open files on some DOSISH platforms
1293
1294 # If they override perm_rwx, we won't notice it during fixin,
1295 # because fixin is run through a new instance of MakeMaker.
1296 # That is why we must run another CHMOD later.
1297 $mode = oct($self->perm_rwx) unless $dev;
1298 chmod $mode, $file;
1299
f5cd9d9c
GS
1300 unless ( rename($file, "$file.bak") ) {
1301 warn "Can't rename $file to $file.bak: $!";
1302 next;
1303 }
1304 unless ( rename("$file.new", $file) ) {
1305 warn "Can't rename $file.new to $file: $!";
1306 unless ( rename("$file.bak", $file) ) {
1307 warn "Can't rename $file.bak back to $file either: $!";
1308 warn "Leaving $file renamed as $file.bak\n";
1309 }
1310 next;
1311 }
84902520
TB
1312 unlink "$file.bak";
1313 } continue {
985777a9 1314 close(FIXIN) if fileno(FIXIN);
2366100d
A
1315 chmod oct($self->perm_rwx), $file or
1316 die "Can't reset permissions for $file: $!\n";
84902520
TB
1317 system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
1318 }
1319}
1320
f1387719
PP
1321=item force (o)
1322
1323Just writes FORCE:
1324
1325=cut
1e44e2bf 1326
f1387719
PP
1327sub force {
1328 my($self) = shift;
1329 '# Phony target to force checking subdirectories.
1330FORCE:
3e3baf6d 1331 '.$self->{NOECHO}.'$(NOOP)
f1387719 1332';
1e44e2bf
PP
1333}
1334
f1387719 1335=item guess_name
1e44e2bf 1336
f1387719
PP
1337Guess the name of this package by examining the working directory's
1338name. MakeMaker calls this only if the developer has not supplied a
1339NAME attribute.
1e44e2bf 1340
f1387719 1341=cut
f4ae0f5e 1342
f1387719
PP
1343# ';
1344
1345sub guess_name {
1346 my($self) = @_;
1347 use Cwd 'cwd';
1348 my $name = basename(cwd());
4f44ac69 1349 $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
f1387719
PP
1350 # strip minus or underline
1351 # followed by a float or some such
1352 print "Warning: Guessing NAME [$name] from current directory name.\n";
1353 $name;
1354}
1355
1356=item has_link_code
1357
1358Returns true if C, XS, MYEXTLIB or similar objects exist within this
1359object that need a compiler. Does not descend into subdirectories as
1360needs_linking() does.
f4ae0f5e
PP
1361
1362=cut
1363
f1387719
PP
1364sub has_link_code {
1365 my($self) = shift;
1366 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1367 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1368 $self->{HAS_LINK_CODE} = 1;
1369 return 1;
f4ae0f5e 1370 }
f1387719 1371 return $self->{HAS_LINK_CODE} = 0;
f4ae0f5e
PP
1372}
1373
cae6c631
JD
1374=item htmlifypods (o)
1375
1376Defines targets and routines to translate the pods into HTML manpages
1377and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
1378directories.
1379
1380=cut
1381
1382sub htmlifypods {
1383 my($self, %attribs) = @_;
1384 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
1385 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
1386 my($dist);
1387 my($pod2html_exe);
1388 if (defined $self->{PERL_SRC}) {
1389 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
1390 } else {
1391 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
1392 }
1393 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
1394 # No pod2html but some HTMLxxxPODS to be installed
1395 print <<END;
1396
1397Warning: I could not locate your pod2html program. Please make sure,
1398 your pod2html program is in your PATH before you execute 'make'
1399
1400END
1401 $pod2html_exe = "-S pod2html";
1402 }
1403 my(@m);
1404 push @m,
1405qq[POD2HTML_EXE = $pod2html_exe\n],
1406qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
1407q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
1408 $self->{MAKEFILE}, q[";' \\
1409-e 'print "Htmlifying $$m{$$_}\n";' \\
1410-e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
4bfb3f62 1411-e 'system(q[$(PERLRUN) $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
cae6c631
JD
1412-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1413];
1414 push @m, "\nhtmlifypods : pure_all ";
1415 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
1416
1417 push(@m,"\n");
1418 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
1419 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
1420 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
1421 }
1422 join('', @m);
1423}
1424
f1387719 1425=item init_dirscan
f4ae0f5e 1426
cae6c631 1427Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
f1387719
PP
1428
1429=cut
1430
1431sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
1432 my($self) = @_;
1433 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1434 local(%pm); #the sub in find() has to see this hash
6ee623d5 1435 @ignore{qw(Makefile.PL test.pl)} = (1,1);
f1387719
PP
1436 $ignore{'makefile.pl'} = 1 if $Is_VMS;
1437 foreach $name ($self->lsdir($self->curdir)){
4ecf31dc 1438 next if $name =~ /\#/;
f1387719
PP
1439 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1440 next unless $self->libscan($name);
1441 if (-d $name){
760ac839 1442 next if -l $name; # We do not support symlinks at all
f1387719 1443 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
4f44ac69
GS
1444 } elsif ($name =~ /\.xs\z/){
1445 my($c); ($c = $name) =~ s/\.xs\z/.c/;
f1387719
PP
1446 $xs{$name} = $c;
1447 $c{$c} = 1;
4f44ac69 1448 } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
f1387719
PP
1449 $c{$name} = 1
1450 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
4f44ac69 1451 } elsif ($name =~ /\.h\z/i){
f1387719 1452 $h{$name} = 1;
4f44ac69
GS
1453 } elsif ($name =~ /\.PL\z/) {
1454 ($pl_files{$name} = $name) =~ s/\.PL\z// ;
933fea7f 1455 } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
918c0b2d 1456 # case-insensitive filesystem, one dot per name, so foo.h.PL
933fea7f 1457 # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
6ee623d5
GS
1458 local($/); open(PL,$name); my $txt = <PL>; close PL;
1459 if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
4f44ac69 1460 ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
6ee623d5
GS
1461 }
1462 else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
4f44ac69 1463 } elsif ($name =~ /\.(p[ml]|pod)\z/){
f1387719 1464 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
f1387719
PP
1465 }
1466 }
f4ae0f5e 1467
f1387719
PP
1468 # Some larger extensions often wish to install a number of *.pm/pl
1469 # files into the library in various locations.
f4ae0f5e 1470
f1387719
PP
1471 # The attribute PMLIBDIRS holds an array reference which lists
1472 # subdirectories which we should search for library files to
1473 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1474 # recursively search through the named directories (skipping any
1475 # which don't exist or contain Makefile.PL files).
f4ae0f5e 1476
f1387719
PP
1477 # For each *.pm or *.pl file found $self->libscan() is called with
1478 # the default installation path in $_[1]. The return value of
1479 # libscan defines the actual installation location. The default
1480 # libscan function simply returns the path. The file is skipped
1481 # if libscan returns false.
f4ae0f5e 1482
f1387719
PP
1483 # The default installation location passed to libscan in $_[1] is:
1484 #
1485 # ./*.pm => $(INST_LIBDIR)/*.pm
1486 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1487 # ./lib/... => $(INST_LIB)/...
1488 #
1489 # In this way the 'lib' directory is seen as the root of the actual
1490 # perl library whereas the others are relative to INST_LIBDIR
1491 # (which includes PARENT_NAME). This is a subtle distinction but one
1492 # that's important for nested modules.
1e44e2bf 1493
f1387719
PP
1494 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1495 unless $self->{PMLIBDIRS};
1e44e2bf 1496
f1387719 1497 #only existing directories that aren't in $dir are allowed
1e44e2bf 1498
f1387719
PP
1499 # Avoid $_ wherever possible:
1500 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1501 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1502 my ($pmlibdir);
1503 @{$self->{PMLIBDIRS}} = ();
1504 foreach $pmlibdir (@pmlibdirs) {
1505 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1e44e2bf 1506 }
1e44e2bf 1507
f1387719
PP
1508 if (@{$self->{PMLIBDIRS}}){
1509 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1510 if ($Verbose >= 2);
1511 require File::Find;
1512 File::Find::find(sub {
1513 if (-d $_){
1514 if ($_ eq "CVS" || $_ eq "RCS"){
1515 $File::Find::prune = 1;
1516 }
1517 return;
1518 }
4ecf31dc 1519 return if /\#/;
f1387719
PP
1520 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1521 my($striplibpath,$striplibname);
93f9cb4b 1522 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
f1387719
PP
1523 ($striplibname,$striplibpath) = fileparse($striplibpath);
1524 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1525 local($_) = $inst; # for backwards compatibility
1526 $inst = $self->libscan($inst);
1527 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1528 return unless $inst;
1529 $pm{$path} = $inst;
1530 }, @{$self->{PMLIBDIRS}});
1531 }
1e44e2bf 1532
f1387719
PP
1533 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1534 $self->{XS} = \%xs unless $self->{XS};
1535 $self->{PM} = \%pm unless $self->{PM};
1536 $self->{C} = [sort keys %c] unless $self->{C};
1537 my(@o_files) = @{$self->{C}};
4f44ac69 1538 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
f1387719
PP
1539 $self->{H} = [sort keys %h] unless $self->{H};
1540 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1e44e2bf 1541
f1387719 1542 # Set up names of manual pages to generate from pods
cae6c631
JD
1543 my %pods;
1544 foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
1545 unless ($self->{"${man}PODS"}) {
1546 $self->{"${man}PODS"} = {};
1547 $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
1548 }
1549 }
1550
1551 if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
f1387719
PP
1552 if ( exists $self->{EXE_FILES} ) {
1553 foreach $name (@{$self->{EXE_FILES}}) {
f1387719
PP
1554 local *FH;
1555 my($ispod)=0;
f1387719 1556 if (open(FH,"<$name")) {
f1387719
PP
1557 while (<FH>) {
1558 if (/^=head1\s+\w+/) {
1559 $ispod=1;
1560 last;
1561 }
1562 }
f1387719
PP
1563 close FH;
1564 } else {
1565 # If it doesn't exist yet, we assume, it has pods in it
1566 $ispod = 1;
1e44e2bf 1567 }
cae6c631
JD
1568 next unless $ispod;
1569 if ($pods{HTMLSCRIPT}) {
1570 $self->{HTMLSCRIPTPODS}->{$name} =
1571 $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
1572 }
1573 if ($pods{MAN1}) {
1574 $self->{MAN1PODS}->{$name} =
1575 $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
1e44e2bf 1576 }
f1387719 1577 }
1e44e2bf
PP
1578 }
1579 }
cae6c631 1580 if ($pods{MAN3} || $pods{HTMLLIB}) {
f1387719
PP
1581 my %manifypods = (); # we collect the keys first, i.e. the files
1582 # we have to convert to pod
1583 foreach $name (keys %{$self->{PM}}) {
4f44ac69 1584 if ($name =~ /\.pod\z/ ) {
f1387719 1585 $manifypods{$name} = $self->{PM}{$name};
4f44ac69 1586 } elsif ($name =~ /\.p[ml]\z/ ) {
f1387719
PP
1587 local *FH;
1588 my($ispod)=0;
f1387719 1589 if (open(FH,"<$name")) {
f1387719
PP
1590 while (<FH>) {
1591 if (/^=head1\s+\w+/) {
1592 $ispod=1;
1593 last;
1594 }
1595 }
f1387719
PP
1596 close FH;
1597 } else {
1598 $ispod = 1;
1599 }
1600 if( $ispod ) {
1601 $manifypods{$name} = $self->{PM}{$name};
1602 }
1603 }
1604 }
1605
1606 # Remove "Configure.pm" and similar, if it's not the only pod listed
1607 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1608 foreach $name (keys %manifypods) {
40b90ac3 1609 if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
f1387719
PP
1610 delete $manifypods{$name};
1611 next;
1612 }
1613 my($manpagename) = $name;
4f44ac69 1614 $manpagename =~ s/\.p(od|m|l)\z//;
cae6c631
JD
1615 if ($pods{HTMLLIB}) {
1616 $self->{HTMLLIBPODS}->{$name} =
1617 $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
1618 }
4f44ac69 1619 unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
f1387719
PP
1620 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1621 }
cae6c631
JD
1622 if ($pods{MAN3}) {
1623 $manpagename = $self->replace_manpage_separator($manpagename);
1624 $self->{MAN3PODS}->{$name} =
1625 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
1626 }
1e44e2bf
PP
1627 }
1628 }
f1387719 1629}
1e44e2bf 1630
f1387719 1631=item init_main
1e44e2bf 1632
f1387719
PP
1633Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1634PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
8cc95fdb 1635PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
f1387719 1636LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
f4ae0f5e 1637
f1387719 1638=cut
1e44e2bf 1639
f1387719
PP
1640sub init_main {
1641 my($self) = @_;
1e44e2bf 1642
f1387719 1643 # --- Initialize Module Name and Paths
1e44e2bf 1644
f1387719
PP
1645 # NAME = Foo::Bar::Oracle
1646 # FULLEXT = Foo/Bar/Oracle
1647 # BASEEXT = Oracle
1648 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1649 # PARENT_NAME = Foo::Bar
1650### Only UNIX:
1651### ($self->{FULLEXT} =
1652### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1653 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1e44e2bf 1654
1e44e2bf 1655
f1387719 1656 # Copied from DynaLoader:
1e44e2bf 1657
f1387719
PP
1658 my(@modparts) = split(/::/,$self->{NAME});
1659 my($modfname) = $modparts[-1];
1e44e2bf 1660
f1387719
PP
1661 # Some systems have restrictions on files names for DLL's etc.
1662 # mod2fname returns appropriate file base name (typically truncated)
1663 # It may also edit @modparts if required.
1664 if (defined &DynaLoader::mod2fname) {
1665 $modfname = &DynaLoader::mod2fname(\@modparts);
bab2b58e 1666 }
1e44e2bf 1667
4f44ac69 1668 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
f1387719 1669
760ac839 1670 if (defined &DynaLoader::mod2fname) {
f1387719
PP
1671 # As of 5.001m, dl_os2 appends '_'
1672 $self->{DLBASE} = $modfname;
1673 } else {
1674 $self->{DLBASE} = '$(BASEEXT)';
1675 }
1676
1e44e2bf 1677
f1387719
PP
1678 ### ROOTEXT deprecated from MM 5.32
1679### ($self->{ROOTEXT} =
1680### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1681### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1e44e2bf 1682
1e44e2bf 1683
f1387719 1684 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1e44e2bf 1685
f1387719
PP
1686 # *Real* information: where did we get these two from? ...
1687 my $inc_config_dir = dirname($INC{'Config.pm'});
1688 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1e44e2bf 1689
f1387719
PP
1690 unless ($self->{PERL_SRC}){
1691 my($dir);
dfc18e8a 1692 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
1693 if (
1694 -f $self->catfile($dir,"config.sh")
1695 &&
1696 -f $self->catfile($dir,"perl.h")
1697 &&
1698 -f $self->catfile($dir,"lib","Exporter.pm")
1699 ) {
1700 $self->{PERL_SRC}=$dir ;
1701 last;
1702 }
1703 }
1704 }
1705 if ($self->{PERL_SRC}){
1706 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1707 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
137443ea 1708 $self->{PERL_INC} = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
1e44e2bf 1709
137443ea 1710 # catch a situation that has occurred a few times in the past:
bab2b58e
AK
1711 unless (
1712 -s $self->catfile($self->{PERL_SRC},'cflags')
1713 or
1714 $Is_VMS
1715 &&
1716 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1717 or
1718 $Is_Mac
137443ea
PP
1719 or
1720 $Is_Win32
bab2b58e
AK
1721 ){
1722 warn qq{
f1387719
PP
1723You cannot build extensions below the perl source tree after executing
1724a 'make clean' in the perl source tree.
1e44e2bf 1725
f1387719
PP
1726To rebuild extensions distributed with the perl source you should
1727simply Configure (to include those extensions) and then build perl as
1728normal. After installing perl the source tree can be deleted. It is
1729not needed for building extensions by running 'perl Makefile.PL'
1730usually without extra arguments.
1e44e2bf 1731
f1387719
PP
1732It is recommended that you unpack and build additional extensions away
1733from the perl source tree.
bab2b58e
AK
1734};
1735 }
f1387719
PP
1736 } else {
1737 # we should also consider $ENV{PERL5LIB} here
23614c1f 1738 my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
f1387719
PP
1739 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1740 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1741 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1742 my $perl_h;
23614c1f 1743
0a022e8e 1744 no warnings 'uninitialized' ;
23614c1f
JH
1745 if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
1746 and not $old){
1747 # Maybe somebody tries to build an extension with an
1748 # uninstalled Perl outside of Perl build tree
1749 my $found;
1750 for my $dir (@INC) {
1751 $found = $dir, last if -e $self->catdir($dir, "Config.pm");
1752 }
1753 if ($found) {
1754 my $inc = dirname $found;
1755 if (-e $self->catdir($inc, "perl.h")) {
1756 $self->{PERL_LIB} = $found;
1757 $self->{PERL_ARCHLIB} = $found;
1758 $self->{PERL_INC} = $inc;
1759 $self->{UNINSTALLED_PERL} = 1;
1760 print STDOUT <<EOP;
1761... Detected uninstalled Perl. Trying to continue.
1762EOP
1763 }
1764 }
1765 }
1766
bab2b58e
AK
1767 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1768 die qq{
f1387719 1769Error: Unable to locate installed Perl libraries or Perl source code.
f4ae0f5e 1770
f1387719 1771It is recommended that you install perl in a standard location before
bab2b58e
AK
1772building extensions. Some precompiled versions of perl do not contain
1773these header files, so you cannot build extensions. In such a case,
1774please build and install your perl from a fresh perl distribution. It
1775usually solves this kind of problem.
f4ae0f5e 1776
bab2b58e
AK
1777\(You get this message, because MakeMaker could not find "$perl_h"\)
1778};
1779 }
f1387719
PP
1780# print STDOUT "Using header files found in $self->{PERL_INC}\n"
1781# if $Verbose && $self->needs_linking();
1e44e2bf 1782
f1387719 1783 }
1e44e2bf 1784
f1387719
PP
1785 # We get SITELIBEXP and SITEARCHEXP directly via
1786 # Get_from_Config. When we are running standard modules, these
1787 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1788 # set it to "site". I prefer that INSTALLDIRS be set from outside
1789 # MakeMaker.
1790 $self->{INSTALLDIRS} ||= "site";
1e44e2bf 1791
f1387719
PP
1792 # INST_LIB typically pre-set if building an extension after
1793 # perl has been built and installed. Setting INST_LIB allows
1794 # you to build directly into, say $Config::Config{privlibexp}.
1795 unless ($self->{INST_LIB}){
1e44e2bf 1796
1e44e2bf 1797
f1387719 1798 ##### XXXXX We have to change this nonsense
1e44e2bf 1799
f1387719
PP
1800 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1801 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1802 } else {
1803 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1804 }
1805 }
1806 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1807 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1e44e2bf 1808
93f9cb4b
PP
1809 # We need to set up INST_LIBDIR before init_libscan() for VMS
1810 my @parentdir = split(/::/, $self->{PARENT_NAME});
1811 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1812 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1813 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1814 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1815
f1387719
PP
1816 # INST_EXE is deprecated, should go away March '97
1817 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1818 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1e44e2bf 1819
f1387719 1820 # The user who requests an installation directory explicitly
d1be9408 1821 # should not have to tell us an architecture installation directory
bab2b58e 1822 # as well. We look if a directory exists that is named after the
f1387719
PP
1823 # architecture. If not we take it as a sign that it should be the
1824 # same as the requested installation directory. Otherwise we take
1825 # the found one.
1826 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1827 my($libpair);
1828 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1829 my $lib = "install$libpair->{l}";
1830 my $Lib = uc $lib;
1831 my $Arch = uc "install$libpair->{a}";
1832 if( $self->{$Lib} && ! $self->{$Arch} ){
1833 my($ilib) = $Config{$lib};
1834 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1e44e2bf 1835
f1387719
PP
1836 $self->prefixify($Arch,$ilib,$self->{$Lib});
1837
1838 unless (-d $self->{$Arch}) {
1839 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1840 $self->{$Arch} = $self->{$Lib};
1841 }
1842 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1843 }
1e44e2bf 1844 }
f4ae0f5e 1845
f1387719
PP
1846 # we have to look at the relation between $Config{prefix} and the
1847 # requested values. We're going to set the $Config{prefix} part of
1848 # all the installation path variables to literally $(PREFIX), so
1849 # the user can still say make PREFIX=foo
bab2b58e 1850 my($configure_prefix) = $Config{'prefix'};
8cc95fdb 1851 $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
bab2b58e
AK
1852 $self->{PREFIX} ||= $configure_prefix;
1853
1854
1855 my($install_variable,$search_prefix,$replace_prefix);
1856
b2b3595d 1857 # If the prefix contains perl, Configure shapes the tree as follows:
bab2b58e
AK
1858 # perlprefix/lib/ INSTALLPRIVLIB
1859 # perlprefix/lib/pod/
1860 # perlprefix/lib/site_perl/ INSTALLSITELIB
1861 # perlprefix/bin/ INSTALLBIN
1862 # perlprefix/man/ INSTALLMAN1DIR
1863 # else
1864 # prefix/lib/perl5/ INSTALLPRIVLIB
1865 # prefix/lib/perl5/pod/
1866 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1867 # prefix/bin/ INSTALLBIN
1868 # prefix/lib/perl5/man/ INSTALLMAN1DIR
b2b3595d
GS
1869 #
1870 # The above results in various kinds of breakage on various
1871 # platforms, so we cope with it as follows: if prefix/lib/perl5
1872 # or prefix/lib/perl5/man exist, we'll replace those instead
1873 # of /prefix/{lib,man}
bab2b58e
AK
1874
1875 $replace_prefix = qq[\$\(PREFIX\)];
1876 for $install_variable (qw/
1877 INSTALLBIN
1878 INSTALLSCRIPT
1879 /) {
1880 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1881 }
b2b3595d 1882 my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
71ad7795 1883 $funkylibdir = '' unless -d $funkylibdir;
b2b3595d 1884 $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
bab2b58e
AK
1885 if ($self->{LIB}) {
1886 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1887 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1888 $self->catdir($self->{LIB},$Config{'archname'});
b2b3595d
GS
1889 }
1890 else {
1891 if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
1892 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
1893 }
1894 else {
1895 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
1896 }
bab2b58e
AK
1897 for $install_variable (qw/
1898 INSTALLPRIVLIB
1899 INSTALLARCHLIB
1900 INSTALLSITELIB
1901 INSTALLSITEARCH
b2b3595d
GS
1902 /)
1903 {
bab2b58e
AK
1904 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1905 }
f1387719 1906 }
b2b3595d 1907 my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
71ad7795 1908 $funkymandir = '' unless -d $funkymandir;
b2b3595d
GS
1909 $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
1910 if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
1911 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
1912 }
1913 else {
1914 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
1915 }
f1387719 1916 for $install_variable (qw/
bab2b58e
AK
1917 INSTALLMAN1DIR
1918 INSTALLMAN3DIR
b2b3595d
GS
1919 /)
1920 {
bab2b58e 1921 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
f1387719 1922 }
1e44e2bf 1923
f1387719
PP
1924 # Now we head at the manpages. Maybe they DO NOT want manpages
1925 # installed
1926 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1927 unless defined $self->{INSTALLMAN1DIR};
1928 unless (defined $self->{INST_MAN1DIR}){
1929 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1930 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1931 } else {
1932 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1933 }
1934 }
1935 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1e44e2bf 1936
f1387719
PP
1937 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1938 unless defined $self->{INSTALLMAN3DIR};
1939 unless (defined $self->{INST_MAN3DIR}){
1940 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1941 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1942 } else {
1943 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1944 }
1e44e2bf 1945 }
f1387719
PP
1946 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1947
cae6c631
JD
1948 $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
1949 unless defined $self->{INSTALLHTMLPRIVLIBDIR};
1950 $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
1951 unless defined $self->{INSTALLHTMLSITELIBDIR};
1952
1953 unless (defined $self->{INST_HTMLLIBDIR}){
1954 if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
1955 $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
1956 } else {
1957 $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
1958 }
1959 }
1960
1961 $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
1962 unless defined $self->{INSTALLHTMLSCRIPTDIR};
1963 unless (defined $self->{INST_HTMLSCRIPTDIR}){
1964 if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
1965 $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
1966 } else {
1967 $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
1968 }
1969 }
1970 $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
1971
f1387719
PP
1972
1973 # Get some stuff out of %Config if we haven't yet done so
1974 print STDOUT "CONFIG must be an array ref\n"
1975 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1976 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1977 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1978 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1979 my(%once_only,$m);
1980 foreach $m (@{$self->{CONFIG}}){
1981 next if $once_only{$m};
1982 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1983 unless exists $Config::Config{$m};
1984 $self->{uc $m} ||= $Config::Config{$m};
1985 $once_only{$m} = 1;
1e44e2bf 1986 }
1e44e2bf 1987
f1387719
PP
1988# This is too dangerous:
1989# if ($^O eq "next") {
1990# $self->{AR} = "libtool";
1991# $self->{AR_STATIC_ARGS} = "-o";
1992# }
1993# But I leave it as a placeholder
1e44e2bf 1994
f1387719 1995 $self->{AR_STATIC_ARGS} ||= "cr";
1e44e2bf 1996
f1387719
PP
1997 # These should never be needed
1998 $self->{LD} ||= 'ld';
1999 $self->{OBJ_EXT} ||= '.o';
2000 $self->{LIB_EXT} ||= '.a';
2001
2002 $self->{MAP_TARGET} ||= "perl";
2003
2004 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
2005
2006 # make a simple check if we find Exporter
2007 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
2008 (Exporter.pm not found)"
2009 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
2010 $self->{NAME} eq "ExtUtils::MakeMaker";
1e44e2bf 2011
f1387719
PP
2012 # Determine VERSION and VERSION_FROM
2013 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
2014 if ($self->{VERSION_FROM}){
2015 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
2016 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1e44e2bf 2017 }
f1387719
PP
2018
2019 # strip blanks
2020 if ($self->{VERSION}) {
2021 $self->{VERSION} =~ s/^\s+//;
2022 $self->{VERSION} =~ s/\s+$//;
1e44e2bf 2023 }
1e44e2bf 2024
f1387719
PP
2025 $self->{VERSION} ||= "0.10";
2026 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1e44e2bf
PP
2027
2028
f1387719
PP
2029 # Graham Barr and Paul Marquess had some ideas how to ensure
2030 # version compatibility between the *.pm file and the
2031 # corresponding *.xs file. The bottomline was, that we need an
2032 # XS_VERSION macro that defaults to VERSION:
2033 $self->{XS_VERSION} ||= $self->{VERSION};
1e44e2bf 2034
f1387719
PP
2035 # --- Initialize Perl Binary Locations
2036
2037 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
66929e52 2038 # will be working versions of perl 5.
f1387719 2039 my ($component,@defpath);
66929e52
MS
2040 foreach $component ($self->{PERL_SRC}, $self->path(),
2041 $Config::Config{binexp})
2042 {
f1387719 2043 push @defpath, $component if defined $component;
1e44e2bf 2044 }
66929e52
MS
2045
2046 my @perls = ($self->canonpath($^X), 'perl', 'perl5', "perl$Config{version}");
2047
2048 # miniperl has priority over all but the cannonical perl when in the
2049 # core. Otherwise its a last resort.
2050 if( $self->{PERL_CORE} ) {
2051 splice @perls, 1, 0, 'miniperl';
2052 }
2053 else {
2054 push @perls, 'miniperl';
2055 }
2056
ff0cee69 2057 $self->{PERL} ||=
66929e52 2058 $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
f1387719
PP
2059 # don't check if perl is executable, maybe they have decided to
2060 # supply switches with perl
2061
2062 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
2063 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
2064 unless ($self->{FULLPERL});
4bfb3f62
MS
2065
2066 # Are we building the core?
2067 $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE};
2068
2069 # How do we run perl?
2070 $self->{PERLRUN} = $self->{PERL};
2071
2072 # How do we run perl when installing libraries?
2073 $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2074
2075 # What extra library dirs do we need when running the tests?
2076 $self->{TEST_LIBS} .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2077
2078 # When building the core, we need to add some helper libs since
2079 # perl's @INC won't work (we're not installed yet).
2080 foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) {
2081 $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)'
2082 if $self->{PERL_CORE};
2083 }
1e44e2bf
PP
2084}
2085
f1387719 2086=item init_others
1e44e2bf 2087
f1387719
PP
2088Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
2089OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
68dc0745 2090MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1e44e2bf
PP
2091
2092=cut
2093
f1387719 2094sub init_others { # --- Initialize Other Attributes
1e44e2bf 2095 my($self) = shift;
1e44e2bf 2096
f1387719
PP
2097 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
2098 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
2099 # undefined. In any case we turn it into an anon array:
1e44e2bf 2100
f1387719
PP
2101 # May check $Config{libs} too, thus not empty.
2102 $self->{LIBS}=[''] unless $self->{LIBS};
f4ae0f5e 2103
a1f8e286 2104 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
f1387719
PP
2105 $self->{LD_RUN_PATH} = "";
2106 my($libs);
2107 foreach $libs ( @{$self->{LIBS}} ){
2108 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
2109 my(@libs) = $self->extliblist($libs);
2110 if ($libs[0] or $libs[1] or $libs[2]){
2111 # LD_RUN_PATH now computed by ExtUtils::Liblist
2112 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
2113 last;
2114 }
2115 }
f4ae0f5e 2116
f1387719
PP
2117 if ( $self->{OBJECT} ) {
2118 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
2119 } else {
2120 # init_dirscan should have found out, if we have C files
2121 $self->{OBJECT} = "";
2122 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1e44e2bf 2123 }
f1387719
PP
2124 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
2125 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
2126 $self->{PERLMAINCC} ||= '$(CC)';
2127 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1e44e2bf 2128
f1387719
PP
2129 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
2130 # the 'dynamic' section of MM. We don't have this problem with
2131 # 'static', since we either must use it (%Config says we can't
2132 # use dynamic loading) or the caller asked for it explicitly.
2133 if (!$self->{LINKTYPE}) {
2134 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
2135 ? 'static'
2136 : ($Config::Config{usedl} ? 'dynamic' : 'static');
2137 };
2138
2139 # These get overridden for VMS and maybe some other systems
55497cff 2140 $self->{NOOP} ||= '$(SHELL) -c true';
f1387719
PP
2141 $self->{FIRST_MAKEFILE} ||= "Makefile";
2142 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
2143 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
2144 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
2145 $self->{RM_F} ||= "rm -f";
2146 $self->{RM_RF} ||= "rm -rf";
2147 $self->{TOUCH} ||= "touch";
68dc0745 2148 $self->{TEST_F} ||= "test -f";
f1387719
PP
2149 $self->{CP} ||= "cp";
2150 $self->{MV} ||= "mv";
2151 $self->{CHMOD} ||= "chmod";
2152 $self->{UMASK_NULL} ||= "umask 0";
68dc0745 2153 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1e44e2bf
PP
2154}
2155
f1387719 2156=item install (o)
1e44e2bf 2157
f1387719 2158Defines the install target.
1e44e2bf
PP
2159
2160=cut
2161
f1387719
PP
2162sub install {
2163 my($self, %attribs) = @_;
1e44e2bf 2164 my(@m);
a5f75d66 2165
f1387719
PP
2166 push @m, q{
2167install :: all pure_install doc_install
1e44e2bf 2168
f1387719 2169install_perl :: all pure_perl_install doc_perl_install
1e44e2bf 2170
f1387719 2171install_site :: all pure_site_install doc_site_install
1e44e2bf 2172
f1387719
PP
2173install_ :: install_site
2174 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2175
f1387719 2176pure_install :: pure_$(INSTALLDIRS)_install
1e44e2bf 2177
f1387719
PP
2178doc_install :: doc_$(INSTALLDIRS)_install
2179 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1e44e2bf 2180
f1387719
PP
2181pure__install : pure_site_install
2182 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2183
f1387719
PP
2184doc__install : doc_site_install
2185 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2186
f1387719
PP
2187pure_perl_install ::
2188 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2189 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2190 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2191 $(INST_LIB) $(INSTALLPRIVLIB) \
2192 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
2193 $(INST_BIN) $(INSTALLBIN) \
2194 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2195 $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
2196 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719
PP
2197 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2198 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2199 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2200 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1e44e2bf 2201
1e44e2bf 2202
f1387719
PP
2203pure_site_install ::
2204 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2205 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
2206 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
2207 $(INST_LIB) $(INSTALLSITELIB) \
2208 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
2209 $(INST_BIN) $(INSTALLBIN) \
2210 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2211 $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
2212 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719
PP
2213 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2214 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2215 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2216 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1e44e2bf 2217
f1387719 2218doc_perl_install ::
082ab410 2219 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2220 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2221 "Module" "$(NAME)" \
f1387719
PP
2222 "installed into" "$(INSTALLPRIVLIB)" \
2223 LINKTYPE "$(LINKTYPE)" \
2224 VERSION "$(VERSION)" \
2225 EXE_FILES "$(EXE_FILES)" \
2226 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2227
f1387719 2228doc_site_install ::
082ab410 2229 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2230 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2231 "Module" "$(NAME)" \
f1387719
PP
2232 "installed into" "$(INSTALLSITELIB)" \
2233 LINKTYPE "$(LINKTYPE)" \
2234 VERSION "$(VERSION)" \
2235 EXE_FILES "$(EXE_FILES)" \
2236 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2237
f1387719 2238};
1e44e2bf 2239
f1387719
PP
2240 push @m, q{
2241uninstall :: uninstall_from_$(INSTALLDIRS)dirs
f4ae0f5e 2242
f1387719
PP
2243uninstall_from_perldirs ::
2244 }.$self->{NOECHO}.
2245 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1e44e2bf 2246
f1387719
PP
2247uninstall_from_sitedirs ::
2248 }.$self->{NOECHO}.
2249 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2250};
1e44e2bf 2251
f1387719
PP
2252 join("",@m);
2253}
1e44e2bf 2254
f1387719 2255=item installbin (o)
1e44e2bf 2256
85fe4bb3 2257Defines targets to make and to install EXE_FILES.
1e44e2bf 2258
f1387719 2259=cut
1e44e2bf 2260
f1387719
PP
2261sub installbin {
2262 my($self) = shift;
2263 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2264 return "" unless @{$self->{EXE_FILES}};
2265 my(@m, $from, $to, %fromto, @to);
2266 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2267 for $from (@{$self->{EXE_FILES}}) {
2268 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2269 local($_) = $path; # for backwards compatibility
2270 $to = $self->libscan($path);
2271 print "libscan($from) => '$to'\n" if ($Verbose >=2);
2272 $fromto{$from}=$to;
2273 }
2274 @to = values %fromto;
84902520 2275 push(@m, qq{
f1387719 2276EXE_FILES = @{$self->{EXE_FILES}}
1e44e2bf 2277
f5cd9d9c 2278} . ($Is_Win32
4bfb3f62 2279 ? q{FIXIN = $(PERLRUN) \
f5cd9d9c 2280 -e "system qq[pl2bat.bat ].shift"
4bfb3f62 2281} : q{FIXIN = $(PERLRUN) -MExtUtils::MakeMaker \
84902520 2282 -e "MY->fixin(shift)"
f5cd9d9c 2283}).qq{
85fe4bb3 2284pure_all :: @to
2d6e8844 2285 $self->{NOECHO}\$(NOOP)
1e44e2bf 2286
f1387719
PP
2287realclean ::
2288 $self->{RM_F} @to
84902520 2289});
1e44e2bf 2290
f1387719
PP
2291 while (($from,$to) = each %fromto) {
2292 last unless defined $from;
2293 my $todir = dirname($to);
2294 push @m, "
84902520 2295$to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
f1387719
PP
2296 $self->{NOECHO}$self->{RM_F} $to
2297 $self->{CP} $from $to
84902520 2298 \$(FIXIN) $to
2366100d 2299 -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
f1387719 2300";
1e44e2bf 2301 }
f1387719
PP
2302 join "", @m;
2303}
1e44e2bf 2304
f1387719 2305=item libscan (o)
1e44e2bf 2306
f1387719
PP
2307Takes a path to a file that is found by init_dirscan and returns false
2308if we don't want to include this file in the library. Mainly used to
2309exclude RCS, CVS, and SCCS directories from installation.
1e44e2bf 2310
f1387719 2311=cut
1e44e2bf 2312
f1387719 2313# ';
1e44e2bf 2314
f1387719
PP
2315sub libscan {
2316 my($self,$path) = @_;
2317 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2318 $path;
1e44e2bf
PP
2319}
2320
f4ae0f5e 2321=item linkext (o)
1e44e2bf 2322
f4ae0f5e 2323Defines the linkext target which in turn defines the LINKTYPE.
1e44e2bf
PP
2324
2325=cut
2326
2327sub linkext {
2328 my($self, %attribs) = @_;
1e44e2bf
PP
2329 # LINKTYPE => static or dynamic or ''
2330 my($linktype) = defined $attribs{LINKTYPE} ?
2331 $attribs{LINKTYPE} : '$(LINKTYPE)';
2332 "
2333linkext :: $linktype
f4ae0f5e 2334 $self->{NOECHO}\$(NOOP)
1e44e2bf
PP
2335";
2336}
2337
f1387719 2338=item lsdir
1e44e2bf 2339
f1387719
PP
2340Takes as arguments a directory name and a regular expression. Returns
2341all entries in the directory that match the regular expression.
1e44e2bf
PP
2342
2343=cut
2344
f1387719
PP
2345sub lsdir {
2346 my($self) = shift;
2347 my($dir, $regex) = @_;
2348 my(@ls);
2349 my $dh = new DirHandle;
2350 $dh->open($dir || ".") or return ();
2351 @ls = $dh->read;
2352 $dh->close;
2353 @ls = grep(/$regex/, @ls) if $regex;
2354 @ls;
2355}
2356
2357=item macro (o)
2358
2359Simple subroutine to insert the macros defined by the macro attribute
2360into the Makefile.
2361
2362=cut
2363
2364sub macro {
1e44e2bf 2365 my($self,%attribs) = @_;
f1387719
PP
2366 my(@m,$key,$val);
2367 while (($key,$val) = each %attribs){
2368 last unless defined $key;
2369 push @m, "$key = $val\n";
1e44e2bf 2370 }
f1387719
PP
2371 join "", @m;
2372}
1e44e2bf 2373
f1387719 2374=item makeaperl (o)
1e44e2bf 2375
f1387719
PP
2376Called by staticmake. Defines how to write the Makefile to produce a
2377static new perl.
2378
55497cff
PP
2379By default the Makefile produced includes all the static extensions in
2380the perl library. (Purified versions of library files, e.g.,
2381DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2382
f1387719
PP
2383=cut
2384
2385sub makeaperl {
2386 my($self, %attribs) = @_;
2387 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2388 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1e44e2bf 2389 my(@m);
f1387719
PP
2390 push @m, "
2391# --- MakeMaker makeaperl section ---
2392MAP_TARGET = $target
2393FULLPERL = $self->{FULLPERL}
2394";
2395 return join '', @m if $self->{PARENT};
1e44e2bf 2396
f1387719 2397 my($dir) = join ":", @{$self->{DIR}};
1e44e2bf 2398
f1387719
PP
2399 unless ($self->{MAKEAPERL}) {
2400 push @m, q{
2401$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2402 $(MAKE) -f $(MAKE_APERL_FILE) $@
1e44e2bf 2403
f1387719
PP
2404$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2405 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
4bfb3f62 2406 }.$self->{NOECHO}.q{$(PERLRUNINST) \
f1387719
PP
2407 Makefile.PL DIR=}, $dir, q{ \
2408 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2409 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
1e44e2bf 2410
f1387719
PP
2411 foreach (@ARGV){
2412 if( /\s/ ){
2413 s/=(.*)/='$1'/;
2414 }
2415 push @m, " \\\n\t\t$_";
2416 }
2417# push @m, map( " \\\n\t\t$_", @ARGV );
2418 push @m, "\n";
1e44e2bf 2419
f1387719
PP
2420 return join '', @m;
2421 }
1e44e2bf 2422
1e44e2bf 2423
1e44e2bf 2424
f1387719 2425 my($cccmd, $linkcmd, $lperl);
1e44e2bf 2426
1e44e2bf 2427
f1387719
PP
2428 $cccmd = $self->const_cccmd($libperl);
2429 $cccmd =~ s/^CCCMD\s*=\s*//;
2430 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
bab2b58e 2431 $cccmd .= " $Config::Config{cccdlflags}"
042ade60 2432 if ($Config::Config{useshrplib} eq 'true');
f1387719 2433 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
1e44e2bf 2434
f1387719
PP
2435 # The front matter of the linkcommand...
2436 $linkcmd = join ' ', "\$(CC)",
5869b1f1 2437 grep($_, @Config{qw(ldflags ccdlflags)});
f1387719 2438 $linkcmd =~ s/\s+/ /g;
93f9cb4b 2439 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
1e44e2bf 2440
f1387719
PP
2441 # Which *.a files could we make use of...
2442 local(%static);
2443 require File::Find;
2444 File::Find::find(sub {
2445 return unless m/\Q$self->{LIB_EXT}\E$/;
2446 return if m/^libperl/;
55497cff
PP
2447 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2448 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
1e44e2bf 2449
f1387719
PP
2450 if( exists $self->{INCLUDE_EXT} ){
2451 my $found = 0;
2452 my $incl;
2453 my $xx;
2454
4f44ac69 2455 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719
PP
2456 $xx =~ s,/?$_,,;
2457 $xx =~ s,/,::,g;
2458
2459 # Throw away anything not explicitly marked for inclusion.
2460 # DynaLoader is implied.
2461 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2462 if( $xx eq $incl ){
2463 $found++;
2464 last;
2465 }
2466 }
2467 return unless $found;
2468 }
2469 elsif( exists $self->{EXCLUDE_EXT} ){
2470 my $excl;
2471 my $xx;
1e44e2bf 2472
4f44ac69 2473 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719
PP
2474 $xx =~ s,/?$_,,;
2475 $xx =~ s,/,::,g;
1e44e2bf 2476
f1387719
PP
2477 # Throw away anything explicitly marked for exclusion
2478 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2479 return if( $xx eq $excl );
2480 }
2481 }
2482
2483 # don't include the installed version of this extension. I
2484 # leave this line here, although it is not necessary anymore:
2485 # I patched minimod.PL instead, so that Miniperl.pm won't
2486 # enclude duplicates
2487
2488 # Once the patch to minimod.PL is in the distribution, I can
2489 # drop it
4f44ac69 2490 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
f1387719
PP
2491 use Cwd 'cwd';
2492 $static{cwd() . "/" . $_}++;
2493 }, grep( -d $_, @{$searchdirs || []}) );
2494
2495 # We trust that what has been handed in as argument, will be buildable
2496 $static = [] unless $static;
2497 @static{@{$static}} = (1) x @{$static};
2498
2499 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2500 for (sort keys %static) {
4f44ac69 2501 next unless /\Q$self->{LIB_EXT}\E\z/;
f1387719
PP
2502 $_ = dirname($_) . "/extralibs.ld";
2503 push @$extra, $_;
1e44e2bf 2504 }
1e44e2bf 2505
f1387719 2506 grep(s/^/-I/, @{$perlinc || []});
1e44e2bf 2507
f1387719
PP
2508 $target = "perl" unless $target;
2509 $tmp = "." unless $tmp;
1e44e2bf 2510
f1387719
PP
2511# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2512# regenerate the Makefiles, MAP_STATIC and the dependencies for
2513# extralibs.all are computed correctly
2514 push @m, "
2515MAP_LINKCMD = $linkcmd
2516MAP_PERLINC = @{$perlinc || []}
2517MAP_STATIC = ",
2518join(" \\\n\t", reverse sort keys %static), "
1e44e2bf 2519
9c839522 2520MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib}
f1387719
PP
2521";
2522
2523 if (defined $libperl) {
2524 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2525 }
2526 unless ($libperl && -f $lperl) { # Ilya's code...
2527 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
3f73c567 2528 $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
f1387719
PP
2529 $libperl ||= "libperl$self->{LIB_EXT}";
2530 $libperl = "$dir/$libperl";
2531 $lperl ||= "libperl$self->{LIB_EXT}";
2532 $lperl = "$dir/$lperl";
ff0cee69
PP
2533
2534 if (! -f $libperl and ! -f $lperl) {
2535 # We did not find a static libperl. Maybe there is a shared one?
2536 if ($^O eq 'solaris' or $^O eq 'sunos') {
2537 $lperl = $libperl = "$dir/$Config::Config{libperl}";
2538 # SUNOS ld does not take the full path to a shared library
2539 $libperl = '' if $^O eq 'sunos';
2540 }
2541 }
2542
f1387719
PP
2543 print STDOUT "Warning: $libperl not found
2544 If you're going to build a static perl binary, make sure perl is installed
2545 otherwise ignore this warning\n"
2546 unless (-f $lperl || defined($self->{PERL_SRC}));
2547 }
1e44e2bf 2548
f1387719
PP
2549 push @m, "
2550MAP_LIBPERL = $libperl
2551";
1e44e2bf 2552
f1387719
PP
2553 push @m, "
2554\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2555 $self->{NOECHO}$self->{RM_F} \$\@
2556 $self->{NOECHO}\$(TOUCH) \$\@
2557";
1e44e2bf 2558
f1387719
PP
2559 my $catfile;
2560 foreach $catfile (@$extra){
2561 push @m, "\tcat $catfile >> \$\@\n";
1e44e2bf 2562 }
ff0cee69
PP
2563 # SUNOS ld does not take the full path to a shared library
2564 my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
1e44e2bf 2565
ff0cee69 2566push @m, "
f1387719 2567\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
4194d490 2568 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
f1387719
PP
2569 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2570 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2571 $self->{NOECHO}echo 'To remove the intermediate files say'
2572 $self->{NOECHO}echo ' make -f $makefilename map_clean'
1e44e2bf 2573
f1387719
PP
2574$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2575";
2576 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
1e44e2bf 2577
f1387719
PP
2578 push @m, qq{
2579$tmp/perlmain.c: $makefilename}, q{
2580 }.$self->{NOECHO}.q{echo Writing $@
68dc0745 2581 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
4f44ac69 2582 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
1e44e2bf 2583
f1387719 2584};
39e571d4
ML
2585 push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2586} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2587
1e44e2bf 2588
f1387719
PP
2589 push @m, q{
2590doc_inst_perl:
2591 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
082ab410 2592 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2593 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2594 "Perl binary" "$(MAP_TARGET)" \
f1387719
PP
2595 MAP_STATIC "$(MAP_STATIC)" \
2596 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2597 MAP_LIBPERL "$(MAP_LIBPERL)" \
2598 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2599
f1387719 2600};
1e44e2bf 2601
f1387719
PP
2602 push @m, q{
2603inst_perl: pure_inst_perl doc_inst_perl
1e44e2bf 2604
f1387719
PP
2605pure_inst_perl: $(MAP_TARGET)
2606 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
1e44e2bf 2607
f1387719
PP
2608clean :: map_clean
2609
2610map_clean :
2611 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2612};
2613
2614 join '', @m;
1e44e2bf
PP
2615}
2616
f1387719 2617=item makefile (o)
1e44e2bf 2618
f1387719 2619Defines how to rewrite the Makefile.
1e44e2bf
PP
2620
2621=cut
2622
f1387719
PP
2623sub makefile {
2624 my($self) = shift;
2625 my @m;
2626 # We do not know what target was originally specified so we
2627 # must force a manual rerun to be sure. But as it should only
2628 # happen very rarely it is not a significant problem.
2629 push @m, '
2630$(OBJECT) : $(FIRST_MAKEFILE)
2631' if $self->{OBJECT};
1e44e2bf 2632
f1387719
PP
2633 push @m, q{
2634# We take a very conservative approach here, but it\'s worth it.
2635# We move Makefile to Makefile.old here to avoid gnu make looping.
2636}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2637 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2638 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
28e8609d 2639 -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
68dc0745
PP
2640 -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2641 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
4bfb3f62 2642 $(PERLRUN) Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
68dc0745
PP
2643 }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2644 }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <=="
2645 false
1e44e2bf 2646
f1387719
PP
2647# To change behavior to :: would be nice, but would break Tk b9.02
2648# so you find such a warning below the dist target.
2649#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2650# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
1e44e2bf
PP
2651};
2652
f1387719 2653 join "", @m;
1e44e2bf
PP
2654}
2655
f4ae0f5e 2656=item manifypods (o)
1e44e2bf 2657
f4ae0f5e
PP
2658Defines targets and routines to translate the pods into manpages and
2659put them into the INST_* directories.
1e44e2bf
PP
2660
2661=cut
2662
2663sub manifypods {
2664 my($self, %attribs) = @_;
f9c559d8
A
2665 return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2666 %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1e44e2bf
PP
2667 my($dist);
2668 my($pod2man_exe);
2669 if (defined $self->{PERL_SRC}) {
2670 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2671 } else {
f1387719 2672 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1e44e2bf 2673 }
cae6c631 2674 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
23614c1f
JH
2675 # Maybe a build by uninstalled Perl?
2676 $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
2677 }
2678 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
1e44e2bf
PP
2679 # No pod2man but some MAN3PODS to be installed
2680 print <<END;
2681
2682Warning: I could not locate your pod2man program. Please make sure,
2683 your pod2man program is in your PATH before you execute 'make'
2684
2685END
2686 $pod2man_exe = "-S pod2man";
2687 }
2688 my(@m);
2689 push @m,
2690qq[POD2MAN_EXE = $pod2man_exe\n],
2366100d
A
2691qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2692q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2693 $self->{MAKEFILE}, q[";' \\
1e44e2bf 2694-e 'print "Manifying $$m{$$_}\n";' \\
4bfb3f62 2695-e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2366100d 2696-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1e44e2bf 2697];
f9c559d8 2698 push @m, "\nmanifypods : pure_all ";
1e44e2bf 2699 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
f1387719
PP
2700
2701 push(@m,"\n");
2702 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2703 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2704 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
1e44e2bf 2705 }
f1387719 2706 join('', @m);
1e44e2bf
PP
2707}
2708
f1387719 2709=item maybe_command
1e44e2bf 2710
f1387719 2711Returns true, if the argument is likely to be a command.
1e44e2bf
PP
2712
2713=cut
2714
f1387719
PP
2715sub maybe_command {
2716 my($self,$file) = @_;
2717 return $file if -x $file && ! -d $file;
2718 return;
1e44e2bf
PP
2719}
2720
f1387719 2721=item maybe_command_in_dirs
1e44e2bf 2722
f1387719 2723method under development. Not yet used. Ask Ilya :-)
1e44e2bf
PP
2724
2725=cut
2726
f1387719
PP
2727sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2728# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2729 my($self, $names, $dirs, $trace, $ver) = @_;
2730 my($name, $dir);
2731 foreach $dir (@$dirs){
2732 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2733 foreach $name (@$names){
2734 my($abs,$tryabs);
2735 if ($self->file_name_is_absolute($name)) { # /foo/bar
2736 $abs = $name;
2737 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2738 $abs = $self->catfile($dir, $name);
2739 } else { # foo/bar
2740 $abs = $self->catfile($self->curdir, $name);
2741 }
2742 print "Checking $abs for $name\n" if ($trace >= 2);
2743 next unless $tryabs = $self->maybe_command($abs);
2744 print "Substituting $tryabs instead of $abs\n"
2745 if ($trace >= 2 and $tryabs ne $abs);
2746 $abs = $tryabs;
2747 if (defined $ver) {
2748 print "Executing $abs\n" if ($trace >= 2);
2749 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2750 print "Using PERL=$abs\n" if $trace;
2751 return $abs;
2752 }
2753 } else { # Do not look for perl
2754 return $abs;
2755 }
2756 }
1e44e2bf 2757 }
1e44e2bf
PP
2758}
2759
f1387719 2760=item needs_linking (o)
1e44e2bf 2761
f1387719
PP
2762Does this module need linking? Looks into subdirectory objects (see
2763also has_link_code())
1e44e2bf
PP
2764
2765=cut
2766
f1387719
PP
2767sub needs_linking {
2768 my($self) = shift;
2769 my($child,$caller);
2770 $caller = (caller(0))[3];
2771 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2772 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2773 if ($self->has_link_code or $self->{MAKEAPERL}){
2774 $self->{NEEDS_LINKING} = 1;
2775 return 1;
1e44e2bf 2776 }
f1387719
PP
2777 foreach $child (keys %{$self->{CHILDREN}}) {
2778 if ($self->{CHILDREN}->{$child}->needs_linking) {
2779 $self->{NEEDS_LINKING} = 1;
2780 return 1;
2781 }
1e44e2bf 2782 }
f1387719 2783 return $self->{NEEDS_LINKING} = 0;
1e44e2bf
PP
2784}
2785
f1387719 2786=item nicetext
1e44e2bf 2787
f1387719
PP
2788misnamed method (will have to be changed). The MM_Unix method just
2789returns the argument without further processing.
2790
2791On VMS used to insure that colons marking targets are preceded by
2792space - most Unix Makes don't need this, but it's necessary under VMS
2793to distinguish the target delimiter from a colon appearing as part of
2794a filespec.
1e44e2bf
PP
2795
2796=cut
2797
f1387719
PP
2798sub nicetext {
2799 my($self,$text) = @_;
2800 $text;
2801}
1e44e2bf 2802
f1387719 2803=item parse_version
1e44e2bf 2804
5a5fd53e
GS
2805parse a file and return what you think is $VERSION in this file set to.
2806It will return the string "undef" if it can't figure out what $VERSION
2807is.
1e44e2bf 2808
f1387719
PP
2809=cut
2810
2811sub parse_version {
2812 my($self,$parsefile) = @_;
2813 my $result;
2814 local *FH;
2815 local $/ = "\n";
2816 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2817 my $inpod = 0;
2818 while (<FH>) {
2819 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
f05db7a1 2820 next if $inpod || /^\s*#/;
f1387719 2821 chop;
84902520
TB
2822 # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2823 next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
dbc738d9
PP
2824 my $eval = qq{
2825 package ExtUtils::MakeMaker::_version;
a1f8e286 2826 no strict;
bab2b58e 2827
84902520
TB
2828 local $1$2;
2829 \$$2=undef; do {
bab2b58e 2830 $_
84902520 2831 }; \$$2
dbc738d9 2832 };
db376a24 2833 no warnings;
84902520 2834 $result = eval($eval);
5a5fd53e 2835 warn "Could not eval '$eval' in $parsefile: $@" if $@;
84902520 2836 $result = "undef" unless defined $result;
f1387719
PP
2837 last;
2838 }
2839 close FH;
2840 return $result;
1e44e2bf
PP
2841}
2842
8f993c78
MN
2843=item parse_abstract
2844
2845parse a file and return what you think is the ABSTRACT
2846
2847=cut
2848
2849sub parse_abstract {
2850 my($self,$parsefile) = @_;
2851 my $result;
2852 local *FH;
2853 local $/ = "\n";
2854 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2855 my $inpod = 0;
2856 my $package = $self->{DISTNAME};
cbadcae4 2857 $package =~ s/-/::/g;
8f993c78
MN
2858 while (<FH>) {
2859 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2860 next if !$inpod;
2861 chop;
2862 next unless /^($package\s-\s)(.*)/;
2863 $result = $2;
2864 last;
2865 }
2866 close FH;
2867 return $result;
2868}
1e44e2bf 2869
f1387719
PP
2870=item pasthru (o)
2871
2872Defines the string that is passed to recursive make calls in
2873subdirectories.
1e44e2bf
PP
2874
2875=cut
2876
f1387719 2877sub pasthru {
1e44e2bf 2878 my($self) = shift;
f1387719 2879 my(@m,$key);
1e44e2bf 2880
f1387719 2881 my(@pasthru);
bbce6d69
PP
2882 my($sep) = $Is_VMS ? ',' : '';
2883 $sep .= "\\\n\t";
1e44e2bf 2884
289e7e34 2885 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
f1387719
PP
2886 push @pasthru, "$key=\"\$($key)\"";
2887 }
f4ae0f5e 2888
289e7e34
JH
2889 foreach $key (qw(DEFINE INC)) {
2890 push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
2891 }
2892
bbce6d69 2893 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
f1387719
PP
2894 join "", @m;
2895}
1e44e2bf 2896
f1387719 2897=item path
f4ae0f5e 2898
f1387719 2899Takes no argument, returns the environment variable PATH as an array.
1e44e2bf 2900
f1387719
PP
2901=cut
2902
2903sub path {
2904 my($self) = @_;
39e571d4 2905 my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
f1387719
PP
2906 my $path = $ENV{PATH};
2907 $path =~ s:\\:/:g if $Is_OS2;
2908 my @path = split $path_sep, $path;
93f9cb4b
PP
2909 foreach(@path) { $_ = '.' if $_ eq '' }
2910 @path;
1e44e2bf
PP
2911}
2912
f1387719 2913=item perl_script
1e44e2bf 2914
f1387719
PP
2915Takes one argument, a file name, and returns the file name, if the
2916argument is likely to be a perl script. On MM_Unix this is true for
2917any ordinary, readable file.
1e44e2bf
PP
2918
2919=cut
2920
f1387719
PP
2921sub perl_script {
2922 my($self,$file) = @_;
2923 return $file if -r $file && -f _;
2924 return;
1e44e2bf
PP
2925}
2926
f1387719 2927=item perldepend (o)
1e44e2bf 2928
f1387719
PP
2929Defines the dependency from all *.h files that come with the perl
2930distribution.
1e44e2bf
PP
2931
2932=cut
2933
f1387719 2934sub perldepend {
1e44e2bf 2935 my($self) = shift;
f1387719
PP
2936 my(@m);
2937 push @m, q{
2938# Check for unpropogated config.sh changes. Should never happen.
2939# We do NOT just update config.h because that is not sufficient.
2940# An out of date config.h is not fatal but complains loudly!
2941$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2942 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2943
2944$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2945 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2946 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2947} if $self->{PERL_SRC};
2948
2949 return join "", @m unless $self->needs_linking;
2950
1e44e2bf 2951 push @m, q{
f1387719 2952PERL_HDRS = \
54fc9134
GS
2953 $(PERL_INC)/EXTERN.h \
2954 $(PERL_INC)/INTERN.h \
2955 $(PERL_INC)/XSUB.h \
2956 $(PERL_INC)/av.h \
2957 $(PERL_INC)/cc_runtime.h \
2958 $(PERL_INC)/config.h \
2959 $(PERL_INC)/cop.h \
2960 $(PERL_INC)/cv.h \
2961 $(PERL_INC)/dosish.h \
2962 $(PERL_INC)/embed.h \
2963 $(PERL_INC)/embedvar.h \
2964 $(PERL_INC)/fakethr.h \
2965 $(PERL_INC)/form.h \
2966 $(PERL_INC)/gv.h \
2967 $(PERL_INC)/handy.h \
2968 $(PERL_INC)/hv.h \
2969 $(PERL_INC)/intrpvar.h \
2970 $(PERL_INC)/iperlsys.h \
2971 $(PERL_INC)/keywords.h \
2972 $(PERL_INC)/mg.h \
2973 $(PERL_INC)/nostdio.h \
54fc9134
GS
2974 $(PERL_INC)/op.h \
2975 $(PERL_INC)/opcode.h \
2976 $(PERL_INC)/opnames.h \
2977 $(PERL_INC)/patchlevel.h \
2978 $(PERL_INC)/perl.h \
2979 $(PERL_INC)/perlapi.h \
2980 $(PERL_INC)/perlio.h \
2981 $(PERL_INC)/perlsdio.h \
2982 $(PERL_INC)/perlsfio.h \
2983 $(PERL_INC)/perlvars.h \
2984 $(PERL_INC)/perly.h \
2985 $(PERL_INC)/pp.h \
2986 $(PERL_INC)/pp_proto.h \
2987 $(PERL_INC)/proto.h \
2988 $(PERL_INC)/regcomp.h \
2989 $(PERL_INC)/regexp.h \
2990 $(PERL_INC)/regnodes.h \
2991 $(PERL_INC)/scope.h \
2992 $(PERL_INC)/sv.h \
2993 $(PERL_INC)/thrdvar.h \
2994 $(PERL_INC)/thread.h \
2995 $(PERL_INC)/unixish.h \
2996 $(PERL_INC)/utf8.h \
2997 $(PERL_INC)/util.h \
2998 $(PERL_INC)/warnings.h
f1387719
PP
2999
3000$(OBJECT) : $(PERL_HDRS)
3001} if $self->{OBJECT};
3002
3003 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
3004
3005 join "\n", @m;
1e44e2bf
PP
3006}
3007
8f993c78
MN
3008=item ppd
3009
3010Defines target that creates a PPD (Perl Package Description) file
3011for a binary distribution.
3012
3013=cut
3014
3015sub ppd {
3016 my($self) = @_;
3017 my(@m);
3018 if ($self->{ABSTRACT_FROM}){
3019 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
3020 Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
3021 }
3022 my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
3023 push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
3024 push(@m, "ppd:\n");
3025 push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
3026 push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
3027 my $abstract = $self->{ABSTRACT};
3aa35033 3028 $abstract =~ s/\n/\\n/sg;
8f993c78
MN
3029 $abstract =~ s/</&lt;/g;
3030 $abstract =~ s/>/&gt;/g;
3031 push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
3032 my ($author) = $self->{AUTHOR};
3aa35033
GS
3033 $author =~ s/</&lt;/g;
3034 $author =~ s/>/&gt;/g;
8f993c78
MN
3035 $author =~ s/@/\\@/g;
3036 push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
3037 push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
3038 my ($prereq);
3039 foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
3040 my $pre_req = $prereq;
3041 $pre_req =~ s/::/-/g;
80252599
GS
3042 my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
3043 push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
8f993c78
MN
3044 }
3045 push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
80252599 3046 push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
8f993c78
MN
3047 my ($bin_location) = $self->{BINARY_LOCATION};
3048 $bin_location =~ s/\\/\\\\/g;
3049 if ($self->{PPM_INSTALL_SCRIPT}) {
3050 if ($self->{PPM_INSTALL_EXEC}) {
3051 push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3052 }
3053 else {
3054 push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3055 }
3056 }
3057 push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
3058 push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
3059 push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
3060
3061 join("", @m);
3062}
3063
2366100d
A
3064=item perm_rw (o)
3065
3066Returns the attribute C<PERM_RW> or the string C<644>.
3067Used as the string that is passed
3068to the C<chmod> command to set the permissions for read/writeable files.
32504223 3069MakeMaker chooses C<644> because it has turned out in the past that
de592821 3070relying on the umask provokes hard-to-track bug reports.
2366100d
A
3071When the return value is used by the perl function C<chmod>, it is
3072interpreted as an octal value.
3073
3074=cut
3075
3076sub perm_rw {
32504223 3077 shift->{PERM_RW} || "644";
2366100d
A
3078}
3079
3080=item perm_rwx (o)
3081
32504223 3082Returns the attribute C<PERM_RWX> or the string C<755>,
2366100d
A
3083i.e. the string that is passed
3084to the C<chmod> command to set the permissions for executable files.
3085See also perl_rw.
3086
3087=cut
3088
3089sub perm_rwx {
32504223 3090 shift->{PERM_RWX} || "755";
2366100d
A
3091}
3092
f1387719 3093=item pm_to_blib
1e44e2bf 3094
f1387719 3095Defines target that copies all files in the hash PM to their
55497cff 3096destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
1e44e2bf
PP
3097
3098=cut
3099
158e3910
JH
3100sub _pm_to_blib_flush {
3101 my ($self, $autodir, $rr, $ra, $rl) = @_;
3102 $$rr .=
3103q{ }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \
3104 -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')"
3105};
3106 @$ra = ();
3107 $$rl = 0;
3108}
3109
f1387719
PP
3110sub pm_to_blib {
3111 my $self = shift;
3112 my($autodir) = $self->catdir('$(INST_LIB)','auto');
d2fa5cc0 3113 my $r = q{
f1387719 3114pm_to_blib: $(TO_INST_PM)
1e44e2bf 3115};
d2fa5cc0
JH
3116 my %pm_to_blib = %{$self->{PM}};
3117 my @a;
3118 my $l;
d2fa5cc0
JH
3119 while (my ($pm, $blib) = each %pm_to_blib) {
3120 my $la = length $pm;
3121 my $lb = length $blib;
158e3910
JH
3122 if ($l + $la + $lb + @a / 2 > 200) { # limit line length
3123 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0
JH
3124 }
3125 push @a, $pm, $blib;
3126 $l += $la + $lb;
3127 }
158e3910 3128 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0 3129 return $r.q{ }.$self->{NOECHO}.q{$(TOUCH) $@};
1e44e2bf
PP
3130}
3131
f1387719 3132=item post_constants (o)
1e44e2bf 3133
f1387719
PP
3134Returns an empty string per default. Dedicated to overrides from
3135within Makefile.PL after all constants have been defined.
1e44e2bf
PP
3136
3137=cut
3138
f1387719
PP
3139sub post_constants{
3140 my($self) = shift;
3141 "";
3142}
1e44e2bf 3143
f1387719 3144=item post_initialize (o)
1e44e2bf 3145
1fef88e7 3146Returns an empty string per default. Used in Makefile.PLs to add some
f1387719 3147chunk of text to the Makefile after the object is initialized.
1e44e2bf 3148
f1387719 3149=cut
1e44e2bf 3150
f1387719
PP
3151sub post_initialize {
3152 my($self) = shift;
3153 "";
3154}
1e44e2bf 3155
f1387719 3156=item postamble (o)
1e44e2bf 3157
f1387719
PP
3158Returns an empty string. Can be used in Makefile.PLs to write some
3159text to the Makefile at the end.
1e44e2bf 3160
f1387719 3161=cut
1e44e2bf 3162
f1387719
PP
3163sub postamble {
3164 my($self) = shift;
3165 "";
3166}
1e44e2bf 3167
f1387719 3168=item prefixify
1e44e2bf 3169
f1387719
PP
3170Check a path variable in $self from %Config, if it contains a prefix,
3171and replace it with another one.
1e44e2bf 3172
f1387719
PP
3173Takes as arguments an attribute name, a search prefix and a
3174replacement prefix. Changes the attribute in the object.
1e44e2bf 3175
f1387719 3176=cut
1e44e2bf 3177
f1387719
PP
3178sub prefixify {
3179 my($self,$var,$sprefix,$rprefix) = @_;
3180 $self->{uc $var} ||= $Config{lc $var};
3181 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
a3a27754 3182 $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s;
f1387719 3183}
1e44e2bf 3184
f1387719 3185=item processPL (o)
1e44e2bf 3186
f1387719 3187Defines targets to run *.PL files.
1e44e2bf 3188
f1387719 3189=cut
1e44e2bf 3190
f1387719
PP
3191sub processPL {
3192 my($self) = shift;
3193 return "" unless $self->{PL_FILES};
3194 my(@m, $plfile);
3195 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3aa35033
GS
3196 my $list = ref($self->{PL_FILES}->{$plfile})
3197 ? $self->{PL_FILES}->{$plfile}
3198 : [$self->{PL_FILES}->{$plfile}];
4194d490 3199 my $target;
3aa35033 3200 foreach $target (@$list) {
f1387719 3201 push @m, "
3aa35033 3202all :: $target
2d6e8844 3203 $self->{NOECHO}\$(NOOP)
1e44e2bf 3204
3aa35033 3205$target :: $plfile
4bfb3f62 3206 \$(PERLRUNINST) $plfile $target
f1387719 3207";
3aa35033 3208 }
f1387719
PP
3209 }
3210 join "", @m;
1e44e2bf
PP
3211}
3212
fa048ccd
JH
3213=item quote_paren
3214
3215Backslashes parentheses C<()> in command line arguments.
3216Doesn't handle recursive Makefile C<$(...)> constructs,
3217but handles simple ones.
3218
3219=cut
3220
3221sub quote_paren {
3222 local $_ = shift;
3223 s/\$\((.+?)\)/\$\\\\($1\\\\)/g; # protect $(...)
3224 s/(?<!\\)([()])/\\$1/g; # quote unprotected
3225 s/\$\\\\\((.+?)\\\\\)/\$($1)/g; # unprotect $(...)
3226 return $_;
3227}
3228
f1387719 3229=item realclean (o)
1e44e2bf 3230
f1387719 3231Defines the realclean target.
1e44e2bf
PP
3232
3233=cut
3234
f1387719
PP
3235sub realclean {
3236 my($self, %attribs) = @_;
3237 my(@m);
2719e44e 3238
2719e44e
JH
3239 push(@m,'LLIBPERL = '.$llibperl."\n");
3240
f1387719
PP
3241 push(@m,'
3242# Delete temporary files (via clean) and also delete installed files
3243realclean purge :: clean
3244');
3245 # realclean subdirectories first (already cleaned)
882a4479
GS
3246 my $sub = ($Is_Win32 && Win32::IsWin95()) ?
3247 "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
3248 "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
f1387719
PP
3249 foreach(@{$self->{DIR}}){
3250 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
3251 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
1e44e2bf 3252 }
f1387719
PP
3253 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
3254 if( $self->has_link_code ){
3255 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
3256 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
3257 }
8dd5ab3a
AD
3258 # Issue a several little RM_F commands rather than risk creating a
3259 # very long command line (useful for extensions such as Encode
3260 # that have many files).
3261 if (keys %{$self->{PM}}) {
3262 my $line = "";
3263 foreach (values %{$self->{PM}}) {
3264 if (length($line) + length($_) > 80) {
3265 push @m, "\t$self->{RM_F} $line\n";
3266 $line = $_;
3267 }
3268 else {
3269 $line .= " $_";
3270 }
3271 }
3272 push @m, "\t$self->{RM_F} $line\n" if $line;
3273 }
f1387719
PP
3274 my(@otherfiles) = ($self->{MAKEFILE},
3275 "$self->{MAKEFILE}.old"); # Makefiles last
3276 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
3277 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
3278 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
3279 join("", @m);
1e44e2bf
PP
3280}
3281
f1387719 3282=item replace_manpage_separator
1e44e2bf 3283
f1387719
PP
3284Takes the name of a package, which may be a nested package, in the
3285form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
1e44e2bf
PP
3286
3287=cut
3288
f1387719
PP
3289sub replace_manpage_separator {
3290 my($self,$man) = @_;
2ebcf328 3291 if ($^O eq 'uwin') {
ed2b665b
PFI
3292 $man =~ s,/+,.,g;
3293 } elsif ($Is_Dos) {
3294 $man =~ s,/+,__,g;
2ebcf328 3295 } else {
ed2b665b 3296 $man =~ s,/+,::,g;
2ebcf328 3297 }
f1387719
PP
3298 $man;
3299}
1e44e2bf 3300
f1387719 3301=item static (o)
1e44e2bf 3302
f1387719 3303Defines the static target.
1e44e2bf 3304
f1387719 3305=cut
1e44e2bf 3306
f1387719
PP
3307sub static {
3308# --- Static Loading Sections ---
1e44e2bf 3309
f1387719
PP
3310 my($self) = shift;
3311 '
3312## $(INST_PM) has been moved to the all: target.
3313## It remains here for awhile to allow for old usage: "make static"
3314#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
3315static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
3316 '.$self->{NOECHO}.'$(NOOP)
3317';
1e44e2bf
PP
3318}
3319
f1387719 3320=item static_lib (o)
1e44e2bf 3321
f1387719 3322Defines how to produce the *.a (or equivalent) files.
1e44e2bf
PP
3323
3324=cut
3325
f1387719
PP
3326sub static_lib {
3327 my($self) = @_;
3328# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
3329# return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 3330
f1387719
PP
3331 return '' unless $self->has_link_code;
3332
3333 my(@m);
3334 push(@m, <<'END');
3335$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
760ac839 3336 $(RM_RF) $@
f1387719 3337END
022735b4 3338 # If this extension has its own library (eg SDBM_File)
f1387719
PP
3339 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3340 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
f4ae0f5e 3341
9f7ff21b
JH
3342 my $ar;
3343 if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
3344 # Prefer the absolute pathed ar if available so that PATH
3345 # doesn't confuse us. Perl itself is built with the full_ar.
3346 $ar = 'FULL_AR';
3347 } else {
3348 $ar = 'AR';
3349 }
f1387719 3350 push @m,
9f7ff21b
JH
3351 "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
3352 push @m,
3353q{ $(CHMOD) $(PERM_RWX) $@
0328fe61 3354 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
f4ae0f5e 3355};
0328fe61
CS
3356 # Old mechanism - still available:
3357 push @m,
3358"\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3359} if $self->{PERL_SRC} && $self->{EXTRALIBS};
3360 push @m, "\n";
f1387719
PP
3361
3362 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3363 join('', "\n",@m);
1e44e2bf
PP
3364}
3365
f4ae0f5e 3366=item staticmake (o)
1e44e2bf 3367
f4ae0f5e 3368Calls makeaperl.
1e44e2bf
PP
3369
3370=cut
3371
3372sub staticmake {
3373 my($self, %attribs) = @_;