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