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