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