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