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