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