This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Apply NetBSD patch-ae: another gcc sparc64 bug.
[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
a84e0cef
JH
1091 # For example in AIX the shared objects/libraries from previous builds
1092 # linger quite a while in the shared dynalinker cache even when nobody
1093 # is using them. This is painful if one for instance tries to restart
1094 # a failed build because the link command will fail unnecessarily 'cos
1095 # the shared object/library is 'busy'.
1096 push(@m,' $(RM_F) $@
1097');
1098
770fab92
SC
1099 push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
1100 ' $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)');
f1387719 1101 push @m, '
2366100d 1102 $(CHMOD) $(PERM_RWX) $@
f1387719 1103';
1e44e2bf 1104
f1387719 1105 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1e44e2bf 1106 join('',@m);
1107}
1108
f1387719 1109=item exescan
1e44e2bf 1110
f1387719 1111Deprecated method. Use libscan instead.
1e44e2bf 1112
1113=cut
1114
f1387719 1115sub exescan {
1116 my($self,$path) = @_;
1117 $path;
1e44e2bf 1118}
1119
f1387719 1120=item extliblist
1e44e2bf 1121
f1387719 1122Called by init_others, and calls ext ExtUtils::Liblist. See
1123L<ExtUtils::Liblist> for details.
1e44e2bf 1124
1125=cut
1126
f1387719 1127sub extliblist {
1128 my($self,$libs) = @_;
1129 require ExtUtils::Liblist;
1130 $self->ext($libs, $Verbose);
1131}
f4ae0f5e 1132
f1387719 1133=item file_name_is_absolute
f4ae0f5e 1134
1fef88e7 1135Takes as argument a path and returns true, if it is an absolute path.
1e44e2bf 1136
f1387719 1137=cut
1e44e2bf 1138
f1387719 1139sub file_name_is_absolute {
1140 my($self,$file) = @_;
39e571d4 1141 if ($Is_Dos){
4f44ac69 1142 $file =~ m{^([a-z]:)?[\\/]}is ;
39e571d4
LM
1143 }
1144 else {
4f44ac69 1145 $file =~ m:^/:s ;
39e571d4 1146 }
f1387719 1147}
1e44e2bf 1148
f1387719 1149=item find_perl
1e44e2bf 1150
f1387719 1151Finds the executables PERL and FULLPERL
1e44e2bf 1152
f1387719 1153=cut
1e44e2bf 1154
f1387719 1155sub find_perl {
1156 my($self, $ver, $names, $dirs, $trace) = @_;
1157 my($name, $dir);
1158 if ($trace >= 2){
1159 print "Looking for perl $ver by these names:
1160@$names
1161in these dirs:
1162@$dirs
1163";
1164 }
ec751b0b
DB
1165 foreach $name (@$names){
1166 foreach $dir (@$dirs){
1167 next unless defined $dir; # $self->{PERL_SRC} may be undefined
a1f8e286 1168 my ($abs, $val);
f1387719 1169 if ($self->file_name_is_absolute($name)) { # /foo/bar
1170 $abs = $name;
1171 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1172 $abs = $self->catfile($dir, $name);
1173 } else { # foo/bar
1174 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1175 }
1176 print "Checking $abs\n" if ($trace >= 2);
1177 next unless $self->maybe_command($abs);
1178 print "Executing $abs\n" if ($trace >= 2);
a1f8e286
IZ
1179 $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1180 if ($val =~ /VER_OK/) {
f1387719 1181 print "Using PERL=$abs\n" if $trace;
1182 return $abs;
a1f8e286
IZ
1183 } elsif ($trace >= 2) {
1184 print "Result: `$val'\n";
1e44e2bf 1185 }
1186 }
1e44e2bf 1187 }
f1387719 1188 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1189 0; # false and not empty
1190}
1e44e2bf 1191
bab2b58e
A
1192=back
1193
f1387719 1194=head2 Methods to actually produce chunks of text for the Makefile
1e44e2bf 1195
bab2b58e
A
1196The methods here are called for each MakeMaker object in the order
1197specified by @ExtUtils::MakeMaker::MM_Sections.
1198
1199=over 2
f4ae0f5e 1200
84902520
TB
1201=item fixin
1202
1203Inserts the sharpbang or equivalent magic number to a script
1204
1205=cut
1206
1207sub fixin { # stolen from the pink Camel book, more or less
1208 my($self,@files) = @_;
1209 my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/;
1210 my($file,$interpreter);
1211 for $file (@files) {
1212 local(*FIXIN);
1213 local(*FIXOUT);
1214 open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
1215 local $/ = "\n";
1216 chomp(my $line = <FIXIN>);
1217 next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
1218 # Now figure out the interpreter name.
1219 my($cmd,$arg) = split ' ', $line, 2;
1220 $cmd =~ s!^.*/!!;
1221
1222 # Now look (in reverse) for interpreter in absolute PATH (unless perl).
1223 if ($cmd eq "perl") {
fb73857a 1224 if ($Config{startperl} =~ m,^\#!.*/perl,) {
1225 $interpreter = $Config{startperl};
1226 $interpreter =~ s,^\#!,,;
1227 } else {
1228 $interpreter = $Config{perlpath};
1229 }
84902520
TB
1230 } else {
1231 my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
1232 $interpreter = '';
1233 my($dir);
1234 foreach $dir (@absdirs) {
1235 if ($self->maybe_command($cmd)) {
1236 warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
1237 $interpreter = $self->catfile($dir,$cmd);
1238 }
1239 }
1240 }
1241 # Figure out how to invoke interpreter on this machine.
1242
1243 my($shb) = "";
1244 if ($interpreter) {
1245 print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
f5cd9d9c 1246 # this is probably value-free on DOSISH platforms
84902520
TB
1247 if ($does_shbang) {
1248 $shb .= "$Config{'sharpbang'}$interpreter";
1249 $shb .= ' ' . $arg if defined $arg;
1250 $shb .= "\n";
1251 }
1252 $shb .= qq{
1253eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
90248788 1254 if 0; # not running under some shell
f5cd9d9c 1255} unless $Is_Win32; # this won't work on win32, so don't
84902520
TB
1256 } else {
1257 warn "Can't find $cmd in PATH, $file unchanged"
1258 if $Verbose;
1259 next;
1260 }
1261
f5cd9d9c 1262 unless ( open(FIXOUT,">$file.new") ) {
84902520
TB
1263 warn "Can't create new $file: $!\n";
1264 next;
1265 }
1266 my($dev,$ino,$mode) = stat FIXIN;
84902520
TB
1267
1268 # Print out the new #! line (or equivalent).
1269 local $\;
1270 undef $/;
1271 print FIXOUT $shb, <FIXIN>;
1272 close FIXIN;
1273 close FIXOUT;
985777a9
GS
1274
1275 # can't rename/chmod open files on some DOSISH platforms
1276
1277 # If they override perm_rwx, we won't notice it during fixin,
1278 # because fixin is run through a new instance of MakeMaker.
1279 # That is why we must run another CHMOD later.
1280 $mode = oct($self->perm_rwx) unless $dev;
1281 chmod $mode, $file;
1282
f5cd9d9c
GS
1283 unless ( rename($file, "$file.bak") ) {
1284 warn "Can't rename $file to $file.bak: $!";
1285 next;
1286 }
1287 unless ( rename("$file.new", $file) ) {
1288 warn "Can't rename $file.new to $file: $!";
1289 unless ( rename("$file.bak", $file) ) {
1290 warn "Can't rename $file.bak back to $file either: $!";
1291 warn "Leaving $file renamed as $file.bak\n";
1292 }
1293 next;
1294 }
84902520
TB
1295 unlink "$file.bak";
1296 } continue {
985777a9 1297 close(FIXIN) if fileno(FIXIN);
2366100d
A
1298 chmod oct($self->perm_rwx), $file or
1299 die "Can't reset permissions for $file: $!\n";
84902520
TB
1300 system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
1301 }
1302}
1303
f1387719 1304=item force (o)
1305
1306Just writes FORCE:
1307
1308=cut
1e44e2bf 1309
f1387719 1310sub force {
1311 my($self) = shift;
1312 '# Phony target to force checking subdirectories.
1313FORCE:
3e3baf6d 1314 '.$self->{NOECHO}.'$(NOOP)
f1387719 1315';
1e44e2bf 1316}
1317
f1387719 1318=item guess_name
1e44e2bf 1319
f1387719 1320Guess the name of this package by examining the working directory's
1321name. MakeMaker calls this only if the developer has not supplied a
1322NAME attribute.
1e44e2bf 1323
f1387719 1324=cut
f4ae0f5e 1325
f1387719 1326# ';
1327
1328sub guess_name {
1329 my($self) = @_;
1330 use Cwd 'cwd';
1331 my $name = basename(cwd());
4f44ac69 1332 $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we
f1387719 1333 # strip minus or underline
1334 # followed by a float or some such
1335 print "Warning: Guessing NAME [$name] from current directory name.\n";
1336 $name;
1337}
1338
1339=item has_link_code
1340
1341Returns true if C, XS, MYEXTLIB or similar objects exist within this
1342object that need a compiler. Does not descend into subdirectories as
1343needs_linking() does.
f4ae0f5e 1344
1345=cut
1346
f1387719 1347sub has_link_code {
1348 my($self) = shift;
1349 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1350 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1351 $self->{HAS_LINK_CODE} = 1;
1352 return 1;
f4ae0f5e 1353 }
f1387719 1354 return $self->{HAS_LINK_CODE} = 0;
f4ae0f5e 1355}
1356
cae6c631
JD
1357=item htmlifypods (o)
1358
1359Defines targets and routines to translate the pods into HTML manpages
1360and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
1361directories.
1362
1363=cut
1364
1365sub htmlifypods {
1366 my($self, %attribs) = @_;
1367 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
1368 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
1369 my($dist);
1370 my($pod2html_exe);
1371 if (defined $self->{PERL_SRC}) {
1372 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
1373 } else {
1374 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
1375 }
1376 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
1377 # No pod2html but some HTMLxxxPODS to be installed
1378 print <<END;
1379
1380Warning: I could not locate your pod2html program. Please make sure,
1381 your pod2html program is in your PATH before you execute 'make'
1382
1383END
1384 $pod2html_exe = "-S pod2html";
1385 }
1386 my(@m);
1387 push @m,
1388qq[POD2HTML_EXE = $pod2html_exe\n],
1389qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
1390q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
1391 $self->{MAKEFILE}, q[";' \\
1392-e 'print "Htmlifying $$m{$$_}\n";' \\
1393-e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
4bfb3f62 1394-e 'system(q[$(PERLRUN) $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
cae6c631
JD
1395-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1396];
1397 push @m, "\nhtmlifypods : pure_all ";
1398 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
1399
1400 push(@m,"\n");
1401 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
1402 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
1403 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
1404 }
1405 join('', @m);
1406}
1407
f1387719 1408=item init_dirscan
f4ae0f5e 1409
cae6c631 1410Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
f1387719 1411
1412=cut
1413
1414sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
1415 my($self) = @_;
1416 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1417 local(%pm); #the sub in find() has to see this hash
6ee623d5 1418 @ignore{qw(Makefile.PL test.pl)} = (1,1);
f1387719 1419 $ignore{'makefile.pl'} = 1 if $Is_VMS;
1420 foreach $name ($self->lsdir($self->curdir)){
4ecf31dc 1421 next if $name =~ /\#/;
f1387719 1422 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1423 next unless $self->libscan($name);
1424 if (-d $name){
760ac839 1425 next if -l $name; # We do not support symlinks at all
f1387719 1426 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
4f44ac69
GS
1427 } elsif ($name =~ /\.xs\z/){
1428 my($c); ($c = $name) =~ s/\.xs\z/.c/;
f1387719 1429 $xs{$name} = $c;
1430 $c{$c} = 1;
4f44ac69 1431 } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc
f1387719 1432 $c{$name} = 1
1433 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
4f44ac69 1434 } elsif ($name =~ /\.h\z/i){
f1387719 1435 $h{$name} = 1;
4f44ac69
GS
1436 } elsif ($name =~ /\.PL\z/) {
1437 ($pl_files{$name} = $name) =~ s/\.PL\z// ;
933fea7f 1438 } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
918c0b2d 1439 # case-insensitive filesystem, one dot per name, so foo.h.PL
933fea7f 1440 # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
6ee623d5
GS
1441 local($/); open(PL,$name); my $txt = <PL>; close PL;
1442 if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
4f44ac69 1443 ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
6ee623d5
GS
1444 }
1445 else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
4f44ac69 1446 } elsif ($name =~ /\.(p[ml]|pod)\z/){
f1387719 1447 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
f1387719 1448 }
1449 }
f4ae0f5e 1450
f1387719 1451 # Some larger extensions often wish to install a number of *.pm/pl
1452 # files into the library in various locations.
f4ae0f5e 1453
f1387719 1454 # The attribute PMLIBDIRS holds an array reference which lists
1455 # subdirectories which we should search for library files to
1456 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1457 # recursively search through the named directories (skipping any
1458 # which don't exist or contain Makefile.PL files).
f4ae0f5e 1459
f1387719 1460 # For each *.pm or *.pl file found $self->libscan() is called with
1461 # the default installation path in $_[1]. The return value of
1462 # libscan defines the actual installation location. The default
1463 # libscan function simply returns the path. The file is skipped
1464 # if libscan returns false.
f4ae0f5e 1465
f1387719 1466 # The default installation location passed to libscan in $_[1] is:
1467 #
1468 # ./*.pm => $(INST_LIBDIR)/*.pm
1469 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1470 # ./lib/... => $(INST_LIB)/...
1471 #
1472 # In this way the 'lib' directory is seen as the root of the actual
1473 # perl library whereas the others are relative to INST_LIBDIR
1474 # (which includes PARENT_NAME). This is a subtle distinction but one
1475 # that's important for nested modules.
1e44e2bf 1476
f1387719 1477 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1478 unless $self->{PMLIBDIRS};
1e44e2bf 1479
f1387719 1480 #only existing directories that aren't in $dir are allowed
1e44e2bf 1481
f1387719 1482 # Avoid $_ wherever possible:
1483 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1484 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1485 my ($pmlibdir);
1486 @{$self->{PMLIBDIRS}} = ();
1487 foreach $pmlibdir (@pmlibdirs) {
1488 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1e44e2bf 1489 }
1e44e2bf 1490
f1387719 1491 if (@{$self->{PMLIBDIRS}}){
1492 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1493 if ($Verbose >= 2);
1494 require File::Find;
1495 File::Find::find(sub {
1496 if (-d $_){
1497 if ($_ eq "CVS" || $_ eq "RCS"){
1498 $File::Find::prune = 1;
1499 }
1500 return;
1501 }
4ecf31dc 1502 return if /\#/;
f1387719 1503 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1504 my($striplibpath,$striplibname);
93f9cb4b 1505 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
f1387719 1506 ($striplibname,$striplibpath) = fileparse($striplibpath);
1507 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1508 local($_) = $inst; # for backwards compatibility
1509 $inst = $self->libscan($inst);
1510 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1511 return unless $inst;
1512 $pm{$path} = $inst;
1513 }, @{$self->{PMLIBDIRS}});
1514 }
1e44e2bf 1515
f1387719 1516 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1517 $self->{XS} = \%xs unless $self->{XS};
1518 $self->{PM} = \%pm unless $self->{PM};
1519 $self->{C} = [sort keys %c] unless $self->{C};
1520 my(@o_files) = @{$self->{C}};
4f44ac69 1521 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
f1387719 1522 $self->{H} = [sort keys %h] unless $self->{H};
1523 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1e44e2bf 1524
f1387719 1525 # Set up names of manual pages to generate from pods
cae6c631
JD
1526 my %pods;
1527 foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
1528 unless ($self->{"${man}PODS"}) {
1529 $self->{"${man}PODS"} = {};
1530 $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
1531 }
1532 }
1533
1534 if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
f1387719 1535 if ( exists $self->{EXE_FILES} ) {
1536 foreach $name (@{$self->{EXE_FILES}}) {
f1387719 1537 local *FH;
1538 my($ispod)=0;
f1387719 1539 if (open(FH,"<$name")) {
f1387719 1540 while (<FH>) {
1541 if (/^=head1\s+\w+/) {
1542 $ispod=1;
1543 last;
1544 }
1545 }
f1387719 1546 close FH;
1547 } else {
1548 # If it doesn't exist yet, we assume, it has pods in it
1549 $ispod = 1;
1e44e2bf 1550 }
cae6c631
JD
1551 next unless $ispod;
1552 if ($pods{HTMLSCRIPT}) {
1553 $self->{HTMLSCRIPTPODS}->{$name} =
1554 $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
1555 }
1556 if ($pods{MAN1}) {
1557 $self->{MAN1PODS}->{$name} =
1558 $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
1e44e2bf 1559 }
f1387719 1560 }
1e44e2bf 1561 }
1562 }
cae6c631 1563 if ($pods{MAN3} || $pods{HTMLLIB}) {
f1387719 1564 my %manifypods = (); # we collect the keys first, i.e. the files
1565 # we have to convert to pod
1566 foreach $name (keys %{$self->{PM}}) {
4f44ac69 1567 if ($name =~ /\.pod\z/ ) {
f1387719 1568 $manifypods{$name} = $self->{PM}{$name};
4f44ac69 1569 } elsif ($name =~ /\.p[ml]\z/ ) {
f1387719 1570 local *FH;
1571 my($ispod)=0;
f1387719 1572 if (open(FH,"<$name")) {
f1387719 1573 while (<FH>) {
1574 if (/^=head1\s+\w+/) {
1575 $ispod=1;
1576 last;
1577 }
1578 }
f1387719 1579 close FH;
1580 } else {
1581 $ispod = 1;
1582 }
1583 if( $ispod ) {
1584 $manifypods{$name} = $self->{PM}{$name};
1585 }
1586 }
1587 }
1588
1589 # Remove "Configure.pm" and similar, if it's not the only pod listed
1590 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1591 foreach $name (keys %manifypods) {
40b90ac3 1592 if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
f1387719 1593 delete $manifypods{$name};
1594 next;
1595 }
1596 my($manpagename) = $name;
4f44ac69 1597 $manpagename =~ s/\.p(od|m|l)\z//;
cae6c631
JD
1598 if ($pods{HTMLLIB}) {
1599 $self->{HTMLLIBPODS}->{$name} =
1600 $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
1601 }
4f44ac69 1602 unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
f1387719 1603 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1604 }
cae6c631
JD
1605 if ($pods{MAN3}) {
1606 $manpagename = $self->replace_manpage_separator($manpagename);
1607 $self->{MAN3PODS}->{$name} =
1608 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
1609 }
1e44e2bf 1610 }
1611 }
f1387719 1612}
1e44e2bf 1613
f1387719 1614=item init_main
1e44e2bf 1615
f1387719 1616Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1617PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
8cc95fdb 1618PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
f1387719 1619LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
f4ae0f5e 1620
f1387719 1621=cut
1e44e2bf 1622
f1387719 1623sub init_main {
1624 my($self) = @_;
1e44e2bf 1625
f1387719 1626 # --- Initialize Module Name and Paths
1e44e2bf 1627
f1387719 1628 # NAME = Foo::Bar::Oracle
1629 # FULLEXT = Foo/Bar/Oracle
1630 # BASEEXT = Oracle
1631 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1632 # PARENT_NAME = Foo::Bar
1633### Only UNIX:
1634### ($self->{FULLEXT} =
1635### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1636 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1e44e2bf 1637
1e44e2bf 1638
f1387719 1639 # Copied from DynaLoader:
1e44e2bf 1640
f1387719 1641 my(@modparts) = split(/::/,$self->{NAME});
1642 my($modfname) = $modparts[-1];
1e44e2bf 1643
f1387719 1644 # Some systems have restrictions on files names for DLL's etc.
1645 # mod2fname returns appropriate file base name (typically truncated)
1646 # It may also edit @modparts if required.
1647 if (defined &DynaLoader::mod2fname) {
1648 $modfname = &DynaLoader::mod2fname(\@modparts);
bab2b58e 1649 }
1e44e2bf 1650
4f44ac69 1651 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
f1387719 1652
760ac839 1653 if (defined &DynaLoader::mod2fname) {
f1387719 1654 # As of 5.001m, dl_os2 appends '_'
1655 $self->{DLBASE} = $modfname;
1656 } else {
1657 $self->{DLBASE} = '$(BASEEXT)';
1658 }
1659
1e44e2bf 1660
f1387719 1661 ### ROOTEXT deprecated from MM 5.32
1662### ($self->{ROOTEXT} =
1663### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1664### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1e44e2bf 1665
1e44e2bf 1666
f1387719 1667 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1e44e2bf 1668
f1387719 1669 # *Real* information: where did we get these two from? ...
1670 my $inc_config_dir = dirname($INC{'Config.pm'});
1671 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1e44e2bf 1672
f1387719 1673 unless ($self->{PERL_SRC}){
1674 my($dir);
dfc18e8a 1675 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 1676 if (
1677 -f $self->catfile($dir,"config.sh")
1678 &&
1679 -f $self->catfile($dir,"perl.h")
1680 &&
1681 -f $self->catfile($dir,"lib","Exporter.pm")
1682 ) {
1683 $self->{PERL_SRC}=$dir ;
1684 last;
1685 }
1686 }
1687 }
1688 if ($self->{PERL_SRC}){
1689 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1690 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
137443ea 1691 $self->{PERL_INC} = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
1e44e2bf 1692
137443ea 1693 # catch a situation that has occurred a few times in the past:
bab2b58e
A
1694 unless (
1695 -s $self->catfile($self->{PERL_SRC},'cflags')
1696 or
1697 $Is_VMS
1698 &&
1699 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1700 or
1701 $Is_Mac
137443ea 1702 or
1703 $Is_Win32
bab2b58e
A
1704 ){
1705 warn qq{
f1387719 1706You cannot build extensions below the perl source tree after executing
1707a 'make clean' in the perl source tree.
1e44e2bf 1708
f1387719 1709To rebuild extensions distributed with the perl source you should
1710simply Configure (to include those extensions) and then build perl as
1711normal. After installing perl the source tree can be deleted. It is
1712not needed for building extensions by running 'perl Makefile.PL'
1713usually without extra arguments.
1e44e2bf 1714
f1387719 1715It is recommended that you unpack and build additional extensions away
1716from the perl source tree.
bab2b58e
A
1717};
1718 }
f1387719 1719 } else {
1720 # we should also consider $ENV{PERL5LIB} here
23614c1f 1721 my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
f1387719 1722 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1723 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1724 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1725 my $perl_h;
23614c1f 1726
0a022e8e 1727 no warnings 'uninitialized' ;
23614c1f
JH
1728 if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
1729 and not $old){
1730 # Maybe somebody tries to build an extension with an
1731 # uninstalled Perl outside of Perl build tree
1732 my $found;
1733 for my $dir (@INC) {
1734 $found = $dir, last if -e $self->catdir($dir, "Config.pm");
1735 }
1736 if ($found) {
1737 my $inc = dirname $found;
1738 if (-e $self->catdir($inc, "perl.h")) {
1739 $self->{PERL_LIB} = $found;
1740 $self->{PERL_ARCHLIB} = $found;
1741 $self->{PERL_INC} = $inc;
1742 $self->{UNINSTALLED_PERL} = 1;
1743 print STDOUT <<EOP;
1744... Detected uninstalled Perl. Trying to continue.
1745EOP
1746 }
1747 }
1748 }
1749
bab2b58e
A
1750 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1751 die qq{
f1387719 1752Error: Unable to locate installed Perl libraries or Perl source code.
f4ae0f5e 1753
f1387719 1754It is recommended that you install perl in a standard location before
bab2b58e
A
1755building extensions. Some precompiled versions of perl do not contain
1756these header files, so you cannot build extensions. In such a case,
1757please build and install your perl from a fresh perl distribution. It
1758usually solves this kind of problem.
f4ae0f5e 1759
bab2b58e
A
1760\(You get this message, because MakeMaker could not find "$perl_h"\)
1761};
1762 }
f1387719 1763# print STDOUT "Using header files found in $self->{PERL_INC}\n"
1764# if $Verbose && $self->needs_linking();
1e44e2bf 1765
f1387719 1766 }
1e44e2bf 1767
f1387719 1768 # We get SITELIBEXP and SITEARCHEXP directly via
1769 # Get_from_Config. When we are running standard modules, these
1770 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1771 # set it to "site". I prefer that INSTALLDIRS be set from outside
1772 # MakeMaker.
1773 $self->{INSTALLDIRS} ||= "site";
1e44e2bf 1774
f1387719 1775 # INST_LIB typically pre-set if building an extension after
1776 # perl has been built and installed. Setting INST_LIB allows
1777 # you to build directly into, say $Config::Config{privlibexp}.
1778 unless ($self->{INST_LIB}){
1e44e2bf 1779
1e44e2bf 1780
f1387719 1781 ##### XXXXX We have to change this nonsense
1e44e2bf 1782
f1387719 1783 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1784 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1785 } else {
1786 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1787 }
1788 }
1789 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1790 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1e44e2bf 1791
93f9cb4b 1792 # We need to set up INST_LIBDIR before init_libscan() for VMS
1793 my @parentdir = split(/::/, $self->{PARENT_NAME});
1794 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1795 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1796 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1797 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1798
f1387719 1799 # INST_EXE is deprecated, should go away March '97
1800 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1801 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1e44e2bf 1802
f1387719 1803 # The user who requests an installation directory explicitly
d1be9408 1804 # should not have to tell us an architecture installation directory
bab2b58e 1805 # as well. We look if a directory exists that is named after the
f1387719 1806 # architecture. If not we take it as a sign that it should be the
1807 # same as the requested installation directory. Otherwise we take
1808 # the found one.
1809 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1810 my($libpair);
1811 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1812 my $lib = "install$libpair->{l}";
1813 my $Lib = uc $lib;
1814 my $Arch = uc "install$libpair->{a}";
1815 if( $self->{$Lib} && ! $self->{$Arch} ){
1816 my($ilib) = $Config{$lib};
1817 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1e44e2bf 1818
f1387719 1819 $self->prefixify($Arch,$ilib,$self->{$Lib});
1820
1821 unless (-d $self->{$Arch}) {
1822 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1823 $self->{$Arch} = $self->{$Lib};
1824 }
1825 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1826 }
1e44e2bf 1827 }
f4ae0f5e 1828
f1387719 1829 # we have to look at the relation between $Config{prefix} and the
1830 # requested values. We're going to set the $Config{prefix} part of
1831 # all the installation path variables to literally $(PREFIX), so
1832 # the user can still say make PREFIX=foo
bab2b58e 1833 my($configure_prefix) = $Config{'prefix'};
8cc95fdb 1834 $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
bab2b58e
A
1835 $self->{PREFIX} ||= $configure_prefix;
1836
1837
1838 my($install_variable,$search_prefix,$replace_prefix);
1839
b2b3595d 1840 # If the prefix contains perl, Configure shapes the tree as follows:
bab2b58e
A
1841 # perlprefix/lib/ INSTALLPRIVLIB
1842 # perlprefix/lib/pod/
1843 # perlprefix/lib/site_perl/ INSTALLSITELIB
1844 # perlprefix/bin/ INSTALLBIN
1845 # perlprefix/man/ INSTALLMAN1DIR
1846 # else
1847 # prefix/lib/perl5/ INSTALLPRIVLIB
1848 # prefix/lib/perl5/pod/
1849 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1850 # prefix/bin/ INSTALLBIN
1851 # prefix/lib/perl5/man/ INSTALLMAN1DIR
b2b3595d
GS
1852 #
1853 # The above results in various kinds of breakage on various
1854 # platforms, so we cope with it as follows: if prefix/lib/perl5
1855 # or prefix/lib/perl5/man exist, we'll replace those instead
1856 # of /prefix/{lib,man}
bab2b58e
A
1857
1858 $replace_prefix = qq[\$\(PREFIX\)];
1859 for $install_variable (qw/
1860 INSTALLBIN
1861 INSTALLSCRIPT
1862 /) {
1863 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1864 }
b2b3595d 1865 my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
71ad7795 1866 $funkylibdir = '' unless -d $funkylibdir;
b2b3595d 1867 $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
bab2b58e
A
1868 if ($self->{LIB}) {
1869 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1870 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1871 $self->catdir($self->{LIB},$Config{'archname'});
b2b3595d
GS
1872 }
1873 else {
1874 if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
1875 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
1876 }
1877 else {
1878 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
1879 }
bab2b58e
A
1880 for $install_variable (qw/
1881 INSTALLPRIVLIB
1882 INSTALLARCHLIB
1883 INSTALLSITELIB
1884 INSTALLSITEARCH
b2b3595d
GS
1885 /)
1886 {
bab2b58e
A
1887 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1888 }
f1387719 1889 }
b2b3595d 1890 my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
71ad7795 1891 $funkymandir = '' unless -d $funkymandir;
b2b3595d
GS
1892 $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
1893 if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
1894 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
1895 }
1896 else {
1897 $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
1898 }
f1387719 1899 for $install_variable (qw/
bab2b58e
A
1900 INSTALLMAN1DIR
1901 INSTALLMAN3DIR
b2b3595d
GS
1902 /)
1903 {
bab2b58e 1904 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
f1387719 1905 }
1e44e2bf 1906
f1387719 1907 # Now we head at the manpages. Maybe they DO NOT want manpages
1908 # installed
1909 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1910 unless defined $self->{INSTALLMAN1DIR};
1911 unless (defined $self->{INST_MAN1DIR}){
1912 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1913 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1914 } else {
1915 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1916 }
1917 }
1918 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1e44e2bf 1919
f1387719 1920 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1921 unless defined $self->{INSTALLMAN3DIR};
1922 unless (defined $self->{INST_MAN3DIR}){
1923 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1924 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1925 } else {
1926 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1927 }
1e44e2bf 1928 }
f1387719 1929 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1930
cae6c631
JD
1931 $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
1932 unless defined $self->{INSTALLHTMLPRIVLIBDIR};
1933 $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
1934 unless defined $self->{INSTALLHTMLSITELIBDIR};
1935
1936 unless (defined $self->{INST_HTMLLIBDIR}){
1937 if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
1938 $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
1939 } else {
1940 $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
1941 }
1942 }
1943
1944 $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
1945 unless defined $self->{INSTALLHTMLSCRIPTDIR};
1946 unless (defined $self->{INST_HTMLSCRIPTDIR}){
1947 if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
1948 $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
1949 } else {
1950 $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
1951 }
1952 }
1953 $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
1954
f1387719 1955
1956 # Get some stuff out of %Config if we haven't yet done so
1957 print STDOUT "CONFIG must be an array ref\n"
1958 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1959 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1960 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1961 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1962 my(%once_only,$m);
1963 foreach $m (@{$self->{CONFIG}}){
1964 next if $once_only{$m};
1965 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1966 unless exists $Config::Config{$m};
1967 $self->{uc $m} ||= $Config::Config{$m};
1968 $once_only{$m} = 1;
1e44e2bf 1969 }
1e44e2bf 1970
f1387719 1971# This is too dangerous:
1972# if ($^O eq "next") {
1973# $self->{AR} = "libtool";
1974# $self->{AR_STATIC_ARGS} = "-o";
1975# }
1976# But I leave it as a placeholder
1e44e2bf 1977
f1387719 1978 $self->{AR_STATIC_ARGS} ||= "cr";
1e44e2bf 1979
f1387719 1980 # These should never be needed
1981 $self->{LD} ||= 'ld';
1982 $self->{OBJ_EXT} ||= '.o';
1983 $self->{LIB_EXT} ||= '.a';
1984
1985 $self->{MAP_TARGET} ||= "perl";
1986
1987 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1988
1989 # make a simple check if we find Exporter
1990 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1991 (Exporter.pm not found)"
1992 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1993 $self->{NAME} eq "ExtUtils::MakeMaker";
1e44e2bf 1994
f1387719 1995 # Determine VERSION and VERSION_FROM
1996 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1997 if ($self->{VERSION_FROM}){
1998 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1999 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1e44e2bf 2000 }
f1387719 2001
2002 # strip blanks
2003 if ($self->{VERSION}) {
2004 $self->{VERSION} =~ s/^\s+//;
2005 $self->{VERSION} =~ s/\s+$//;
1e44e2bf 2006 }
1e44e2bf 2007
f1387719 2008 $self->{VERSION} ||= "0.10";
2009 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1e44e2bf 2010
2011
f1387719 2012 # Graham Barr and Paul Marquess had some ideas how to ensure
2013 # version compatibility between the *.pm file and the
2014 # corresponding *.xs file. The bottomline was, that we need an
2015 # XS_VERSION macro that defaults to VERSION:
2016 $self->{XS_VERSION} ||= $self->{VERSION};
1e44e2bf 2017
f1387719 2018 # --- Initialize Perl Binary Locations
2019
2020 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
2021 # will be working versions of perl 5. miniperl has priority over perl
2022 # for PERL to ensure that $(PERL) is usable while building ./ext/*
2023 my ($component,@defpath);
2024 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
2025 push @defpath, $component if defined $component;
1e44e2bf 2026 }
ff0cee69 2027 $self->{PERL} ||=
0ff3fa1a
GS
2028 $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
2029 'perl','perl5',"perl$Config{version}" ],
ff0cee69 2030 \@defpath, $Verbose );
f1387719 2031 # don't check if perl is executable, maybe they have decided to
2032 # supply switches with perl
2033
2034 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
2035 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
2036 unless ($self->{FULLPERL});
4bfb3f62
MS
2037
2038 # Are we building the core?
2039 $self->{PERL_CORE} = 0 unless exists $self->{PERL_CORE};
2040
2041 # How do we run perl?
2042 $self->{PERLRUN} = $self->{PERL};
2043
2044 # How do we run perl when installing libraries?
2045 $self->{PERLRUNINST} .= $self->{PERL}. ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2046
2047 # What extra library dirs do we need when running the tests?
2048 $self->{TEST_LIBS} .= ' -I$(INST_ARCHLIB) -I$(INST_LIB)';
2049
2050 # When building the core, we need to add some helper libs since
2051 # perl's @INC won't work (we're not installed yet).
2052 foreach my $targ (qw(PERLRUN PERLRUNINST TEST_LIBS)) {
2053 $self->{$targ} .= ' -I$(PERL_ARCHLIB) -I$(PERL_LIB)'
2054 if $self->{PERL_CORE};
2055 }
1e44e2bf 2056}
2057
f1387719 2058=item init_others
1e44e2bf 2059
f1387719 2060Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
2061OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
68dc0745 2062MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1e44e2bf 2063
2064=cut
2065
f1387719 2066sub init_others { # --- Initialize Other Attributes
1e44e2bf 2067 my($self) = shift;
1e44e2bf 2068
f1387719 2069 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
2070 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
2071 # undefined. In any case we turn it into an anon array:
1e44e2bf 2072
f1387719 2073 # May check $Config{libs} too, thus not empty.
2074 $self->{LIBS}=[''] unless $self->{LIBS};
f4ae0f5e 2075
a1f8e286 2076 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
f1387719 2077 $self->{LD_RUN_PATH} = "";
2078 my($libs);
2079 foreach $libs ( @{$self->{LIBS}} ){
2080 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
2081 my(@libs) = $self->extliblist($libs);
2082 if ($libs[0] or $libs[1] or $libs[2]){
2083 # LD_RUN_PATH now computed by ExtUtils::Liblist
2084 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
2085 last;
2086 }
2087 }
f4ae0f5e 2088
f1387719 2089 if ( $self->{OBJECT} ) {
2090 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
2091 } else {
2092 # init_dirscan should have found out, if we have C files
2093 $self->{OBJECT} = "";
2094 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1e44e2bf 2095 }
f1387719 2096 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
2097 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
2098 $self->{PERLMAINCC} ||= '$(CC)';
2099 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1e44e2bf 2100
f1387719 2101 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
2102 # the 'dynamic' section of MM. We don't have this problem with
2103 # 'static', since we either must use it (%Config says we can't
2104 # use dynamic loading) or the caller asked for it explicitly.
2105 if (!$self->{LINKTYPE}) {
2106 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
2107 ? 'static'
2108 : ($Config::Config{usedl} ? 'dynamic' : 'static');
2109 };
2110
2111 # These get overridden for VMS and maybe some other systems
55497cff 2112 $self->{NOOP} ||= '$(SHELL) -c true';
f1387719 2113 $self->{FIRST_MAKEFILE} ||= "Makefile";
2114 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
2115 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
2116 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
2117 $self->{RM_F} ||= "rm -f";
2118 $self->{RM_RF} ||= "rm -rf";
2119 $self->{TOUCH} ||= "touch";
68dc0745 2120 $self->{TEST_F} ||= "test -f";
f1387719 2121 $self->{CP} ||= "cp";
2122 $self->{MV} ||= "mv";
2123 $self->{CHMOD} ||= "chmod";
2124 $self->{UMASK_NULL} ||= "umask 0";
68dc0745 2125 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1e44e2bf 2126}
2127
f1387719 2128=item install (o)
1e44e2bf 2129
f1387719 2130Defines the install target.
1e44e2bf 2131
2132=cut
2133
f1387719 2134sub install {
2135 my($self, %attribs) = @_;
1e44e2bf 2136 my(@m);
a5f75d66 2137
f1387719 2138 push @m, q{
2139install :: all pure_install doc_install
1e44e2bf 2140
f1387719 2141install_perl :: all pure_perl_install doc_perl_install
1e44e2bf 2142
f1387719 2143install_site :: all pure_site_install doc_site_install
1e44e2bf 2144
f1387719 2145install_ :: install_site
2146 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2147
f1387719 2148pure_install :: pure_$(INSTALLDIRS)_install
1e44e2bf 2149
f1387719 2150doc_install :: doc_$(INSTALLDIRS)_install
2151 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1e44e2bf 2152
f1387719 2153pure__install : pure_site_install
2154 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2155
f1387719 2156doc__install : doc_site_install
2157 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 2158
f1387719 2159pure_perl_install ::
2160 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2161 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2162 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2163 $(INST_LIB) $(INSTALLPRIVLIB) \
2164 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
2165 $(INST_BIN) $(INSTALLBIN) \
2166 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2167 $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
2168 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719 2169 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2170 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2171 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2172 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1e44e2bf 2173
1e44e2bf 2174
f1387719 2175pure_site_install ::
2176 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2177 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
2178 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
2179 $(INST_LIB) $(INSTALLSITELIB) \
2180 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
2181 $(INST_BIN) $(INSTALLBIN) \
2182 $(INST_SCRIPT) $(INSTALLSCRIPT) \
cae6c631
JD
2183 $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
2184 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
f1387719 2185 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2186 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2187 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2188 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1e44e2bf 2189
f1387719 2190doc_perl_install ::
082ab410 2191 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2192 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2193 "Module" "$(NAME)" \
f1387719 2194 "installed into" "$(INSTALLPRIVLIB)" \
2195 LINKTYPE "$(LINKTYPE)" \
2196 VERSION "$(VERSION)" \
2197 EXE_FILES "$(EXE_FILES)" \
2198 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2199
f1387719 2200doc_site_install ::
082ab410 2201 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2202 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2203 "Module" "$(NAME)" \
f1387719 2204 "installed into" "$(INSTALLSITELIB)" \
2205 LINKTYPE "$(LINKTYPE)" \
2206 VERSION "$(VERSION)" \
2207 EXE_FILES "$(EXE_FILES)" \
2208 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2209
f1387719 2210};
1e44e2bf 2211
f1387719 2212 push @m, q{
2213uninstall :: uninstall_from_$(INSTALLDIRS)dirs
f4ae0f5e 2214
f1387719 2215uninstall_from_perldirs ::
2216 }.$self->{NOECHO}.
2217 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1e44e2bf 2218
f1387719 2219uninstall_from_sitedirs ::
2220 }.$self->{NOECHO}.
2221 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2222};
1e44e2bf 2223
f1387719 2224 join("",@m);
2225}
1e44e2bf 2226
f1387719 2227=item installbin (o)
1e44e2bf 2228
85fe4bb3 2229Defines targets to make and to install EXE_FILES.
1e44e2bf 2230
f1387719 2231=cut
1e44e2bf 2232
f1387719 2233sub installbin {
2234 my($self) = shift;
2235 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2236 return "" unless @{$self->{EXE_FILES}};
2237 my(@m, $from, $to, %fromto, @to);
2238 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2239 for $from (@{$self->{EXE_FILES}}) {
2240 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2241 local($_) = $path; # for backwards compatibility
2242 $to = $self->libscan($path);
2243 print "libscan($from) => '$to'\n" if ($Verbose >=2);
2244 $fromto{$from}=$to;
2245 }
2246 @to = values %fromto;
84902520 2247 push(@m, qq{
f1387719 2248EXE_FILES = @{$self->{EXE_FILES}}
1e44e2bf 2249
f5cd9d9c 2250} . ($Is_Win32
4bfb3f62 2251 ? q{FIXIN = $(PERLRUN) \
f5cd9d9c 2252 -e "system qq[pl2bat.bat ].shift"
4bfb3f62 2253} : q{FIXIN = $(PERLRUN) -MExtUtils::MakeMaker \
84902520 2254 -e "MY->fixin(shift)"
f5cd9d9c 2255}).qq{
85fe4bb3 2256pure_all :: @to
2d6e8844 2257 $self->{NOECHO}\$(NOOP)
1e44e2bf 2258
f1387719 2259realclean ::
2260 $self->{RM_F} @to
84902520 2261});
1e44e2bf 2262
f1387719 2263 while (($from,$to) = each %fromto) {
2264 last unless defined $from;
2265 my $todir = dirname($to);
2266 push @m, "
84902520 2267$to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
f1387719 2268 $self->{NOECHO}$self->{RM_F} $to
2269 $self->{CP} $from $to
84902520 2270 \$(FIXIN) $to
2366100d 2271 -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
f1387719 2272";
1e44e2bf 2273 }
f1387719 2274 join "", @m;
2275}
1e44e2bf 2276
f1387719 2277=item libscan (o)
1e44e2bf 2278
f1387719 2279Takes a path to a file that is found by init_dirscan and returns false
2280if we don't want to include this file in the library. Mainly used to
2281exclude RCS, CVS, and SCCS directories from installation.
1e44e2bf 2282
f1387719 2283=cut
1e44e2bf 2284
f1387719 2285# ';
1e44e2bf 2286
f1387719 2287sub libscan {
2288 my($self,$path) = @_;
2289 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2290 $path;
1e44e2bf 2291}
2292
f4ae0f5e 2293=item linkext (o)
1e44e2bf 2294
f4ae0f5e 2295Defines the linkext target which in turn defines the LINKTYPE.
1e44e2bf 2296
2297=cut
2298
2299sub linkext {
2300 my($self, %attribs) = @_;
1e44e2bf 2301 # LINKTYPE => static or dynamic or ''
2302 my($linktype) = defined $attribs{LINKTYPE} ?
2303 $attribs{LINKTYPE} : '$(LINKTYPE)';
2304 "
2305linkext :: $linktype
f4ae0f5e 2306 $self->{NOECHO}\$(NOOP)
1e44e2bf 2307";
2308}
2309
f1387719 2310=item lsdir
1e44e2bf 2311
f1387719 2312Takes as arguments a directory name and a regular expression. Returns
2313all entries in the directory that match the regular expression.
1e44e2bf 2314
2315=cut
2316
f1387719 2317sub lsdir {
2318 my($self) = shift;
2319 my($dir, $regex) = @_;
2320 my(@ls);
2321 my $dh = new DirHandle;
2322 $dh->open($dir || ".") or return ();
2323 @ls = $dh->read;
2324 $dh->close;
2325 @ls = grep(/$regex/, @ls) if $regex;
2326 @ls;
2327}
2328
2329=item macro (o)
2330
2331Simple subroutine to insert the macros defined by the macro attribute
2332into the Makefile.
2333
2334=cut
2335
2336sub macro {
1e44e2bf 2337 my($self,%attribs) = @_;
f1387719 2338 my(@m,$key,$val);
2339 while (($key,$val) = each %attribs){
2340 last unless defined $key;
2341 push @m, "$key = $val\n";
1e44e2bf 2342 }
f1387719 2343 join "", @m;
2344}
1e44e2bf 2345
f1387719 2346=item makeaperl (o)
1e44e2bf 2347
f1387719 2348Called by staticmake. Defines how to write the Makefile to produce a
2349static new perl.
2350
55497cff 2351By default the Makefile produced includes all the static extensions in
2352the perl library. (Purified versions of library files, e.g.,
2353DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2354
f1387719 2355=cut
2356
2357sub makeaperl {
2358 my($self, %attribs) = @_;
2359 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2360 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1e44e2bf 2361 my(@m);
f1387719 2362 push @m, "
2363# --- MakeMaker makeaperl section ---
2364MAP_TARGET = $target
2365FULLPERL = $self->{FULLPERL}
2366";
2367 return join '', @m if $self->{PARENT};
1e44e2bf 2368
f1387719 2369 my($dir) = join ":", @{$self->{DIR}};
1e44e2bf 2370
f1387719 2371 unless ($self->{MAKEAPERL}) {
2372 push @m, q{
2373$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2374 $(MAKE) -f $(MAKE_APERL_FILE) $@
1e44e2bf 2375
f1387719 2376$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2377 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
4bfb3f62 2378 }.$self->{NOECHO}.q{$(PERLRUNINST) \
f1387719 2379 Makefile.PL DIR=}, $dir, q{ \
2380 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2381 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
1e44e2bf 2382
f1387719 2383 foreach (@ARGV){
2384 if( /\s/ ){
2385 s/=(.*)/='$1'/;
2386 }
2387 push @m, " \\\n\t\t$_";
2388 }
2389# push @m, map( " \\\n\t\t$_", @ARGV );
2390 push @m, "\n";
1e44e2bf 2391
f1387719 2392 return join '', @m;
2393 }
1e44e2bf 2394
1e44e2bf 2395
1e44e2bf 2396
f1387719 2397 my($cccmd, $linkcmd, $lperl);
1e44e2bf 2398
1e44e2bf 2399
f1387719 2400 $cccmd = $self->const_cccmd($libperl);
2401 $cccmd =~ s/^CCCMD\s*=\s*//;
2402 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
bab2b58e 2403 $cccmd .= " $Config::Config{cccdlflags}"
042ade60 2404 if ($Config::Config{useshrplib} eq 'true');
f1387719 2405 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
1e44e2bf 2406
f1387719 2407 # The front matter of the linkcommand...
2408 $linkcmd = join ' ', "\$(CC)",
5869b1f1 2409 grep($_, @Config{qw(ldflags ccdlflags)});
f1387719 2410 $linkcmd =~ s/\s+/ /g;
93f9cb4b 2411 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
1e44e2bf 2412
f1387719 2413 # Which *.a files could we make use of...
2414 local(%static);
2415 require File::Find;
2416 File::Find::find(sub {
2417 return unless m/\Q$self->{LIB_EXT}\E$/;
2418 return if m/^libperl/;
55497cff 2419 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2420 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
1e44e2bf 2421
f1387719 2422 if( exists $self->{INCLUDE_EXT} ){
2423 my $found = 0;
2424 my $incl;
2425 my $xx;
2426
4f44ac69 2427 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719 2428 $xx =~ s,/?$_,,;
2429 $xx =~ s,/,::,g;
2430
2431 # Throw away anything not explicitly marked for inclusion.
2432 # DynaLoader is implied.
2433 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2434 if( $xx eq $incl ){
2435 $found++;
2436 last;
2437 }
2438 }
2439 return unless $found;
2440 }
2441 elsif( exists $self->{EXCLUDE_EXT} ){
2442 my $excl;
2443 my $xx;
1e44e2bf 2444
4f44ac69 2445 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
f1387719 2446 $xx =~ s,/?$_,,;
2447 $xx =~ s,/,::,g;
1e44e2bf 2448
f1387719 2449 # Throw away anything explicitly marked for exclusion
2450 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2451 return if( $xx eq $excl );
2452 }
2453 }
2454
2455 # don't include the installed version of this extension. I
2456 # leave this line here, although it is not necessary anymore:
2457 # I patched minimod.PL instead, so that Miniperl.pm won't
2458 # enclude duplicates
2459
2460 # Once the patch to minimod.PL is in the distribution, I can
2461 # drop it
4f44ac69 2462 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
f1387719 2463 use Cwd 'cwd';
2464 $static{cwd() . "/" . $_}++;
2465 }, grep( -d $_, @{$searchdirs || []}) );
2466
2467 # We trust that what has been handed in as argument, will be buildable
2468 $static = [] unless $static;
2469 @static{@{$static}} = (1) x @{$static};
2470
2471 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2472 for (sort keys %static) {
4f44ac69 2473 next unless /\Q$self->{LIB_EXT}\E\z/;
f1387719 2474 $_ = dirname($_) . "/extralibs.ld";
2475 push @$extra, $_;
1e44e2bf 2476 }
1e44e2bf 2477
f1387719 2478 grep(s/^/-I/, @{$perlinc || []});
1e44e2bf 2479
f1387719 2480 $target = "perl" unless $target;
2481 $tmp = "." unless $tmp;
1e44e2bf 2482
f1387719 2483# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2484# regenerate the Makefiles, MAP_STATIC and the dependencies for
2485# extralibs.all are computed correctly
2486 push @m, "
2487MAP_LINKCMD = $linkcmd
2488MAP_PERLINC = @{$perlinc || []}
2489MAP_STATIC = ",
2490join(" \\\n\t", reverse sort keys %static), "
1e44e2bf 2491
9c839522 2492MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib}
f1387719 2493";
2494
2495 if (defined $libperl) {
2496 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2497 }
2498 unless ($libperl && -f $lperl) { # Ilya's code...
2499 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
3f73c567 2500 $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
f1387719 2501 $libperl ||= "libperl$self->{LIB_EXT}";
2502 $libperl = "$dir/$libperl";
2503 $lperl ||= "libperl$self->{LIB_EXT}";
2504 $lperl = "$dir/$lperl";
ff0cee69 2505
2506 if (! -f $libperl and ! -f $lperl) {
2507 # We did not find a static libperl. Maybe there is a shared one?
2508 if ($^O eq 'solaris' or $^O eq 'sunos') {
2509 $lperl = $libperl = "$dir/$Config::Config{libperl}";
2510 # SUNOS ld does not take the full path to a shared library
2511 $libperl = '' if $^O eq 'sunos';
2512 }
2513 }
2514
f1387719 2515 print STDOUT "Warning: $libperl not found
2516 If you're going to build a static perl binary, make sure perl is installed
2517 otherwise ignore this warning\n"
2518 unless (-f $lperl || defined($self->{PERL_SRC}));
2519 }
1e44e2bf 2520
f1387719 2521 push @m, "
2522MAP_LIBPERL = $libperl
2523";
1e44e2bf 2524
f1387719 2525 push @m, "
2526\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2527 $self->{NOECHO}$self->{RM_F} \$\@
2528 $self->{NOECHO}\$(TOUCH) \$\@
2529";
1e44e2bf 2530
f1387719 2531 my $catfile;
2532 foreach $catfile (@$extra){
2533 push @m, "\tcat $catfile >> \$\@\n";
1e44e2bf 2534 }
ff0cee69 2535 # SUNOS ld does not take the full path to a shared library
2536 my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
1e44e2bf 2537
ff0cee69 2538push @m, "
f1387719 2539\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
4194d490 2540 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
f1387719 2541 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2542 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2543 $self->{NOECHO}echo 'To remove the intermediate files say'
2544 $self->{NOECHO}echo ' make -f $makefilename map_clean'
1e44e2bf 2545
f1387719 2546$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2547";
2548 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
1e44e2bf 2549
f1387719 2550 push @m, qq{
2551$tmp/perlmain.c: $makefilename}, q{
2552 }.$self->{NOECHO}.q{echo Writing $@
68dc0745 2553 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
4f44ac69 2554 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
1e44e2bf 2555
f1387719 2556};
39e571d4
LM
2557 push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2558} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2559
1e44e2bf 2560
f1387719 2561 push @m, q{
2562doc_inst_perl:
2563 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
082ab410 2564 -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
7b8d334a 2565 -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2566 "Perl binary" "$(MAP_TARGET)" \
f1387719 2567 MAP_STATIC "$(MAP_STATIC)" \
2568 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2569 MAP_LIBPERL "$(MAP_LIBPERL)" \
2570 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2571
f1387719 2572};
1e44e2bf 2573
f1387719 2574 push @m, q{
2575inst_perl: pure_inst_perl doc_inst_perl
1e44e2bf 2576
f1387719 2577pure_inst_perl: $(MAP_TARGET)
2578 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
1e44e2bf 2579
f1387719 2580clean :: map_clean
2581
2582map_clean :
2583 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2584};
2585
2586 join '', @m;
1e44e2bf 2587}
2588
f1387719 2589=item makefile (o)
1e44e2bf 2590
f1387719 2591Defines how to rewrite the Makefile.
1e44e2bf 2592
2593=cut
2594
f1387719 2595sub makefile {
2596 my($self) = shift;
2597 my @m;
2598 # We do not know what target was originally specified so we
2599 # must force a manual rerun to be sure. But as it should only
2600 # happen very rarely it is not a significant problem.
2601 push @m, '
2602$(OBJECT) : $(FIRST_MAKEFILE)
2603' if $self->{OBJECT};
1e44e2bf 2604
f1387719 2605 push @m, q{
2606# We take a very conservative approach here, but it\'s worth it.
2607# We move Makefile to Makefile.old here to avoid gnu make looping.
2608}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2609 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2610 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
28e8609d 2611 -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
68dc0745 2612 -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2613 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
4bfb3f62 2614 $(PERLRUN) Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
68dc0745 2615 }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2616 }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <=="
2617 false
1e44e2bf 2618
f1387719 2619# To change behavior to :: would be nice, but would break Tk b9.02
2620# so you find such a warning below the dist target.
2621#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2622# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
1e44e2bf 2623};
2624
f1387719 2625 join "", @m;
1e44e2bf 2626}
2627
f4ae0f5e 2628=item manifypods (o)
1e44e2bf 2629
f4ae0f5e 2630Defines targets and routines to translate the pods into manpages and
2631put them into the INST_* directories.
1e44e2bf 2632
2633=cut
2634
2635sub manifypods {
2636 my($self, %attribs) = @_;
f9c559d8
A
2637 return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2638 %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1e44e2bf 2639 my($dist);
2640 my($pod2man_exe);
2641 if (defined $self->{PERL_SRC}) {
2642 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2643 } else {
f1387719 2644 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1e44e2bf 2645 }
cae6c631 2646 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
23614c1f
JH
2647 # Maybe a build by uninstalled Perl?
2648 $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
2649 }
2650 unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
1e44e2bf 2651 # No pod2man but some MAN3PODS to be installed
2652 print <<END;
2653
2654Warning: I could not locate your pod2man program. Please make sure,
2655 your pod2man program is in your PATH before you execute 'make'
2656
2657END
2658 $pod2man_exe = "-S pod2man";
2659 }
2660 my(@m);
2661 push @m,
2662qq[POD2MAN_EXE = $pod2man_exe\n],
2366100d
A
2663qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2664q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2665 $self->{MAKEFILE}, q[";' \\
1e44e2bf 2666-e 'print "Manifying $$m{$$_}\n";' \\
4bfb3f62 2667-e 'system(q[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2366100d 2668-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1e44e2bf 2669];
f9c559d8 2670 push @m, "\nmanifypods : pure_all ";
1e44e2bf 2671 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
f1387719 2672
2673 push(@m,"\n");
2674 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2675 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2676 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
1e44e2bf 2677 }
f1387719 2678 join('', @m);
1e44e2bf 2679}
2680
f1387719 2681=item maybe_command
1e44e2bf 2682
f1387719 2683Returns true, if the argument is likely to be a command.
1e44e2bf 2684
2685=cut
2686
f1387719 2687sub maybe_command {
2688 my($self,$file) = @_;
2689 return $file if -x $file && ! -d $file;
2690 return;
1e44e2bf 2691}
2692
f1387719 2693=item maybe_command_in_dirs
1e44e2bf 2694
f1387719 2695method under development. Not yet used. Ask Ilya :-)
1e44e2bf 2696
2697=cut
2698
f1387719 2699sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2700# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2701 my($self, $names, $dirs, $trace, $ver) = @_;
2702 my($name, $dir);
2703 foreach $dir (@$dirs){
2704 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2705 foreach $name (@$names){
2706 my($abs,$tryabs);
2707 if ($self->file_name_is_absolute($name)) { # /foo/bar
2708 $abs = $name;
2709 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2710 $abs = $self->catfile($dir, $name);
2711 } else { # foo/bar
2712 $abs = $self->catfile($self->curdir, $name);
2713 }
2714 print "Checking $abs for $name\n" if ($trace >= 2);
2715 next unless $tryabs = $self->maybe_command($abs);
2716 print "Substituting $tryabs instead of $abs\n"
2717 if ($trace >= 2 and $tryabs ne $abs);
2718 $abs = $tryabs;
2719 if (defined $ver) {
2720 print "Executing $abs\n" if ($trace >= 2);
2721 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2722 print "Using PERL=$abs\n" if $trace;
2723 return $abs;
2724 }
2725 } else { # Do not look for perl
2726 return $abs;
2727 }
2728 }
1e44e2bf 2729 }
1e44e2bf 2730}
2731
f1387719 2732=item needs_linking (o)
1e44e2bf 2733
f1387719 2734Does this module need linking? Looks into subdirectory objects (see
2735also has_link_code())
1e44e2bf 2736
2737=cut
2738
f1387719 2739sub needs_linking {
2740 my($self) = shift;
2741 my($child,$caller);
2742 $caller = (caller(0))[3];
2743 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2744 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2745 if ($self->has_link_code or $self->{MAKEAPERL}){
2746 $self->{NEEDS_LINKING} = 1;
2747 return 1;
1e44e2bf 2748 }
f1387719 2749 foreach $child (keys %{$self->{CHILDREN}}) {
2750 if ($self->{CHILDREN}->{$child}->needs_linking) {
2751 $self->{NEEDS_LINKING} = 1;
2752 return 1;
2753 }
1e44e2bf 2754 }
f1387719 2755 return $self->{NEEDS_LINKING} = 0;
1e44e2bf 2756}
2757
f1387719 2758=item nicetext
1e44e2bf 2759
f1387719 2760misnamed method (will have to be changed). The MM_Unix method just
2761returns the argument without further processing.
2762
2763On VMS used to insure that colons marking targets are preceded by
2764space - most Unix Makes don't need this, but it's necessary under VMS
2765to distinguish the target delimiter from a colon appearing as part of
2766a filespec.
1e44e2bf 2767
2768=cut
2769
f1387719 2770sub nicetext {
2771 my($self,$text) = @_;
2772 $text;
2773}
1e44e2bf 2774
f1387719 2775=item parse_version
1e44e2bf 2776
5a5fd53e
GS
2777parse a file and return what you think is $VERSION in this file set to.
2778It will return the string "undef" if it can't figure out what $VERSION
2779is.
1e44e2bf 2780
f1387719 2781=cut
2782
2783sub parse_version {
2784 my($self,$parsefile) = @_;
2785 my $result;
2786 local *FH;
2787 local $/ = "\n";
2788 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2789 my $inpod = 0;
2790 while (<FH>) {
2791 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
f05db7a1 2792 next if $inpod || /^\s*#/;
f1387719 2793 chop;
84902520
TB
2794 # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2795 next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
dbc738d9 2796 my $eval = qq{
2797 package ExtUtils::MakeMaker::_version;
a1f8e286 2798 no strict;
bab2b58e 2799
84902520
TB
2800 local $1$2;
2801 \$$2=undef; do {
bab2b58e 2802 $_
84902520 2803 }; \$$2
dbc738d9 2804 };
db376a24 2805 no warnings;
84902520 2806 $result = eval($eval);
5a5fd53e 2807 warn "Could not eval '$eval' in $parsefile: $@" if $@;
84902520 2808 $result = "undef" unless defined $result;
f1387719 2809 last;
2810 }
2811 close FH;
2812 return $result;
1e44e2bf 2813}
2814
8f993c78
MN
2815=item parse_abstract
2816
2817parse a file and return what you think is the ABSTRACT
2818
2819=cut
2820
2821sub parse_abstract {
2822 my($self,$parsefile) = @_;
2823 my $result;
2824 local *FH;
2825 local $/ = "\n";
2826 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2827 my $inpod = 0;
2828 my $package = $self->{DISTNAME};
cbadcae4 2829 $package =~ s/-/::/g;
8f993c78
MN
2830 while (<FH>) {
2831 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2832 next if !$inpod;
2833 chop;
2834 next unless /^($package\s-\s)(.*)/;
2835 $result = $2;
2836 last;
2837 }
2838 close FH;
2839 return $result;
2840}
1e44e2bf 2841
f1387719 2842=item pasthru (o)
2843
2844Defines the string that is passed to recursive make calls in
2845subdirectories.
1e44e2bf 2846
2847=cut
2848
f1387719 2849sub pasthru {
1e44e2bf 2850 my($self) = shift;
f1387719 2851 my(@m,$key);
1e44e2bf 2852
f1387719 2853 my(@pasthru);
bbce6d69 2854 my($sep) = $Is_VMS ? ',' : '';
2855 $sep .= "\\\n\t";
1e44e2bf 2856
289e7e34 2857 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)) {
f1387719 2858 push @pasthru, "$key=\"\$($key)\"";
2859 }
f4ae0f5e 2860
289e7e34
JH
2861 foreach $key (qw(DEFINE INC)) {
2862 push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
2863 }
2864
bbce6d69 2865 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
f1387719 2866 join "", @m;
2867}
1e44e2bf 2868
f1387719 2869=item path
f4ae0f5e 2870
f1387719 2871Takes no argument, returns the environment variable PATH as an array.
1e44e2bf 2872
f1387719 2873=cut
2874
2875sub path {
2876 my($self) = @_;
39e571d4 2877 my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
f1387719 2878 my $path = $ENV{PATH};
2879 $path =~ s:\\:/:g if $Is_OS2;
2880 my @path = split $path_sep, $path;
93f9cb4b 2881 foreach(@path) { $_ = '.' if $_ eq '' }
2882 @path;
1e44e2bf 2883}
2884
f1387719 2885=item perl_script
1e44e2bf 2886
f1387719 2887Takes one argument, a file name, and returns the file name, if the
2888argument is likely to be a perl script. On MM_Unix this is true for
2889any ordinary, readable file.
1e44e2bf 2890
2891=cut
2892
f1387719 2893sub perl_script {
2894 my($self,$file) = @_;
2895 return $file if -r $file && -f _;
2896 return;
1e44e2bf 2897}
2898
f1387719 2899=item perldepend (o)
1e44e2bf 2900
f1387719 2901Defines the dependency from all *.h files that come with the perl
2902distribution.
1e44e2bf 2903
2904=cut
2905
f1387719 2906sub perldepend {
1e44e2bf 2907 my($self) = shift;
f1387719 2908 my(@m);
2909 push @m, q{
2910# Check for unpropogated config.sh changes. Should never happen.
2911# We do NOT just update config.h because that is not sufficient.
2912# An out of date config.h is not fatal but complains loudly!
2913$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2914 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2915
2916$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2917 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2918 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2919} if $self->{PERL_SRC};
2920
2921 return join "", @m unless $self->needs_linking;
2922
1e44e2bf 2923 push @m, q{
f1387719 2924PERL_HDRS = \
54fc9134
GS
2925 $(PERL_INC)/EXTERN.h \
2926 $(PERL_INC)/INTERN.h \
2927 $(PERL_INC)/XSUB.h \
2928 $(PERL_INC)/av.h \
2929 $(PERL_INC)/cc_runtime.h \
2930 $(PERL_INC)/config.h \
2931 $(PERL_INC)/cop.h \
2932 $(PERL_INC)/cv.h \
2933 $(PERL_INC)/dosish.h \
2934 $(PERL_INC)/embed.h \
2935 $(PERL_INC)/embedvar.h \
2936 $(PERL_INC)/fakethr.h \
2937 $(PERL_INC)/form.h \
2938 $(PERL_INC)/gv.h \
2939 $(PERL_INC)/handy.h \
2940 $(PERL_INC)/hv.h \
2941 $(PERL_INC)/intrpvar.h \
2942 $(PERL_INC)/iperlsys.h \
2943 $(PERL_INC)/keywords.h \
2944 $(PERL_INC)/mg.h \
2945 $(PERL_INC)/nostdio.h \
54fc9134
GS
2946 $(PERL_INC)/op.h \
2947 $(PERL_INC)/opcode.h \
2948 $(PERL_INC)/opnames.h \
2949 $(PERL_INC)/patchlevel.h \
2950 $(PERL_INC)/perl.h \
2951 $(PERL_INC)/perlapi.h \
2952 $(PERL_INC)/perlio.h \
2953 $(PERL_INC)/perlsdio.h \
2954 $(PERL_INC)/perlsfio.h \
2955 $(PERL_INC)/perlvars.h \
2956 $(PERL_INC)/perly.h \
2957 $(PERL_INC)/pp.h \
2958 $(PERL_INC)/pp_proto.h \
2959 $(PERL_INC)/proto.h \
2960 $(PERL_INC)/regcomp.h \
2961 $(PERL_INC)/regexp.h \
2962 $(PERL_INC)/regnodes.h \
2963 $(PERL_INC)/scope.h \
2964 $(PERL_INC)/sv.h \
2965 $(PERL_INC)/thrdvar.h \
2966 $(PERL_INC)/thread.h \
2967 $(PERL_INC)/unixish.h \
2968 $(PERL_INC)/utf8.h \
2969 $(PERL_INC)/util.h \
2970 $(PERL_INC)/warnings.h
f1387719 2971
2972$(OBJECT) : $(PERL_HDRS)
2973} if $self->{OBJECT};
2974
2975 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
2976
2977 join "\n", @m;
1e44e2bf 2978}
2979
8f993c78
MN
2980=item ppd
2981
2982Defines target that creates a PPD (Perl Package Description) file
2983for a binary distribution.
2984
2985=cut
2986
2987sub ppd {
2988 my($self) = @_;
2989 my(@m);
2990 if ($self->{ABSTRACT_FROM}){
2991 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2992 Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
2993 }
2994 my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
2995 push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
2996 push(@m, "ppd:\n");
2997 push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
2998 push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
2999 my $abstract = $self->{ABSTRACT};
3aa35033 3000 $abstract =~ s/\n/\\n/sg;
8f993c78
MN
3001 $abstract =~ s/</&lt;/g;
3002 $abstract =~ s/>/&gt;/g;
3003 push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
3004 my ($author) = $self->{AUTHOR};
3aa35033
GS
3005 $author =~ s/</&lt;/g;
3006 $author =~ s/>/&gt;/g;
8f993c78
MN
3007 $author =~ s/@/\\@/g;
3008 push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
3009 push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
3010 my ($prereq);
3011 foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
3012 my $pre_req = $prereq;
3013 $pre_req =~ s/::/-/g;
80252599
GS
3014 my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
3015 push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
8f993c78
MN
3016 }
3017 push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
80252599 3018 push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
8f993c78
MN
3019 my ($bin_location) = $self->{BINARY_LOCATION};
3020 $bin_location =~ s/\\/\\\\/g;
3021 if ($self->{PPM_INSTALL_SCRIPT}) {
3022 if ($self->{PPM_INSTALL_EXEC}) {
3023 push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3024 }
3025 else {
3026 push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
3027 }
3028 }
3029 push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
3030 push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
3031 push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
3032
3033 join("", @m);
3034}
3035
2366100d
A
3036=item perm_rw (o)
3037
3038Returns the attribute C<PERM_RW> or the string C<644>.
3039Used as the string that is passed
3040to the C<chmod> command to set the permissions for read/writeable files.
32504223 3041MakeMaker chooses C<644> because it has turned out in the past that
de592821 3042relying on the umask provokes hard-to-track bug reports.
2366100d
A
3043When the return value is used by the perl function C<chmod>, it is
3044interpreted as an octal value.
3045
3046=cut
3047
3048sub perm_rw {
32504223 3049 shift->{PERM_RW} || "644";
2366100d
A
3050}
3051
3052=item perm_rwx (o)
3053
32504223 3054Returns the attribute C<PERM_RWX> or the string C<755>,
2366100d
A
3055i.e. the string that is passed
3056to the C<chmod> command to set the permissions for executable files.
3057See also perl_rw.
3058
3059=cut
3060
3061sub perm_rwx {
32504223 3062 shift->{PERM_RWX} || "755";
2366100d
A
3063}
3064
f1387719 3065=item pm_to_blib
1e44e2bf 3066
f1387719 3067Defines target that copies all files in the hash PM to their
55497cff 3068destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
1e44e2bf 3069
3070=cut
3071
158e3910
JH
3072sub _pm_to_blib_flush {
3073 my ($self, $autodir, $rr, $ra, $rl) = @_;
3074 $$rr .=
3075q{ }.$self->{NOECHO}.q[$(PERLRUNINST) -MExtUtils::Install \
3076 -e "pm_to_blib({qw{].qq[@$ra].q[}},'].$autodir.q{','$(PM_FILTER)')"
3077};
3078 @$ra = ();
3079 $$rl = 0;
3080}
3081
f1387719 3082sub pm_to_blib {
3083 my $self = shift;
3084 my($autodir) = $self->catdir('$(INST_LIB)','auto');
d2fa5cc0 3085 my $r = q{
f1387719 3086pm_to_blib: $(TO_INST_PM)
1e44e2bf 3087};
d2fa5cc0
JH
3088 my %pm_to_blib = %{$self->{PM}};
3089 my @a;
3090 my $l;
d2fa5cc0
JH
3091 while (my ($pm, $blib) = each %pm_to_blib) {
3092 my $la = length $pm;
3093 my $lb = length $blib;
158e3910
JH
3094 if ($l + $la + $lb + @a / 2 > 200) { # limit line length
3095 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0
JH
3096 }
3097 push @a, $pm, $blib;
3098 $l += $la + $lb;
3099 }
158e3910 3100 _pm_to_blib_flush($self, $autodir, \$r, \@a, \$l);
d2fa5cc0 3101 return $r.q{ }.$self->{NOECHO}.q{$(TOUCH) $@};
1e44e2bf 3102}
3103
f1387719 3104=item post_constants (o)
1e44e2bf 3105
f1387719 3106Returns an empty string per default. Dedicated to overrides from
3107within Makefile.PL after all constants have been defined.
1e44e2bf 3108
3109=cut
3110
f1387719 3111sub post_constants{
3112 my($self) = shift;
3113 "";
3114}
1e44e2bf 3115
f1387719 3116=item post_initialize (o)
1e44e2bf 3117
1fef88e7 3118Returns an empty string per default. Used in Makefile.PLs to add some
f1387719 3119chunk of text to the Makefile after the object is initialized.
1e44e2bf 3120
f1387719 3121=cut
1e44e2bf 3122
f1387719 3123sub post_initialize {
3124 my($self) = shift;
3125 "";
3126}
1e44e2bf 3127
f1387719 3128=item postamble (o)
1e44e2bf 3129
f1387719 3130Returns an empty string. Can be used in Makefile.PLs to write some
3131text to the Makefile at the end.
1e44e2bf 3132
f1387719 3133=cut
1e44e2bf 3134
f1387719 3135sub postamble {
3136 my($self) = shift;
3137 "";
3138}
1e44e2bf 3139
f1387719 3140=item prefixify
1e44e2bf 3141
f1387719 3142Check a path variable in $self from %Config, if it contains a prefix,
3143and replace it with another one.
1e44e2bf 3144
f1387719 3145Takes as arguments an attribute name, a search prefix and a
3146replacement prefix. Changes the attribute in the object.
1e44e2bf 3147
f1387719 3148=cut
1e44e2bf 3149
f1387719 3150sub prefixify {
3151 my($self,$var,$sprefix,$rprefix) = @_;
3152 $self->{uc $var} ||= $Config{lc $var};
3153 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
a3a27754 3154 $self->{uc $var} =~ s,^\Q$sprefix\E(?=/|\z),$rprefix,s;
f1387719 3155}
1e44e2bf 3156
f1387719 3157=item processPL (o)
1e44e2bf 3158
f1387719 3159Defines targets to run *.PL files.
1e44e2bf 3160
f1387719 3161=cut
1e44e2bf 3162
f1387719 3163sub processPL {
3164 my($self) = shift;
3165 return "" unless $self->{PL_FILES};
3166 my(@m, $plfile);
3167 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3aa35033
GS
3168 my $list = ref($self->{PL_FILES}->{$plfile})
3169 ? $self->{PL_FILES}->{$plfile}
3170 : [$self->{PL_FILES}->{$plfile}];
4194d490 3171 my $target;
3aa35033 3172 foreach $target (@$list) {
f1387719 3173 push @m, "
3aa35033 3174all :: $target
2d6e8844 3175 $self->{NOECHO}\$(NOOP)
1e44e2bf 3176
3aa35033 3177$target :: $plfile
4bfb3f62 3178 \$(PERLRUNINST) $plfile $target
f1387719 3179";
3aa35033 3180 }
f1387719 3181 }
3182 join "", @m;
1e44e2bf 3183}
3184
fa048ccd
JH
3185=item quote_paren
3186
3187Backslashes parentheses C<()> in command line arguments.
3188Doesn't handle recursive Makefile C<$(...)> constructs,
3189but handles simple ones.
3190
3191=cut
3192
3193sub quote_paren {
3194 local $_ = shift;
3195 s/\$\((.+?)\)/\$\\\\($1\\\\)/g; # protect $(...)
3196 s/(?<!\\)([()])/\\$1/g; # quote unprotected
3197 s/\$\\\\\((.+?)\\\\\)/\$($1)/g; # unprotect $(...)
3198 return $_;
3199}
3200
f1387719 3201=item realclean (o)
1e44e2bf 3202
f1387719 3203Defines the realclean target.
1e44e2bf 3204
3205=cut
3206
f1387719 3207sub realclean {
3208 my($self, %attribs) = @_;
3209 my(@m);
3210 push(@m,'
3211# Delete temporary files (via clean) and also delete installed files
3212realclean purge :: clean
3213');
3214 # realclean subdirectories first (already cleaned)
882a4479
GS
3215 my $sub = ($Is_Win32 && Win32::IsWin95()) ?
3216 "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
3217 "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
f1387719 3218 foreach(@{$self->{DIR}}){
3219 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
3220 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
1e44e2bf 3221 }
f1387719 3222 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
3223 if( $self->has_link_code ){
3224 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
3225 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
3226 }
8dd5ab3a
AD
3227 # Issue a several little RM_F commands rather than risk creating a
3228 # very long command line (useful for extensions such as Encode
3229 # that have many files).
3230 if (keys %{$self->{PM}}) {
3231 my $line = "";
3232 foreach (values %{$self->{PM}}) {
3233 if (length($line) + length($_) > 80) {
3234 push @m, "\t$self->{RM_F} $line\n";
3235 $line = $_;
3236 }
3237 else {
3238 $line .= " $_";
3239 }
3240 }
3241 push @m, "\t$self->{RM_F} $line\n" if $line;
3242 }
f1387719 3243 my(@otherfiles) = ($self->{MAKEFILE},
3244 "$self->{MAKEFILE}.old"); # Makefiles last
3245 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
3246 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
3247 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
3248 join("", @m);
1e44e2bf 3249}
3250
f1387719 3251=item replace_manpage_separator
1e44e2bf 3252
f1387719 3253Takes the name of a package, which may be a nested package, in the
3254form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
1e44e2bf 3255
3256=cut
3257
f1387719 3258sub replace_manpage_separator {
3259 my($self,$man) = @_;
2ebcf328 3260 if ($^O eq 'uwin') {
ed2b665b
PFI
3261 $man =~ s,/+,.,g;
3262 } elsif ($Is_Dos) {
3263 $man =~ s,/+,__,g;
2ebcf328 3264 } else {
ed2b665b 3265 $man =~ s,/+,::,g;
2ebcf328 3266 }
f1387719 3267 $man;
3268}
1e44e2bf 3269
f1387719 3270=item static (o)
1e44e2bf 3271
f1387719 3272Defines the static target.
1e44e2bf 3273
f1387719 3274=cut
1e44e2bf 3275
f1387719 3276sub static {
3277# --- Static Loading Sections ---
1e44e2bf 3278
f1387719 3279 my($self) = shift;
3280 '
3281## $(INST_PM) has been moved to the all: target.
3282## It remains here for awhile to allow for old usage: "make static"
3283#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
3284static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
3285 '.$self->{NOECHO}.'$(NOOP)
3286';
1e44e2bf 3287}
3288
f1387719 3289=item static_lib (o)
1e44e2bf 3290
f1387719 3291Defines how to produce the *.a (or equivalent) files.
1e44e2bf 3292
3293=cut
3294
f1387719 3295sub static_lib {
3296 my($self) = @_;
3297# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
3298# return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 3299
f1387719 3300 return '' unless $self->has_link_code;
3301
3302 my(@m);
3303 push(@m, <<'END');
3304$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
760ac839 3305 $(RM_RF) $@
f1387719 3306END
022735b4 3307 # If this extension has its own library (eg SDBM_File)
f1387719 3308 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3309 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
f4ae0f5e 3310
9f7ff21b
JH
3311 my $ar;
3312 if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
3313 # Prefer the absolute pathed ar if available so that PATH
3314 # doesn't confuse us. Perl itself is built with the full_ar.
3315 $ar = 'FULL_AR';
3316 } else {
3317 $ar = 'AR';
3318 }
f1387719 3319 push @m,
9f7ff21b
JH
3320 "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
3321 push @m,
3322q{ $(CHMOD) $(PERM_RWX) $@
0328fe61 3323 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
f4ae0f5e 3324};
0328fe61
CS
3325 # Old mechanism - still available:
3326 push @m,
3327"\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3328} if $self->{PERL_SRC} && $self->{EXTRALIBS};
3329 push @m, "\n";
f1387719 3330
3331 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3332 join('', "\n",@m);
1e44e2bf 3333}
3334
f4ae0f5e 3335=item staticmake (o)
1e44e2bf 3336
f4ae0f5e 3337Calls makeaperl.
1e44e2bf 3338
3339=cut
3340
3341sub staticmake {
3342 my($self, %attribs) = @_;
1e44e2bf 3343 my(@static);
3344
3345 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
3346
3347 # And as it's not yet built, we add the current extension
3348 # but only if it has some C code (or XS code, which implies C code)
3349 if (@{$self->{C}}) {
f4ae0f5e 3350 @static = $self->catfile($self->{INST_ARCHLIB},
3351 "auto",
3352 $self->{FULLEXT},
3353 "$self->{BASEEXT}$self->{LIB_EXT}"
3354 );
1e44e2bf 3355 }
3356
3357 # Either we determine now, which libraries we will produce in the
3358 # subdirectories or we do it at runtime of the make.
3359
3360 # We could ask all subdir objects, but I cannot imagine, why it
3361 # would be necessary.
3362
3363 # Instead we determine all libraries for the new perl at
3364 # runtime.
3365 my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
3366
3367 $self->makeaperl(MAKE => $self->{MAKEFILE},
3368 DIRS => \@searchdirs,
3369 STAT => \@static,
3370 INCL => \@perlinc,
3371 TARGET => $self->{MAP_TARGET},
3372 TMP => "",
3373 LIBPERL => $self->{LIBPERL_A}
3374 );
3375}
3376
f1387719 3377=item subdir_x (o)
3378
3379Helper subroutine for subdirs
3380
3381=cut
3382
3383sub subdir_x {
3384 my($self, $subdir) = @_;
3385 my(@m);
882a4479 3386 if ($Is_Win32 && Win32::IsWin95()) {
00b02797
JH
3387 if ($Config{'make'} =~ /dmake/i) {
3388 # dmake-specific
3389 return <<EOT;
882a4479 3390subdirs ::
7a958ec3 3391@[
882a4479 3392 cd $subdir
2f217c7c 3393 \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
882a4479 3394 cd ..
7a958ec3 3395]
882a4479 3396EOT
00b02797
JH
3397 } elsif ($Config{'make'} =~ /nmake/i) {
3398 # nmake-specific
3399 return <<EOT;
3400subdirs ::
3401 cd $subdir
2f217c7c 3402 \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
00b02797
JH
3403 cd ..
3404EOT
3405 }
3406 } else {
882a4479 3407 return <<EOT;
f1387719 3408
3409subdirs ::
2f217c7c 3410 $self->{NOECHO}cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
882a4479
GS
3411EOT
3412 }
f1387719 3413}
3414
3415=item subdirs (o)
3416
3417Defines targets to process subdirectories.
3418
3419=cut
3420
3421sub subdirs {
3422# --- Sub-directory Sections ---
3423 my($self) = shift;
3424 my(@m,$dir);
3425 # This method provides a mechanism to automatically deal with
3426 # subdirectories containing further Makefile.PL scripts.
3427 # It calls the subdir_x() method for each subdirectory.
3428 foreach $dir (@{$self->{DIR}}){
3429 push(@m, $self->subdir_x($dir));
3430#### print "Including $dir subdirectory\n";
3431 }
3432 if (@m){
3433 unshift(@m, "
3434# The default clean, realclean and test targets in this Makefile
3435# have automatically been given entries for each subdir.
3436
3437");
3438 } else {
3439 push(@m, "\n# none")
3440 }
3441 join('',@m);
3442}
3443
f4ae0f5e 3444=item test (o)
1e44e2bf 3445
f4ae0f5e 3446Defines the test targets.
1e44e2bf 3447
3448=cut
3449
3450sub test {
3451# --- Test and Installation Sections ---
3452
3453 my($self, %attribs) = @_;
96e4d5b1 3454 my $tests = $attribs{TESTS};
3455 if (!$tests && -d 't') {
3456 $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
3457 }
fb73857a 3458 # note: 'test.pl' name is also hardcoded in init_dirscan()
1e44e2bf 3459 my(@m);
3460 push(@m,"
3461TEST_VERBOSE=0
3462TEST_TYPE=test_\$(LINKTYPE)
f1387719 3463TEST_FILE = test.pl
fb73857a 3464TEST_FILES = $tests
f1387719 3465TESTDB_SW = -d
1e44e2bf 3466
f4ae0f5e 3467testdb :: testdb_\$(LINKTYPE)
f1387719 3468
3469test :: \$(TEST_TYPE)
1e44e2bf 3470");
68dc0745 3471 push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
1e44e2bf 3472 @{$self->{DIR}}));
3473 push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
3474 unless $tests or -f "test.pl" or @{$self->{DIR}};
3475 push(@m, "\n");
3476
f4ae0f5e 3477 push(@m, "test_dynamic :: pure_all\n");
fb73857a 3478 push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
3479 push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
1e44e2bf 3480 push(@m, "\n");
3481
f1387719 3482 push(@m, "testdb_dynamic :: pure_all\n");
3483 push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
3484 push(@m, "\n");
f4ae0f5e 3485
1e44e2bf 3486 # Occasionally we may face this degenerate target:
3487 push @m, "test_ : test_dynamic\n\n";
3488
3489 if ($self->needs_linking()) {
f4ae0f5e 3490 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
fb73857a 3491 push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
3492 push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
1e44e2bf 3493 push(@m, "\n");
f1387719 3494 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
3495 push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
3496 push(@m, "\n");
1e44e2bf 3497 } else {
3498 push @m, "test_static :: test_dynamic\n";
f4ae0f5e 3499 push @m, "testdb_static :: testdb_dynamic\n";
1e44e2bf 3500 }
3501 join("", @m);
3502}
3503
f4ae0f5e 3504=item test_via_harness (o)
1e44e2bf 3505
f4ae0f5e 3506Helper method to write the test targets
1e44e2bf 3507
3508=cut
3509
3510sub test_via_harness {
3511 my($self, $perl, $tests) = @_;
10dd38fc 3512 $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
4bfb3f62 3513 "\t$perl".q! $(TEST_LIBS) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
1e44e2bf 3514}
3515
f4ae0f5e 3516=item test_via_script (o)
1e44e2bf 3517
f4ae0f5e 3518Other helper method for test.
1e44e2bf 3519
3520=cut
3521
3522sub test_via_script {
3523 my($self, $perl, $script) = @_;
10dd38fc 3524 $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
4bfb3f62 3525 qq{\t$perl}.q{ $(TEST_LIBS) }.qq{$script
1e44e2bf 3526};
3527}
3528
f1387719 3529=item tool_autosplit (o)
1e44e2bf 3530
f1387719 3531Defines a simple perl call that runs autosplit. May be deprecated by
3532pm_to_blib soon.
1e44e2bf 3533
3534=cut
3535
f1387719 3536sub tool_autosplit {
3537# --- Tool Sections ---
3538
3539 my($self, %attribs) = @_;
3540 my($asl) = "";
3541 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
3542 q{
3543# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
cf699fa3 3544AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
f1387719 3545};
1e44e2bf 3546}
3547
f1387719 3548=item tools_other (o)
1e44e2bf 3549
f1387719 3550Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
3551the Makefile. Also defines the perl programs MKPATH,
3552WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
1e44e2bf 3553
3554=cut
3555
f1387719 3556sub tools_other {
3557 my($self) = shift;
3558 my @m;
3559 my $bin_sh = $Config{sh} || '/bin/sh';
3560 push @m, qq{
3561SHELL = $bin_sh
3562};
3563
68dc0745 3564 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
f1387719 3565 push @m, "$_ = $self->{$_}\n";
1e44e2bf 3566 }
1e44e2bf 3567
f1387719 3568 push @m, q{
3569# The following is a portable way to say mkdir -p
3570# To see which directories are created, change the if 0 to if 1
cf699fa3 3571MKPATH = $(PERLRUN) -MExtUtils::Command -e mkpath
1e44e2bf 3572
f1387719 3573# This helps us to minimize the effect of the .exists files A yet
3574# better solution would be to have a stable file in the perl
3575# distribution with a timestamp of zero. But this solution doesn't
3576# need any changes to the core distribution and works with older perls
cf699fa3 3577EQUALIZE_TIMESTAMP = $(PERLRUN) -MExtUtils::Command -e eqtime
f1387719 3578};
1e44e2bf 3579
68dc0745 3580
f1387719 3581 return join "", @m if $self->{PARENT};
1e44e2bf 3582
f1387719 3583 push @m, q{
3584# Here we warn users that an old packlist file was found somewhere,
3585# and that they should call some uninstall routine
3586WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
3587-e 'print "WARNING: I have found an old package in\n";' \\
3588-e 'print "\t$$ARGV[0].\n";' \\
3589-e 'print "Please make sure the two installations are not conflicting\n";'
1e44e2bf 3590
f1387719 3591UNINST=0
aceaef40 3592VERBINST=0
1e44e2bf 3593
f1387719 3594MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
68dc0745 3595-e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
1e44e2bf 3596
dbc738d9 3597DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
83bb2f05 3598-e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", $$arg=shift, "|", $$arg, ">";' \
f1387719 3599-e 'print "=over 4";' \
3600-e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
3601-e 'print "=back";'
1e44e2bf 3602
f1387719 3603UNINSTALL = $(PERL) -MExtUtils::Install \
8fe37c6d
CS
3604-e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
3605-e 'print " packlist above carefully.\n There may be errors. Remove the";' \
3606-e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"'
f1387719 3607};
1e44e2bf 3608
f1387719 3609 return join "", @m;
3610}
1e44e2bf 3611
f1387719 3612=item tool_xsubpp (o)
1e44e2bf 3613
f1387719 3614Determines typemaps, xsubpp version, prototype behaviour.
1e44e2bf 3615
f1387719 3616=cut
1e44e2bf 3617
f1387719 3618sub tool_xsubpp {
3619 my($self) = shift;
3620 return "" unless $self->needs_linking;
3621 my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
3622 my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3623 if( $self->{TYPEMAPS} ){
3624 my $typemap;
3625 foreach $typemap (@{$self->{TYPEMAPS}}){
3626 if( ! -f $typemap ){
3627 warn "Typemap $typemap not found.\n";
3628 }
3629 else{
3630 push(@tmdeps, $typemap);
3631 }
3632 }
3633 }
3634 push(@tmdeps, "typemap") if -f "typemap";
3635 my(@tmargs) = map("-typemap $_", @tmdeps);
3636 if( exists $self->{XSOPT} ){
3637 unshift( @tmargs, $self->{XSOPT} );
1e44e2bf 3638 }
3639
1e44e2bf 3640
f1387719 3641 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
1e44e2bf 3642
f1387719 3643 # What are the correct thresholds for version 1 && 2 Paul?
3644 if ( $xsubpp_version > 1.923 ){
3645 $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3646 } else {
3647 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3648 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3649 Your version of xsubpp is $xsubpp_version and cannot handle this.
3650 Please upgrade to a more recent version of xsubpp.
3651};
3652 } else {
3653 $self->{XSPROTOARG} = "";
3654 }
1e44e2bf 3655 }
3656
c5be433b 3657 my $xsubpp = "xsubpp";
e3b8966e 3658
f1387719 3659 return qq{
3660XSUBPPDIR = $xsdir
e3b8966e 3661XSUBPP = \$(XSUBPPDIR)/$xsubpp
f1387719 3662XSPROTOARG = $self->{XSPROTOARG}
ebf91006 3663XSUBPPDEPS = @tmdeps \$(XSUBPP)
f1387719 3664XSUBPPARGS = @tmargs
34a3ce8b 3665XSUBPP_EXTRA_ARGS =
f1387719 3666};
3667};
1e44e2bf 3668
f1387719 3669sub xsubpp_version
3670{
3671 my($self,$xsubpp) = @_;
3672 return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
1e44e2bf 3673
f1387719 3674 my ($version) ;
1e44e2bf 3675
f1387719 3676 # try to figure out the version number of the xsubpp on the system
1e44e2bf 3677
f1387719 3678 # first try the -v flag, introduced in 1.921 & 2.000a2
1e44e2bf 3679
f1387719 3680 return "" unless $self->needs_linking;
1e44e2bf 3681
f1387719 3682 my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3683 print "Running $command\n" if $Verbose >= 2;
3684 $version = `$command` ;
3685 warn "Running '$command' exits with status " . ($?>>8) if $?;
3686 chop $version ;
1e44e2bf 3687
f1387719 3688 return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
1e44e2bf 3689
f1387719 3690 # nope, then try something else
1e44e2bf 3691
f1387719 3692 my $counter = '000';
3693 my ($file) = 'temp' ;
3694 $counter++ while -e "$file$counter"; # don't overwrite anything
3695 $file .= $counter;
1e44e2bf 3696
f1387719 3697 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3698 print F <<EOM ;
3699MODULE = fred PACKAGE = fred
1e44e2bf 3700
f1387719 3701int
3702fred(a)
3703 int a;
3704EOM
1e44e2bf 3705
f1387719 3706 close F ;
1e44e2bf 3707
f1387719 3708 $command = "$self->{PERL} $xsubpp $file 2>&1";
3709 print "Running $command\n" if $Verbose >= 2;
3710 my $text = `$command` ;
3711 warn "Running '$command' exits with status " . ($?>>8) if $?;
3712 unlink $file ;
3713
3714 # gets 1.2 -> 1.92 and 2.000a1
3715 return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
3716
3717 # it is either 1.0 or 1.1
3718 return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3719
3720 # none of the above, so 1.0
3721 return $Xsubpp_Version = "1.0" ;
1e44e2bf 3722}
3723
f1387719 3724=item top_targets (o)
1e44e2bf 3725
f1387719 3726Defines the targets all, subdirs, config, and O_FILES
1e44e2bf 3727
3728=cut
3729
f1387719 3730sub top_targets {
3731# --- Target Sections ---
1e44e2bf 3732
f1387719 3733 my($self) = shift;
3734 my(@m);
3735 push @m, '
3736#all :: config $(INST_PM) subdirs linkext manifypods
68dc0745 3737';
1e44e2bf 3738
68dc0745 3739 push @m, '
cae6c631 3740all :: pure_all htmlifypods manifypods
f1387719 3741 '.$self->{NOECHO}.'$(NOOP)
68dc0745 3742'
3743 unless $self->{SKIPHASH}{'all'};
3744
3745 push @m, '
f1387719 3746pure_all :: config pm_to_blib subdirs linkext
3747 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3748
f1387719 3749subdirs :: $(MYEXTLIB)
3750 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3751
f1387719 3752config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3753 '.$self->{NOECHO}.'$(NOOP)
3754
3755config :: $(INST_ARCHAUTODIR)/.exists
3756 '.$self->{NOECHO}.'$(NOOP)
3757
3758config :: $(INST_AUTODIR)/.exists
3759 '.$self->{NOECHO}.'$(NOOP)
3760';
3761
f1387719 3762 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3763
cae6c631
JD
3764 if (%{$self->{HTMLLIBPODS}}) {
3765 push @m, qq[
3766config :: \$(INST_HTMLLIBDIR)/.exists
3767 $self->{NOECHO}\$(NOOP)
3768
3769];
3770 push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
3771 }
3772
3773 if (%{$self->{HTMLSCRIPTPODS}}) {
3774 push @m, qq[
3775config :: \$(INST_HTMLSCRIPTDIR)/.exists
3776 $self->{NOECHO}\$(NOOP)
3777
3778];
3779 push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
3780 }
3781
f1387719 3782 if (%{$self->{MAN1PODS}}) {
3783 push @m, qq[
3784config :: \$(INST_MAN1DIR)/.exists
3785 $self->{NOECHO}\$(NOOP)
3786
3787];
3788 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1e44e2bf 3789 }
f1387719 3790 if (%{$self->{MAN3PODS}}) {
3791 push @m, qq[
3792config :: \$(INST_MAN3DIR)/.exists
3793 $self->{NOECHO}\$(NOOP)
3794
3795];
3796 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1e44e2bf 3797 }
1e44e2bf 3798
f1387719 3799 push @m, '
3800$(O_FILES): $(H_FILES)
3801' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1e44e2bf 3802
f1387719 3803 push @m, q{
3804help:
3805 perldoc ExtUtils::MakeMaker
3806};
1e44e2bf 3807
f1387719 3808 push @m, q{
3809Version_check:
4bfb3f62 3810 }.$self->{NOECHO}.q{$(PERLRUN) \
f1387719 3811 -MExtUtils::MakeMaker=Version_check \
68dc0745 3812 -e "Version_check('$(MM_VERSION)')"
f1387719 3813};
1e44e2bf 3814
f1387719 3815 join('',@m);
1e44e2bf 3816}
3817
3818=item writedoc
3819
de592821 3820Obsolete, deprecated method. Not used since Version 5.21.
1e44e2bf 3821
3822=cut
3823
3824sub writedoc {
3825# --- perllocal.pod section ---
3826 my($self,$what,$name,@attribs)=@_;
1e44e2bf 3827 my $time = localtime;
3828 print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3829 print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3830 print "\n\n=back\n\n";
3831}
3832
f1387719 3833=item xs_c (o)
3834
3835Defines the suffix rules to compile XS files to C.
3836
3837=cut
3838
3839sub xs_c {
3840 my($self) = shift;
3841 return '' unless $self->needs_linking();
3842 '
3843.xs.c:
4bfb3f62 3844 $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
875fa795
JD
3845';
3846}
3847
3848=item xs_cpp (o)
3849
3850Defines the suffix rules to compile XS files to C++.
3851
3852=cut
3853
3854sub xs_cpp {
3855 my($self) = shift;
3856 return '' unless $self->needs_linking();
3857 '
3858.xs.cpp:
4bfb3f62 3859 $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
f1387719 3860';
3861}
3862
3863=item xs_o (o)
3864
3865Defines suffix rules to go from XS to object files directly. This is
3866only intended for broken make implementations.
3867
3868=cut
3869
3870sub xs_o { # many makes are too dumb to use xs_c then c_o
3871 my($self) = shift;
3872 return '' unless $self->needs_linking();
3873 '
3874.xs$(OBJ_EXT):
4bfb3f62 3875 $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
289e7e34 3876 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(PASTHRU_DEFINE) $(DEFINE) $*.c
f1387719 3877';
3878}
3879
68dc0745 3880=item perl_archive
3881
3882This is internal method that returns path to libperl.a equivalent
3883to be linked to dynamic extensions. UNIX does not have one but OS2
3884and Win32 do.
3885
3886=cut
3887
3888sub perl_archive
3889{
80252599 3890 return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos";
68dc0745 3891 return "";
3892}
3893
5ba48348
JH
3894=item perl_archive_after
3895
3896This is an internal method that returns path to a library which
3897should be put on the linker command line I<after> the external libraries
3898to be linked to dynamic extensions. This may be needed if the linker
3899is one-pass, and Perl includes some overrides for C RTL functions,
3900such as malloc().
3901
3902=cut
3903
3904sub perl_archive_after
3905{
3906 return "";
3907}
3908
68dc0745 3909=item export_list
3910
3911This is internal method that returns name of a file that is
3912passed to linker to define symbols to be exported.
3913UNIX does not have one but OS2 and Win32 do.
3914
3915=cut
3916
3917sub export_list
3918{
3919 return "";
3920}
3921
3922
f4ae0f5e 39231;
3924
bab2b58e 3925=back
f4ae0f5e 3926
1e44e2bf 3927=head1 SEE ALSO
3928
3929L<ExtUtils::MakeMaker>
3930
3931=cut
3932
f4ae0f5e 3933__END__