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