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