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