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