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