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