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