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