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