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