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