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