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