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