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