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