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