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