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