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