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