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