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