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