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