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