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