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