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