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