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