50f10d8a8a3f1d01290bab9ee84ba6ebff27a2c2
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_Unix.pm
1 package ExtUtils::MM_Unix;
2
3 use strict;
4
5 use Exporter ();
6 use Config;
7 use File::Basename qw(basename dirname fileparse);
8 use DirHandle;
9 use strict;
10 our ($Is_Mac,$Is_OS2,$Is_VMS,$Is_Win32,$Is_Dos,$Is_PERL_OBJECT,
11             $Verbose,%pm,%static,$Xsubpp_Version);
12
13 our $VERSION = '1.12603';
14
15 require ExtUtils::MakeMaker;
16 ExtUtils::MakeMaker->import(qw($Verbose &neatvalue));
17
18 $Is_OS2 = $^O eq 'os2';
19 $Is_Mac = $^O eq 'MacOS';
20 $Is_Win32 = $^O eq 'MSWin32';
21 $Is_Dos = $^O eq 'dos';
22
23 $Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/;
24
25 if ($Is_VMS = $^O eq 'VMS') {
26     require VMS::Filespec;
27     import VMS::Filespec qw( &vmsify );
28 }
29
30 =head1 NAME
31
32 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
33
34 =head1 SYNOPSIS
35
36 C<require ExtUtils::MM_Unix;>
37
38 =head1 DESCRIPTION
39
40 The methods provided by this package are designed to be used in
41 conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
42 Makefile, it creates one or more objects that inherit their methods
43 from a package C<MM>. MM itself doesn't provide any methods, but it
44 ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
45 specific packages take the responsibility for all the methods provided
46 by MM_Unix. We are trying to reduce the number of the necessary
47 overrides by defining rather primitive operations within
48 ExtUtils::MM_Unix.
49
50 If you are going to write a platform specific MM package, please try
51 to limit the necessary overrides to primitive methods, and if it is not
52 possible to do so, let's work out how to achieve that gain.
53
54 If you are overriding any of these methods in your Makefile.PL (in the
55 MY class), please report that to the makemaker mailing list. We are
56 trying to minimize the necessary method overrides and switch to data
57 driven Makefile.PLs wherever possible. In the long run less methods
58 will be overridable via the MY class.
59
60 =head1 METHODS
61
62 The following description of methods is still under
63 development. Please refer to the code for not suitably documented
64 sections and complain loudly to the makemaker mailing list.
65
66 Not all of the methods below are overridable in a
67 Makefile.PL. Overridable methods are marked as (o). All methods are
68 overridable by a platform specific MM_*.pm file (See
69 L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
70
71 =head2 Preloaded methods
72
73 =over 2
74
75 =item canonpath
76
77 No physical check on the filesystem, but a logical cleanup of a
78 path. On UNIX eliminated successive slashes and successive "/.".
79
80 =cut
81
82 sub canonpath {
83     my($self,$path) = @_;
84     my $node = '';
85     if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/|s ) {
86       $node = $1;
87     }
88     $path =~ s|(?<=[^/])/+|/|g ;                   # xx////xx  -> xx/xx
89     $path =~ s|(/\.)+/|/|g ;                       # xx/././xx -> xx/xx
90     $path =~ s|^(\./)+||s unless $path eq "./";    # ./xx      -> xx
91     $path =~ s|(?<=[^/])/\z|| ;                    # xx/       -> xx
92     "$node$path";
93 }
94
95 =item catdir
96
97 Concatenate two or more directory names to form a complete path ending
98 with a directory. But remove the trailing slash from the resulting
99 string, because it doesn't look good, isn't necessary and confuses
100 OS2. Of course, if this is the root directory, don't cut off the
101 trailing slash :-)
102
103 =cut
104
105 # ';
106
107 sub catdir {
108     my $self = shift @_;
109     my @args = @_;
110     for (@args) {
111         # append a slash to each argument unless it has one there
112         $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
113     }
114     $self->canonpath(join('', @args));
115 }
116
117 =item catfile
118
119 Concatenate one or more directory names and a filename to form a
120 complete path ending with a filename
121
122 =cut
123
124 sub catfile {
125     my $self = shift @_;
126     my $file = pop @_;
127     return $self->canonpath($file) unless @_;
128     my $dir = $self->catdir(@_);
129     for ($dir) {
130         $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
131     }
132     return $self->canonpath($dir.$file);
133 }
134
135 =item curdir
136
137 Returns a string representing of the current directory.  "." on UNIX.
138
139 =cut
140
141 sub curdir {
142     return "." ;
143 }
144
145 =item rootdir
146
147 Returns a string representing of the root directory.  "/" on UNIX.
148
149 =cut
150
151 sub rootdir {
152     return "/";
153 }
154
155 =item updir
156
157 Returns a string representing of the parent directory.  ".." on UNIX.
158
159 =cut
160
161 sub updir {
162     return "..";
163 }
164
165 sub ExtUtils::MM_Unix::c_o ;
166 sub ExtUtils::MM_Unix::clean ;
167 sub ExtUtils::MM_Unix::const_cccmd ;
168 sub ExtUtils::MM_Unix::const_config ;
169 sub ExtUtils::MM_Unix::const_loadlibs ;
170 sub ExtUtils::MM_Unix::constants ;
171 sub ExtUtils::MM_Unix::depend ;
172 sub ExtUtils::MM_Unix::dir_target ;
173 sub ExtUtils::MM_Unix::dist ;
174 sub ExtUtils::MM_Unix::dist_basics ;
175 sub ExtUtils::MM_Unix::dist_ci ;
176 sub ExtUtils::MM_Unix::dist_core ;
177 sub ExtUtils::MM_Unix::dist_dir ;
178 sub ExtUtils::MM_Unix::dist_test ;
179 sub ExtUtils::MM_Unix::dlsyms ;
180 sub ExtUtils::MM_Unix::dynamic ;
181 sub ExtUtils::MM_Unix::dynamic_bs ;
182 sub ExtUtils::MM_Unix::dynamic_lib ;
183 sub ExtUtils::MM_Unix::exescan ;
184 sub ExtUtils::MM_Unix::export_list ;
185 sub ExtUtils::MM_Unix::extliblist ;
186 sub ExtUtils::MM_Unix::file_name_is_absolute ;
187 sub ExtUtils::MM_Unix::find_perl ;
188 sub ExtUtils::MM_Unix::fixin ;
189 sub ExtUtils::MM_Unix::force ;
190 sub ExtUtils::MM_Unix::guess_name ;
191 sub ExtUtils::MM_Unix::has_link_code ;
192 sub ExtUtils::MM_Unix::htmlifypods ;
193 sub ExtUtils::MM_Unix::init_dirscan ;
194 sub ExtUtils::MM_Unix::init_main ;
195 sub ExtUtils::MM_Unix::init_others ;
196 sub ExtUtils::MM_Unix::install ;
197 sub ExtUtils::MM_Unix::installbin ;
198 sub ExtUtils::MM_Unix::libscan ;
199 sub ExtUtils::MM_Unix::linkext ;
200 sub ExtUtils::MM_Unix::lsdir ;
201 sub ExtUtils::MM_Unix::macro ;
202 sub ExtUtils::MM_Unix::makeaperl ;
203 sub ExtUtils::MM_Unix::makefile ;
204 sub ExtUtils::MM_Unix::manifypods ;
205 sub ExtUtils::MM_Unix::maybe_command ;
206 sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
207 sub ExtUtils::MM_Unix::needs_linking ;
208 sub ExtUtils::MM_Unix::nicetext ;
209 sub ExtUtils::MM_Unix::parse_version ;
210 sub ExtUtils::MM_Unix::pasthru ;
211 sub ExtUtils::MM_Unix::path ;
212 sub ExtUtils::MM_Unix::perl_archive;
213 sub ExtUtils::MM_Unix::perl_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         no warnings 'uninitialized' ;
1716         if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
1717             and not $old){
1718             # Maybe somebody tries to build an extension with an
1719             # uninstalled Perl outside of Perl build tree
1720             my $found;
1721             for my $dir (@INC) {
1722               $found = $dir, last if -e $self->catdir($dir, "Config.pm");
1723             }
1724             if ($found) {
1725               my $inc = dirname $found;
1726               if (-e $self->catdir($inc, "perl.h")) {
1727                 $self->{PERL_LIB}          = $found;
1728                 $self->{PERL_ARCHLIB}      = $found;
1729                 $self->{PERL_INC}          = $inc;
1730                 $self->{UNINSTALLED_PERL}  = 1;
1731                 print STDOUT <<EOP;
1732 ... Detected uninstalled Perl.  Trying to continue.
1733 EOP
1734               }
1735             }
1736         }
1737         
1738         unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1739             die qq{
1740 Error: Unable to locate installed Perl libraries or Perl source code.
1741
1742 It is recommended that you install perl in a standard location before
1743 building extensions. Some precompiled versions of perl do not contain
1744 these header files, so you cannot build extensions. In such a case,
1745 please build and install your perl from a fresh perl distribution. It
1746 usually solves this kind of problem.
1747
1748 \(You get this message, because MakeMaker could not find "$perl_h"\)
1749 };
1750         }
1751 #        print STDOUT "Using header files found in $self->{PERL_INC}\n"
1752 #            if $Verbose && $self->needs_linking();
1753
1754     }
1755
1756     # We get SITELIBEXP and SITEARCHEXP directly via
1757     # Get_from_Config. When we are running standard modules, these
1758     # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1759     # set it to "site". I prefer that INSTALLDIRS be set from outside
1760     # MakeMaker.
1761     $self->{INSTALLDIRS} ||= "site";
1762
1763     # INST_LIB typically pre-set if building an extension after
1764     # perl has been built and installed. Setting INST_LIB allows
1765     # you to build directly into, say $Config::Config{privlibexp}.
1766     unless ($self->{INST_LIB}){
1767
1768
1769         ##### XXXXX We have to change this nonsense
1770
1771         if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1772             $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1773         } else {
1774             $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1775         }
1776     }
1777     $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1778     $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1779
1780     # We need to set up INST_LIBDIR before init_libscan() for VMS
1781     my @parentdir = split(/::/, $self->{PARENT_NAME});
1782     $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1783     $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1784     $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1785     $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1786
1787     # INST_EXE is deprecated, should go away March '97
1788     $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1789     $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1790
1791     # The user who requests an installation directory explicitly
1792     # should not have to tell us a architecture installation directory
1793     # as well. We look if a directory exists that is named after the
1794     # architecture. If not we take it as a sign that it should be the
1795     # same as the requested installation directory. Otherwise we take
1796     # the found one.
1797     # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1798     my($libpair);
1799     for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1800         my $lib = "install$libpair->{l}";
1801         my $Lib = uc $lib;
1802         my $Arch = uc "install$libpair->{a}";
1803         if( $self->{$Lib} && ! $self->{$Arch} ){
1804             my($ilib) = $Config{$lib};
1805             $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1806
1807             $self->prefixify($Arch,$ilib,$self->{$Lib});
1808
1809             unless (-d $self->{$Arch}) {
1810                 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1811                 $self->{$Arch} = $self->{$Lib};
1812             }
1813             print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1814         }
1815     }
1816
1817     # we have to look at the relation between $Config{prefix} and the
1818     # requested values. We're going to set the $Config{prefix} part of
1819     # all the installation path variables to literally $(PREFIX), so
1820     # the user can still say make PREFIX=foo
1821     my($configure_prefix) = $Config{'prefix'};
1822     $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
1823     $self->{PREFIX} ||= $configure_prefix;
1824
1825
1826     my($install_variable,$search_prefix,$replace_prefix);
1827
1828     # If the prefix contains perl, Configure shapes the tree as follows:
1829     #    perlprefix/lib/                INSTALLPRIVLIB
1830     #    perlprefix/lib/pod/
1831     #    perlprefix/lib/site_perl/      INSTALLSITELIB
1832     #    perlprefix/bin/                INSTALLBIN
1833     #    perlprefix/man/                INSTALLMAN1DIR
1834     # else
1835     #    prefix/lib/perl5/              INSTALLPRIVLIB
1836     #    prefix/lib/perl5/pod/
1837     #    prefix/lib/perl5/site_perl/    INSTALLSITELIB
1838     #    prefix/bin/                    INSTALLBIN
1839     #    prefix/lib/perl5/man/          INSTALLMAN1DIR
1840     #
1841     # The above results in various kinds of breakage on various
1842     # platforms, so we cope with it as follows: if prefix/lib/perl5
1843     # or prefix/lib/perl5/man exist, we'll replace those instead
1844     # of /prefix/{lib,man}
1845
1846     $replace_prefix = qq[\$\(PREFIX\)];
1847     for $install_variable (qw/
1848                            INSTALLBIN
1849                            INSTALLSCRIPT
1850                            /) {
1851         $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1852     }
1853     my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
1854     $funkylibdir = '' unless -d $funkylibdir;
1855     $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
1856     if ($self->{LIB}) {
1857         $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1858         $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = 
1859             $self->catdir($self->{LIB},$Config{'archname'});
1860     }
1861     else {
1862         if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
1863             $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
1864         }
1865         else {
1866             $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
1867         }
1868         for $install_variable (qw/
1869                                INSTALLPRIVLIB
1870                                INSTALLARCHLIB
1871                                INSTALLSITELIB
1872                                INSTALLSITEARCH
1873                                /)
1874         {
1875             $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1876         }
1877     }
1878     my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
1879     $funkymandir = '' unless -d $funkymandir;
1880     $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
1881     if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
1882         $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
1883     }
1884     else {
1885         $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
1886     }
1887     for $install_variable (qw/
1888                            INSTALLMAN1DIR
1889                            INSTALLMAN3DIR
1890                            /)
1891     {
1892         $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1893     }
1894
1895     # Now we head at the manpages. Maybe they DO NOT want manpages
1896     # installed
1897     $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1898         unless defined $self->{INSTALLMAN1DIR};
1899     unless (defined $self->{INST_MAN1DIR}){
1900         if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1901             $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1902         } else {
1903             $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1904         }
1905     }
1906     $self->{MAN1EXT} ||= $Config::Config{man1ext};
1907
1908     $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1909         unless defined $self->{INSTALLMAN3DIR};
1910     unless (defined $self->{INST_MAN3DIR}){
1911         if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1912             $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1913         } else {
1914             $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1915         }
1916     }
1917     $self->{MAN3EXT} ||= $Config::Config{man3ext};
1918
1919     $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
1920         unless defined $self->{INSTALLHTMLPRIVLIBDIR};
1921     $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
1922         unless defined $self->{INSTALLHTMLSITELIBDIR};
1923
1924     unless (defined $self->{INST_HTMLLIBDIR}){
1925         if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
1926             $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
1927         } else {
1928             $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
1929         }
1930     }
1931
1932     $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
1933         unless defined $self->{INSTALLHTMLSCRIPTDIR};
1934     unless (defined $self->{INST_HTMLSCRIPTDIR}){
1935         if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
1936             $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
1937         } else {
1938             $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
1939         }
1940     }
1941     $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
1942
1943
1944     # Get some stuff out of %Config if we haven't yet done so
1945     print STDOUT "CONFIG must be an array ref\n"
1946         if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1947     $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1948     push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1949     push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1950     my(%once_only,$m);
1951     foreach $m (@{$self->{CONFIG}}){
1952         next if $once_only{$m};
1953         print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1954                 unless exists $Config::Config{$m};
1955         $self->{uc $m} ||= $Config::Config{$m};
1956         $once_only{$m} = 1;
1957     }
1958
1959 # This is too dangerous:
1960 #    if ($^O eq "next") {
1961 #       $self->{AR} = "libtool";
1962 #       $self->{AR_STATIC_ARGS} = "-o";
1963 #    }
1964 # But I leave it as a placeholder
1965
1966     $self->{AR_STATIC_ARGS} ||= "cr";
1967
1968     # These should never be needed
1969     $self->{LD} ||= 'ld';
1970     $self->{OBJ_EXT} ||= '.o';
1971     $self->{LIB_EXT} ||= '.a';
1972
1973     $self->{MAP_TARGET} ||= "perl";
1974
1975     $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1976
1977     # make a simple check if we find Exporter
1978     warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1979         (Exporter.pm not found)"
1980         unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1981         $self->{NAME} eq "ExtUtils::MakeMaker";
1982
1983     # Determine VERSION and VERSION_FROM
1984     ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1985     if ($self->{VERSION_FROM}){
1986         $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1987             Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1988     }
1989
1990     # strip blanks
1991     if ($self->{VERSION}) {
1992         $self->{VERSION} =~ s/^\s+//;
1993         $self->{VERSION} =~ s/\s+$//;
1994     }
1995
1996     $self->{VERSION} ||= "0.10";
1997     ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1998
1999
2000     # Graham Barr and Paul Marquess had some ideas how to ensure
2001     # version compatibility between the *.pm file and the
2002     # corresponding *.xs file. The bottomline was, that we need an
2003     # XS_VERSION macro that defaults to VERSION:
2004     $self->{XS_VERSION} ||= $self->{VERSION};
2005
2006     # --- Initialize Perl Binary Locations
2007
2008     # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
2009     # will be working versions of perl 5. miniperl has priority over perl
2010     # for PERL to ensure that $(PERL) is usable while building ./ext/*
2011     my ($component,@defpath);
2012     foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
2013         push @defpath, $component if defined $component;
2014     }
2015     $self->{PERL} ||=
2016         $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
2017                                 'perl','perl5',"perl$Config{version}" ],
2018             \@defpath, $Verbose );
2019     # don't check if perl is executable, maybe they have decided to
2020     # supply switches with perl
2021
2022     # Define 'FULLPERL' to be a non-miniperl (used in test: target)
2023     ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
2024         unless ($self->{FULLPERL});
2025 }
2026
2027 =item init_others
2028
2029 Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
2030 OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
2031 MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
2032
2033 =cut
2034
2035 sub init_others {       # --- Initialize Other Attributes
2036     my($self) = shift;
2037
2038     # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
2039     # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
2040     # undefined. In any case we turn it into an anon array:
2041
2042     # May check $Config{libs} too, thus not empty.
2043     $self->{LIBS}=[''] unless $self->{LIBS};
2044
2045     $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
2046     $self->{LD_RUN_PATH} = "";
2047     my($libs);
2048     foreach $libs ( @{$self->{LIBS}} ){
2049         $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
2050         my(@libs) = $self->extliblist($libs);
2051         if ($libs[0] or $libs[1] or $libs[2]){
2052             # LD_RUN_PATH now computed by ExtUtils::Liblist
2053             ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
2054             last;
2055         }
2056     }
2057
2058     if ( $self->{OBJECT} ) {
2059         $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
2060     } else {
2061         # init_dirscan should have found out, if we have C files
2062         $self->{OBJECT} = "";
2063         $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
2064     }
2065     $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
2066     $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
2067     $self->{PERLMAINCC} ||= '$(CC)';
2068     $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
2069
2070     # Sanity check: don't define LINKTYPE = dynamic if we're skipping
2071     # the 'dynamic' section of MM.  We don't have this problem with
2072     # 'static', since we either must use it (%Config says we can't
2073     # use dynamic loading) or the caller asked for it explicitly.
2074     if (!$self->{LINKTYPE}) {
2075        $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
2076                         ? 'static'
2077                         : ($Config::Config{usedl} ? 'dynamic' : 'static');
2078     };
2079
2080     # These get overridden for VMS and maybe some other systems
2081     $self->{NOOP}  ||= '$(SHELL) -c true';
2082     $self->{FIRST_MAKEFILE} ||= "Makefile";
2083     $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
2084     $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
2085     $self->{NOECHO} = '@' unless defined $self->{NOECHO};
2086     $self->{RM_F}  ||= "rm -f";
2087     $self->{RM_RF} ||= "rm -rf";
2088     $self->{TOUCH} ||= "touch";
2089     $self->{TEST_F} ||= "test -f";
2090     $self->{CP} ||= "cp";
2091     $self->{MV} ||= "mv";
2092     $self->{CHMOD} ||= "chmod";
2093     $self->{UMASK_NULL} ||= "umask 0";
2094     $self->{DEV_NULL} ||= "> /dev/null 2>&1";
2095 }
2096
2097 =item install (o)
2098
2099 Defines the install target.
2100
2101 =cut
2102
2103 sub install {
2104     my($self, %attribs) = @_;
2105     my(@m);
2106
2107     push @m, q{
2108 install :: all pure_install doc_install
2109
2110 install_perl :: all pure_perl_install doc_perl_install
2111
2112 install_site :: all pure_site_install doc_site_install
2113
2114 install_ :: install_site
2115         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2116
2117 pure_install :: pure_$(INSTALLDIRS)_install
2118
2119 doc_install :: doc_$(INSTALLDIRS)_install
2120         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2121
2122 pure__install : pure_site_install
2123         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2124
2125 doc__install : doc_site_install
2126         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2127
2128 pure_perl_install ::
2129         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2130                 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2131                 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2132                 $(INST_LIB) $(INSTALLPRIVLIB) \
2133                 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
2134                 $(INST_BIN) $(INSTALLBIN) \
2135                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
2136                 $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
2137                 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
2138                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2139                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2140         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2141                 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
2142
2143
2144 pure_site_install ::
2145         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2146                 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
2147                 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
2148                 $(INST_LIB) $(INSTALLSITELIB) \
2149                 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
2150                 $(INST_BIN) $(INSTALLBIN) \
2151                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
2152                 $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
2153                 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
2154                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2155                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2156         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2157                 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
2158
2159 doc_perl_install ::
2160         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2161         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2162                 "Module" "$(NAME)" \
2163                 "installed into" "$(INSTALLPRIVLIB)" \
2164                 LINKTYPE "$(LINKTYPE)" \
2165                 VERSION "$(VERSION)" \
2166                 EXE_FILES "$(EXE_FILES)" \
2167                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2168
2169 doc_site_install ::
2170         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2171         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2172                 "Module" "$(NAME)" \
2173                 "installed into" "$(INSTALLSITELIB)" \
2174                 LINKTYPE "$(LINKTYPE)" \
2175                 VERSION "$(VERSION)" \
2176                 EXE_FILES "$(EXE_FILES)" \
2177                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2178
2179 };
2180
2181     push @m, q{
2182 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
2183
2184 uninstall_from_perldirs ::
2185         }.$self->{NOECHO}.
2186         q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
2187
2188 uninstall_from_sitedirs ::
2189         }.$self->{NOECHO}.
2190         q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2191 };
2192
2193     join("",@m);
2194 }
2195
2196 =item installbin (o)
2197
2198 Defines targets to make and to install EXE_FILES.
2199
2200 =cut
2201
2202 sub installbin {
2203     my($self) = shift;
2204     return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2205     return "" unless @{$self->{EXE_FILES}};
2206     my(@m, $from, $to, %fromto, @to);
2207     push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2208     for $from (@{$self->{EXE_FILES}}) {
2209         my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2210         local($_) = $path; # for backwards compatibility
2211         $to = $self->libscan($path);
2212         print "libscan($from) => '$to'\n" if ($Verbose >=2);
2213         $fromto{$from}=$to;
2214     }
2215     @to   = values %fromto;
2216     push(@m, qq{
2217 EXE_FILES = @{$self->{EXE_FILES}}
2218
2219 } . ($Is_Win32
2220   ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2221     -e "system qq[pl2bat.bat ].shift"
2222 } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
2223     -e "MY->fixin(shift)"
2224 }).qq{
2225 pure_all :: @to
2226         $self->{NOECHO}\$(NOOP)
2227
2228 realclean ::
2229         $self->{RM_F} @to
2230 });
2231
2232     while (($from,$to) = each %fromto) {
2233         last unless defined $from;
2234         my $todir = dirname($to);
2235         push @m, "
2236 $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
2237         $self->{NOECHO}$self->{RM_F} $to
2238         $self->{CP} $from $to
2239         \$(FIXIN) $to
2240         -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
2241 ";
2242     }
2243     join "", @m;
2244 }
2245
2246 =item libscan (o)
2247
2248 Takes a path to a file that is found by init_dirscan and returns false
2249 if we don't want to include this file in the library. Mainly used to
2250 exclude RCS, CVS, and SCCS directories from installation.
2251
2252 =cut
2253
2254 # ';
2255
2256 sub libscan {
2257     my($self,$path) = @_;
2258     return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2259     $path;
2260 }
2261
2262 =item linkext (o)
2263
2264 Defines the linkext target which in turn defines the LINKTYPE.
2265
2266 =cut
2267
2268 sub linkext {
2269     my($self, %attribs) = @_;
2270     # LINKTYPE => static or dynamic or ''
2271     my($linktype) = defined $attribs{LINKTYPE} ?
2272       $attribs{LINKTYPE} : '$(LINKTYPE)';
2273     "
2274 linkext :: $linktype
2275         $self->{NOECHO}\$(NOOP)
2276 ";
2277 }
2278
2279 =item lsdir
2280
2281 Takes as arguments a directory name and a regular expression. Returns
2282 all entries in the directory that match the regular expression.
2283
2284 =cut
2285
2286 sub lsdir {
2287     my($self) = shift;
2288     my($dir, $regex) = @_;
2289     my(@ls);
2290     my $dh = new DirHandle;
2291     $dh->open($dir || ".") or return ();
2292     @ls = $dh->read;
2293     $dh->close;
2294     @ls = grep(/$regex/, @ls) if $regex;
2295     @ls;
2296 }
2297
2298 =item macro (o)
2299
2300 Simple subroutine to insert the macros defined by the macro attribute
2301 into the Makefile.
2302
2303 =cut
2304
2305 sub macro {
2306     my($self,%attribs) = @_;
2307     my(@m,$key,$val);
2308     while (($key,$val) = each %attribs){
2309         last unless defined $key;
2310         push @m, "$key = $val\n";
2311     }
2312     join "", @m;
2313 }
2314
2315 =item makeaperl (o)
2316
2317 Called by staticmake. Defines how to write the Makefile to produce a
2318 static new perl.
2319
2320 By default the Makefile produced includes all the static extensions in
2321 the perl library. (Purified versions of library files, e.g.,
2322 DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2323
2324 =cut
2325
2326 sub makeaperl {
2327     my($self, %attribs) = @_;
2328     my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2329         @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2330     my(@m);
2331     push @m, "
2332 # --- MakeMaker makeaperl section ---
2333 MAP_TARGET    = $target
2334 FULLPERL      = $self->{FULLPERL}
2335 ";
2336     return join '', @m if $self->{PARENT};
2337
2338     my($dir) = join ":", @{$self->{DIR}};
2339
2340     unless ($self->{MAKEAPERL}) {
2341         push @m, q{
2342 $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2343         $(MAKE) -f $(MAKE_APERL_FILE) $@
2344
2345 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2346         }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2347         }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2348                 Makefile.PL DIR=}, $dir, q{ \
2349                 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2350                 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
2351
2352         foreach (@ARGV){
2353                 if( /\s/ ){
2354                         s/=(.*)/='$1'/;
2355                 }
2356                 push @m, " \\\n\t\t$_";
2357         }
2358 #       push @m, map( " \\\n\t\t$_", @ARGV );
2359         push @m, "\n";
2360
2361         return join '', @m;
2362     }
2363
2364
2365
2366     my($cccmd, $linkcmd, $lperl);
2367
2368
2369     $cccmd = $self->const_cccmd($libperl);
2370     $cccmd =~ s/^CCCMD\s*=\s*//;
2371     $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
2372     $cccmd .= " $Config::Config{cccdlflags}"
2373         if ($Config::Config{useshrplib} eq 'true');
2374     $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
2375
2376     # The front matter of the linkcommand...
2377     $linkcmd = join ' ', "\$(CC)",
2378             grep($_, @Config{qw(ldflags ccdlflags)});
2379     $linkcmd =~ s/\s+/ /g;
2380     $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
2381
2382     # Which *.a files could we make use of...
2383     local(%static);
2384     require File::Find;
2385     File::Find::find(sub {
2386         return unless m/\Q$self->{LIB_EXT}\E$/;
2387         return if m/^libperl/;
2388         # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2389         return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
2390
2391         if( exists $self->{INCLUDE_EXT} ){
2392                 my $found = 0;
2393                 my $incl;
2394                 my $xx;
2395
2396                 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
2397                 $xx =~ s,/?$_,,;
2398                 $xx =~ s,/,::,g;
2399
2400                 # Throw away anything not explicitly marked for inclusion.
2401                 # DynaLoader is implied.
2402                 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2403                         if( $xx eq $incl ){
2404                                 $found++;
2405                                 last;
2406                         }
2407                 }
2408                 return unless $found;
2409         }
2410         elsif( exists $self->{EXCLUDE_EXT} ){
2411                 my $excl;
2412                 my $xx;
2413
2414                 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
2415                 $xx =~ s,/?$_,,;
2416                 $xx =~ s,/,::,g;
2417
2418                 # Throw away anything explicitly marked for exclusion
2419                 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2420                         return if( $xx eq $excl );
2421                 }
2422         }
2423
2424         # don't include the installed version of this extension. I
2425         # leave this line here, although it is not necessary anymore:
2426         # I patched minimod.PL instead, so that Miniperl.pm won't
2427         # enclude duplicates
2428
2429         # Once the patch to minimod.PL is in the distribution, I can
2430         # drop it
2431         return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
2432         use Cwd 'cwd';
2433         $static{cwd() . "/" . $_}++;
2434     }, grep( -d $_, @{$searchdirs || []}) );
2435
2436     # We trust that what has been handed in as argument, will be buildable
2437     $static = [] unless $static;
2438     @static{@{$static}} = (1) x @{$static};
2439
2440     $extra = [] unless $extra && ref $extra eq 'ARRAY';
2441     for (sort keys %static) {
2442         next unless /\Q$self->{LIB_EXT}\E\z/;
2443         $_ = dirname($_) . "/extralibs.ld";
2444         push @$extra, $_;
2445     }
2446
2447     grep(s/^/-I/, @{$perlinc || []});
2448
2449     $target = "perl" unless $target;
2450     $tmp = "." unless $tmp;
2451
2452 # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2453 # regenerate the Makefiles, MAP_STATIC and the dependencies for
2454 # extralibs.all are computed correctly
2455     push @m, "
2456 MAP_LINKCMD   = $linkcmd
2457 MAP_PERLINC   = @{$perlinc || []}
2458 MAP_STATIC    = ",
2459 join(" \\\n\t", reverse sort keys %static), "
2460
2461 MAP_PRELIBS   = $Config::Config{perllibs} $Config::Config{cryptlib}
2462 ";
2463
2464     if (defined $libperl) {
2465         ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2466     }
2467     unless ($libperl && -f $lperl) { # Ilya's code...
2468         my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2469         $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
2470         $libperl ||= "libperl$self->{LIB_EXT}";
2471         $libperl   = "$dir/$libperl";
2472         $lperl   ||= "libperl$self->{LIB_EXT}";
2473         $lperl     = "$dir/$lperl";
2474
2475         if (! -f $libperl and ! -f $lperl) {
2476           # We did not find a static libperl. Maybe there is a shared one?
2477           if ($^O eq 'solaris' or $^O eq 'sunos') {
2478             $lperl  = $libperl = "$dir/$Config::Config{libperl}";
2479             # SUNOS ld does not take the full path to a shared library
2480             $libperl = '' if $^O eq 'sunos';
2481           }
2482         }
2483
2484         print STDOUT "Warning: $libperl not found
2485     If you're going to build a static perl binary, make sure perl is installed
2486     otherwise ignore this warning\n"
2487                 unless (-f $lperl || defined($self->{PERL_SRC}));
2488     }
2489
2490     push @m, "
2491 MAP_LIBPERL = $libperl
2492 ";
2493
2494     push @m, "
2495 \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2496         $self->{NOECHO}$self->{RM_F} \$\@
2497         $self->{NOECHO}\$(TOUCH) \$\@
2498 ";
2499
2500     my $catfile;
2501     foreach $catfile (@$extra){
2502         push @m, "\tcat $catfile >> \$\@\n";
2503     }
2504     # SUNOS ld does not take the full path to a shared library
2505     my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
2506
2507 push @m, "
2508 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
2509         \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
2510         $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2511         $self->{NOECHO}echo '    make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2512         $self->{NOECHO}echo 'To remove the intermediate files say'
2513         $self->{NOECHO}echo '    make -f $makefilename map_clean'
2514
2515 $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2516 ";
2517     push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
2518
2519     push @m, qq{
2520 $tmp/perlmain.c: $makefilename}, q{
2521         }.$self->{NOECHO}.q{echo Writing $@
2522         }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
2523                 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
2524
2525 };
2526     push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2527 } if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2528
2529
2530     push @m, q{
2531 doc_inst_perl:
2532         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2533         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2534         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2535                 "Perl binary" "$(MAP_TARGET)" \
2536                 MAP_STATIC "$(MAP_STATIC)" \
2537                 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2538                 MAP_LIBPERL "$(MAP_LIBPERL)" \
2539                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2540
2541 };
2542
2543     push @m, q{
2544 inst_perl: pure_inst_perl doc_inst_perl
2545
2546 pure_inst_perl: $(MAP_TARGET)
2547         }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
2548
2549 clean :: map_clean
2550
2551 map_clean :
2552         }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2553 };
2554
2555     join '', @m;
2556 }
2557
2558 =item makefile (o)
2559
2560 Defines how to rewrite the Makefile.
2561
2562 =cut
2563
2564 sub makefile {
2565     my($self) = shift;
2566     my @m;
2567     # We do not know what target was originally specified so we
2568     # must force a manual rerun to be sure. But as it should only
2569     # happen very rarely it is not a significant problem.
2570     push @m, '
2571 $(OBJECT) : $(FIRST_MAKEFILE)
2572 ' if $self->{OBJECT};
2573
2574     push @m, q{
2575 # We take a very conservative approach here, but it\'s worth it.
2576 # We move Makefile to Makefile.old here to avoid gnu make looping.
2577 }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2578         }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2579         }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
2580         -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
2581         -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2582         -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
2583         $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
2584         }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2585         }.$self->{NOECHO}.q{echo "==> Please rerun the make command.  <=="
2586         false
2587
2588 # To change behavior to :: would be nice, but would break Tk b9.02
2589 # so you find such a warning below the dist target.
2590 #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2591 #       }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
2592 };
2593
2594     join "", @m;
2595 }
2596
2597 =item manifypods (o)
2598
2599 Defines targets and routines to translate the pods into manpages and
2600 put them into the INST_* directories.
2601
2602 =cut
2603
2604 sub manifypods {
2605     my($self, %attribs) = @_;
2606     return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2607         %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
2608     my($dist);
2609     my($pod2man_exe);
2610     if (defined $self->{PERL_SRC}) {
2611         $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2612     } else {
2613         $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
2614     }
2615     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
2616       # Maybe a build by uninstalled Perl?
2617       $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
2618     }
2619     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
2620         # No pod2man but some MAN3PODS to be installed
2621         print <<END;
2622
2623 Warning: I could not locate your pod2man program. Please make sure,
2624          your pod2man program is in your PATH before you execute 'make'
2625
2626 END
2627         $pod2man_exe = "-S pod2man";
2628     }
2629     my(@m);
2630     push @m,
2631 qq[POD2MAN_EXE = $pod2man_exe\n],
2632 qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2633 q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2634  $self->{MAKEFILE}, q[";' \\
2635 -e 'print "Manifying $$m{$$_}\n";' \\
2636 -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2637 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
2638 ];
2639     push @m, "\nmanifypods : pure_all ";
2640     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
2641
2642     push(@m,"\n");
2643     if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2644         push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2645         push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
2646     }
2647     join('', @m);
2648 }
2649
2650 =item maybe_command
2651
2652 Returns true, if the argument is likely to be a command.
2653
2654 =cut
2655
2656 sub maybe_command {
2657     my($self,$file) = @_;
2658     return $file if -x $file && ! -d $file;
2659     return;
2660 }
2661
2662 =item maybe_command_in_dirs
2663
2664 method under development. Not yet used. Ask Ilya :-)
2665
2666 =cut
2667
2668 sub maybe_command_in_dirs {     # $ver is optional argument if looking for perl
2669 # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2670     my($self, $names, $dirs, $trace, $ver) = @_;
2671     my($name, $dir);
2672     foreach $dir (@$dirs){
2673         next unless defined $dir; # $self->{PERL_SRC} may be undefined
2674         foreach $name (@$names){
2675             my($abs,$tryabs);
2676             if ($self->file_name_is_absolute($name)) { # /foo/bar
2677                 $abs = $name;
2678             } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2679                 $abs = $self->catfile($dir, $name);
2680             } else { # foo/bar
2681                 $abs = $self->catfile($self->curdir, $name);
2682             }
2683             print "Checking $abs for $name\n" if ($trace >= 2);
2684             next unless $tryabs = $self->maybe_command($abs);
2685             print "Substituting $tryabs instead of $abs\n"
2686                 if ($trace >= 2 and $tryabs ne $abs);
2687             $abs = $tryabs;
2688             if (defined $ver) {
2689                 print "Executing $abs\n" if ($trace >= 2);
2690                 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2691                     print "Using PERL=$abs\n" if $trace;
2692                     return $abs;
2693                 }
2694             } else { # Do not look for perl
2695                 return $abs;
2696             }
2697         }
2698     }
2699 }
2700
2701 =item needs_linking (o)
2702
2703 Does this module need linking? Looks into subdirectory objects (see
2704 also has_link_code())
2705
2706 =cut
2707
2708 sub needs_linking {
2709     my($self) = shift;
2710     my($child,$caller);
2711     $caller = (caller(0))[3];
2712     Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2713     return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2714     if ($self->has_link_code or $self->{MAKEAPERL}){
2715         $self->{NEEDS_LINKING} = 1;
2716         return 1;
2717     }
2718     foreach $child (keys %{$self->{CHILDREN}}) {
2719         if ($self->{CHILDREN}->{$child}->needs_linking) {
2720             $self->{NEEDS_LINKING} = 1;
2721             return 1;
2722         }
2723     }
2724     return $self->{NEEDS_LINKING} = 0;
2725 }
2726
2727 =item nicetext
2728
2729 misnamed method (will have to be changed). The MM_Unix method just
2730 returns the argument without further processing.
2731
2732 On VMS used to insure that colons marking targets are preceded by
2733 space - most Unix Makes don't need this, but it's necessary under VMS
2734 to distinguish the target delimiter from a colon appearing as part of
2735 a filespec.
2736
2737 =cut
2738
2739 sub nicetext {
2740     my($self,$text) = @_;
2741     $text;
2742 }
2743
2744 =item parse_version
2745
2746 parse a file and return what you think is $VERSION in this file set to.
2747 It will return the string "undef" if it can't figure out what $VERSION
2748 is.
2749
2750 =cut
2751
2752 sub parse_version {
2753     my($self,$parsefile) = @_;
2754     my $result;
2755     local *FH;
2756     local $/ = "\n";
2757     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2758     my $inpod = 0;
2759     while (<FH>) {
2760         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2761         next if $inpod;
2762         chop;
2763         # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2764         next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
2765         my $eval = qq{
2766             package ExtUtils::MakeMaker::_version;
2767             no strict;
2768
2769             local $1$2;
2770             \$$2=undef; do {
2771                 $_
2772             }; \$$2
2773         };
2774         no warnings;
2775         $result = eval($eval);
2776         warn "Could not eval '$eval' in $parsefile: $@" if $@;
2777         $result = "undef" unless defined $result;
2778         last;
2779     }
2780     close FH;
2781     return $result;
2782 }
2783
2784 =item parse_abstract
2785
2786 parse a file and return what you think is the ABSTRACT
2787
2788 =cut
2789
2790 sub parse_abstract {
2791     my($self,$parsefile) = @_;
2792     my $result;
2793     local *FH;
2794     local $/ = "\n";
2795     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2796     my $inpod = 0;
2797     my $package = $self->{DISTNAME};
2798     $package =~ s/-/::/g;
2799     while (<FH>) {
2800         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2801         next if !$inpod;
2802         chop;
2803         next unless /^($package\s-\s)(.*)/;
2804         $result = $2;
2805         last;
2806     }
2807     close FH;
2808     return $result;
2809 }
2810
2811 =item pasthru (o)
2812
2813 Defines the string that is passed to recursive make calls in
2814 subdirectories.
2815
2816 =cut
2817
2818 sub pasthru {
2819     my($self) = shift;
2820     my(@m,$key);
2821
2822     my(@pasthru);
2823     my($sep) = $Is_VMS ? ',' : '';
2824     $sep .= "\\\n\t";
2825
2826     foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
2827         push @pasthru, "$key=\"\$($key)\"";
2828     }
2829
2830     push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
2831     join "", @m;
2832 }
2833
2834 =item path
2835
2836 Takes no argument, returns the environment variable PATH as an array.
2837
2838 =cut
2839
2840 sub path {
2841     my($self) = @_;
2842     my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
2843     my $path = $ENV{PATH};
2844     $path =~ s:\\:/:g if $Is_OS2;
2845     my @path = split $path_sep, $path;
2846     foreach(@path) { $_ = '.' if $_ eq '' }
2847     @path;
2848 }
2849
2850 =item perl_script
2851
2852 Takes one argument, a file name, and returns the file name, if the
2853 argument is likely to be a perl script. On MM_Unix this is true for
2854 any ordinary, readable file.
2855
2856 =cut
2857
2858 sub perl_script {
2859     my($self,$file) = @_;
2860     return $file if -r $file && -f _;
2861     return;
2862 }
2863
2864 =item perldepend (o)
2865
2866 Defines the dependency from all *.h files that come with the perl
2867 distribution.
2868
2869 =cut
2870
2871 sub perldepend {
2872     my($self) = shift;
2873     my(@m);
2874     push @m, q{
2875 # Check for unpropogated config.sh changes. Should never happen.
2876 # We do NOT just update config.h because that is not sufficient.
2877 # An out of date config.h is not fatal but complains loudly!
2878 $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2879         -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2880
2881 $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2882         }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2883         cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2884 } if $self->{PERL_SRC};
2885
2886     return join "", @m unless $self->needs_linking;
2887
2888     push @m, q{
2889 PERL_HDRS = \
2890         $(PERL_INC)/EXTERN.h            \
2891         $(PERL_INC)/INTERN.h            \
2892         $(PERL_INC)/XSUB.h              \
2893         $(PERL_INC)/av.h                \
2894         $(PERL_INC)/cc_runtime.h        \
2895         $(PERL_INC)/config.h            \
2896         $(PERL_INC)/cop.h               \
2897         $(PERL_INC)/cv.h                \
2898         $(PERL_INC)/dosish.h            \
2899         $(PERL_INC)/embed.h             \
2900         $(PERL_INC)/embedvar.h          \
2901         $(PERL_INC)/fakethr.h           \
2902         $(PERL_INC)/form.h              \
2903         $(PERL_INC)/gv.h                \
2904         $(PERL_INC)/handy.h             \
2905         $(PERL_INC)/hv.h                \
2906         $(PERL_INC)/intrpvar.h          \
2907         $(PERL_INC)/iperlsys.h          \
2908         $(PERL_INC)/keywords.h          \
2909         $(PERL_INC)/mg.h                \
2910         $(PERL_INC)/nostdio.h           \
2911         $(PERL_INC)/objXSUB.h           \
2912         $(PERL_INC)/op.h                \
2913         $(PERL_INC)/opcode.h            \
2914         $(PERL_INC)/opnames.h           \
2915         $(PERL_INC)/patchlevel.h        \
2916         $(PERL_INC)/perl.h              \
2917         $(PERL_INC)/perlapi.h           \
2918         $(PERL_INC)/perlio.h            \
2919         $(PERL_INC)/perlsdio.h          \
2920         $(PERL_INC)/perlsfio.h          \
2921         $(PERL_INC)/perlvars.h          \
2922         $(PERL_INC)/perly.h             \
2923         $(PERL_INC)/pp.h                \
2924         $(PERL_INC)/pp_proto.h          \
2925         $(PERL_INC)/proto.h             \
2926         $(PERL_INC)/regcomp.h           \
2927         $(PERL_INC)/regexp.h            \
2928         $(PERL_INC)/regnodes.h          \
2929         $(PERL_INC)/scope.h             \
2930         $(PERL_INC)/sv.h                \
2931         $(PERL_INC)/thrdvar.h           \
2932         $(PERL_INC)/thread.h            \
2933         $(PERL_INC)/unixish.h           \
2934         $(PERL_INC)/utf8.h              \
2935         $(PERL_INC)/util.h              \
2936         $(PERL_INC)/warnings.h
2937
2938 $(OBJECT) : $(PERL_HDRS)
2939 } if $self->{OBJECT};
2940
2941     push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
2942
2943     join "\n", @m;
2944 }
2945
2946 =item ppd
2947
2948 Defines target that creates a PPD (Perl Package Description) file
2949 for a binary distribution.
2950
2951 =cut
2952
2953 sub ppd {
2954     my($self) = @_;
2955     my(@m);
2956     if ($self->{ABSTRACT_FROM}){
2957         $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2958             Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
2959     }
2960     my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
2961     push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
2962     push(@m, "ppd:\n");
2963     push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
2964     push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
2965     my $abstract = $self->{ABSTRACT};
2966     $abstract =~ s/\n/\\n/sg;
2967     $abstract =~ s/</&lt;/g;
2968     $abstract =~ s/>/&gt;/g;
2969     push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
2970     my ($author) = $self->{AUTHOR};
2971     $author =~ s/</&lt;/g;
2972     $author =~ s/>/&gt;/g;
2973     $author =~ s/@/\\@/g;
2974     push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
2975     push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
2976     my ($prereq);
2977     foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
2978         my $pre_req = $prereq;
2979         $pre_req =~ s/::/-/g;
2980         my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
2981         push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
2982     }
2983     push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
2984     push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
2985     my ($bin_location) = $self->{BINARY_LOCATION};
2986     $bin_location =~ s/\\/\\\\/g;
2987     if ($self->{PPM_INSTALL_SCRIPT}) {
2988         if ($self->{PPM_INSTALL_EXEC}) {
2989             push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2990         }
2991         else {
2992             push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2993         }
2994     }
2995     push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
2996     push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
2997     push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
2998
2999     join("", @m);   
3000 }
3001
3002 =item perm_rw (o)
3003
3004 Returns the attribute C<PERM_RW> or the string C<644>.
3005 Used as the string that is passed
3006 to the C<chmod> command to set the permissions for read/writeable files.
3007 MakeMaker chooses C<644> because it has turned out in the past that
3008 relying on the umask provokes hard-to-track bug reports.
3009 When the return value is used by the perl function C<chmod>, it is
3010 interpreted as an octal value.
3011
3012 =cut
3013
3014 sub perm_rw {
3015     shift->{PERM_RW} || "644";
3016 }
3017
3018 =item perm_rwx (o)
3019
3020 Returns the attribute C<PERM_RWX> or the string C<755>,
3021 i.e. the string that is passed
3022 to the C<chmod> command to set the permissions for executable files.
3023 See also perl_rw.
3024
3025 =cut
3026
3027 sub perm_rwx {
3028     shift->{PERM_RWX} || "755";
3029 }
3030
3031 =item pm_to_blib
3032
3033 Defines target that copies all files in the hash PM to their
3034 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
3035
3036 =cut
3037
3038 sub pm_to_blib {
3039     my $self = shift;
3040     my($autodir) = $self->catdir('$(INST_LIB)','auto');
3041     return q{
3042 pm_to_blib: $(TO_INST_PM)
3043         }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
3044         "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
3045         -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
3046         }.$self->{NOECHO}.q{$(TOUCH) $@
3047 };
3048 }
3049
3050 =item post_constants (o)
3051
3052 Returns an empty string per default. Dedicated to overrides from
3053 within Makefile.PL after all constants have been defined.
3054
3055 =cut
3056
3057 sub post_constants{
3058     my($self) = shift;
3059     "";
3060 }
3061
3062 =item post_initialize (o)
3063
3064 Returns an empty string per default. Used in Makefile.PLs to add some
3065 chunk of text to the Makefile after the object is initialized.
3066
3067 =cut
3068
3069 sub post_initialize {
3070     my($self) = shift;
3071     "";
3072 }
3073
3074 =item postamble (o)
3075
3076 Returns an empty string. Can be used in Makefile.PLs to write some
3077 text to the Makefile at the end.
3078
3079 =cut
3080
3081 sub postamble {
3082     my($self) = shift;
3083     "";
3084 }
3085
3086 =item prefixify
3087
3088 Check a path variable in $self from %Config, if it contains a prefix,
3089 and replace it with another one.
3090
3091 Takes as arguments an attribute name, a search prefix and a
3092 replacement prefix. Changes the attribute in the object.
3093
3094 =cut
3095
3096 sub prefixify {
3097     my($self,$var,$sprefix,$rprefix) = @_;
3098     $self->{uc $var} ||= $Config{lc $var};
3099     $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
3100     $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/s;
3101 }
3102
3103 =item processPL (o)
3104
3105 Defines targets to run *.PL files.
3106
3107 =cut
3108
3109 sub processPL {
3110     my($self) = shift;
3111     return "" unless $self->{PL_FILES};
3112     my(@m, $plfile);
3113     foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3114         my $list = ref($self->{PL_FILES}->{$plfile})
3115                 ? $self->{PL_FILES}->{$plfile}
3116                 : [$self->{PL_FILES}->{$plfile}];
3117         foreach $target (@$list) {
3118         push @m, "
3119 all :: $target
3120         $self->{NOECHO}\$(NOOP)
3121
3122 $target :: $plfile
3123         \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target
3124 ";
3125         }
3126     }
3127     join "", @m;
3128 }
3129
3130 =item realclean (o)
3131
3132 Defines the realclean target.
3133
3134 =cut
3135
3136 sub realclean {
3137     my($self, %attribs) = @_;
3138     my(@m);
3139     push(@m,'
3140 # Delete temporary files (via clean) and also delete installed files
3141 realclean purge ::  clean
3142 ');
3143     # realclean subdirectories first (already cleaned)
3144     my $sub = ($Is_Win32  &&  Win32::IsWin95()) ?
3145       "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
3146       "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
3147     foreach(@{$self->{DIR}}){
3148         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
3149         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
3150     }
3151     push(@m, "  $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
3152     if( $self->has_link_code ){
3153         push(@m, "      $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
3154         push(@m, "      $self->{RM_F} \$(INST_STATIC)\n");
3155     }
3156     # Issue a several little RM_F commands rather than risk creating a
3157     # very long command line (useful for extensions such as Encode
3158     # that have many files).
3159     if (keys %{$self->{PM}}) {
3160         my $line = "";
3161         foreach (values %{$self->{PM}}) {
3162             if (length($line) + length($_) > 80) {
3163                 push @m, "\t$self->{RM_F} $line\n";
3164                 $line = $_;
3165             }
3166             else {
3167                 $line .= " $_"; 
3168             }
3169         }
3170     push @m, "\t$self->{RM_F} $line\n" if $line;
3171     }
3172     my(@otherfiles) = ($self->{MAKEFILE},
3173                        "$self->{MAKEFILE}.old"); # Makefiles last
3174     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
3175     push(@m, "  $self->{RM_RF} @otherfiles\n") if @otherfiles;
3176     push(@m, "  $attribs{POSTOP}\n")       if $attribs{POSTOP};
3177     join("", @m);
3178 }
3179
3180 =item replace_manpage_separator
3181
3182 Takes the name of a package, which may be a nested package, in the
3183 form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
3184
3185 =cut
3186
3187 sub replace_manpage_separator {
3188     my($self,$man) = @_;
3189         if ($^O eq 'uwin') {
3190             $man =~ s,/+,.,g;
3191         } elsif ($Is_Dos) {
3192             $man =~ s,/+,__,g;
3193         } else {
3194             $man =~ s,/+,::,g;
3195         }
3196     $man;
3197 }
3198
3199 =item static (o)
3200
3201 Defines the static target.
3202
3203 =cut
3204
3205 sub static {
3206 # --- Static Loading Sections ---
3207
3208     my($self) = shift;
3209     '
3210 ## $(INST_PM) has been moved to the all: target.
3211 ## It remains here for awhile to allow for old usage: "make static"
3212 #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
3213 static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
3214         '.$self->{NOECHO}.'$(NOOP)
3215 ';
3216 }
3217
3218 =item static_lib (o)
3219
3220 Defines how to produce the *.a (or equivalent) files.
3221
3222 =cut
3223
3224 sub static_lib {
3225     my($self) = @_;
3226 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
3227 #    return '' unless $self->needs_linking(); #might be because of a subdir
3228
3229     return '' unless $self->has_link_code;
3230
3231     my(@m);
3232     push(@m, <<'END');
3233 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
3234         $(RM_RF) $@
3235 END
3236     # If this extension has it's own library (eg SDBM_File)
3237     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3238     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
3239
3240     my $ar; 
3241     if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
3242         # Prefer the absolute pathed ar if available so that PATH
3243         # doesn't confuse us.  Perl itself is built with the full_ar.  
3244         $ar = 'FULL_AR';
3245     } else {
3246         $ar = 'AR';
3247     }
3248     push @m,
3249         "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
3250     push @m,
3251 q{      $(CHMOD) $(PERM_RWX) $@
3252         }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
3253 };
3254     # Old mechanism - still available:
3255     push @m,
3256 "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3257 }       if $self->{PERL_SRC} && $self->{EXTRALIBS};
3258     push @m, "\n";
3259
3260     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3261     join('', "\n",@m);
3262 }
3263
3264 =item staticmake (o)
3265
3266 Calls makeaperl.
3267
3268 =cut
3269
3270 sub staticmake {
3271     my($self, %attribs) = @_;
3272     my(@static);
3273
3274     my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
3275
3276     # And as it's not yet built, we add the current extension
3277     # but only if it has some C code (or XS code, which implies C code)
3278     if (@{$self->{C}}) {
3279         @static = $self->catfile($self->{INST_ARCHLIB},
3280                                  "auto",
3281                                  $self->{FULLEXT},
3282                                  "$self->{BASEEXT}$self->{LIB_EXT}"
3283                                 );
3284     }
3285
3286     # Either we determine now, which libraries we will produce in the
3287     # subdirectories or we do it at runtime of the make.
3288
3289     # We could ask all subdir objects, but I cannot imagine, why it
3290     # would be necessary.
3291
3292     # Instead we determine all libraries for the new perl at
3293     # runtime.
3294     my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
3295
3296     $self->makeaperl(MAKE       => $self->{MAKEFILE},
3297                      DIRS       => \@searchdirs,
3298                      STAT       => \@static,
3299                      INCL       => \@perlinc,
3300                      TARGET     => $self->{MAP_TARGET},
3301                      TMP        => "",
3302                      LIBPERL    => $self->{LIBPERL_A}
3303                     );
3304 }
3305
3306 =item subdir_x (o)
3307
3308 Helper subroutine for subdirs
3309
3310 =cut
3311
3312 sub subdir_x {
3313     my($self, $subdir) = @_;
3314     my(@m);
3315     if ($Is_Win32 && Win32::IsWin95()) {
3316         if ($Config{'make'} =~ /dmake/i) {
3317             # dmake-specific
3318             return <<EOT;
3319 subdirs ::
3320 @[
3321         cd $subdir
3322         \$(MAKE) all \$(PASTHRU)
3323         cd ..
3324 ]
3325 EOT
3326         } elsif ($Config{'make'} =~ /nmake/i) {
3327             # nmake-specific
3328             return <<EOT;
3329 subdirs ::
3330         cd $subdir
3331         \$(MAKE) all \$(PASTHRU)
3332         cd ..
3333 EOT
3334         }
3335     } else {
3336         return <<EOT;
3337
3338 subdirs ::
3339         $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
3340
3341 EOT
3342     }
3343 }
3344
3345 =item subdirs (o)
3346
3347 Defines targets to process subdirectories.
3348
3349 =cut
3350
3351 sub subdirs {
3352 # --- Sub-directory Sections ---
3353     my($self) = shift;
3354     my(@m,$dir);
3355     # This method provides a mechanism to automatically deal with
3356     # subdirectories containing further Makefile.PL scripts.
3357     # It calls the subdir_x() method for each subdirectory.
3358     foreach $dir (@{$self->{DIR}}){
3359         push(@m, $self->subdir_x($dir));
3360 ####    print "Including $dir subdirectory\n";
3361     }
3362     if (@m){
3363         unshift(@m, "
3364 # The default clean, realclean and test targets in this Makefile
3365 # have automatically been given entries for each subdir.
3366
3367 ");
3368     } else {
3369         push(@m, "\n# none")
3370     }
3371     join('',@m);
3372 }
3373
3374 =item test (o)
3375
3376 Defines the test targets.
3377
3378 =cut
3379
3380 sub test {
3381 # --- Test and Installation Sections ---
3382
3383     my($self, %attribs) = @_;
3384     my $tests = $attribs{TESTS};
3385     if (!$tests && -d 't') {
3386         $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
3387     }
3388     # note: 'test.pl' name is also hardcoded in init_dirscan()
3389     my(@m);
3390     push(@m,"
3391 TEST_VERBOSE=0
3392 TEST_TYPE=test_\$(LINKTYPE)
3393 TEST_FILE = test.pl
3394 TEST_FILES = $tests
3395 TESTDB_SW = -d
3396
3397 testdb :: testdb_\$(LINKTYPE)
3398
3399 test :: \$(TEST_TYPE)
3400 ");
3401     push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
3402                  @{$self->{DIR}}));
3403     push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
3404         unless $tests or -f "test.pl" or @{$self->{DIR}};
3405     push(@m, "\n");
3406
3407     push(@m, "test_dynamic :: pure_all\n");
3408     push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
3409     push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
3410     push(@m, "\n");
3411
3412     push(@m, "testdb_dynamic :: pure_all\n");
3413     push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
3414     push(@m, "\n");
3415
3416     # Occasionally we may face this degenerate target:
3417     push @m, "test_ : test_dynamic\n\n";
3418
3419     if ($self->needs_linking()) {
3420         push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
3421         push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
3422         push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
3423         push(@m, "\n");
3424         push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
3425         push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
3426         push(@m, "\n");
3427     } else {
3428         push @m, "test_static :: test_dynamic\n";
3429         push @m, "testdb_static :: testdb_dynamic\n";
3430     }
3431     join("", @m);
3432 }
3433
3434 =item test_via_harness (o)
3435
3436 Helper method to write the test targets
3437
3438 =cut
3439
3440 sub test_via_harness {
3441     my($self, $perl, $tests) = @_;
3442     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3443     "\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";
3444 }
3445
3446 =item test_via_script (o)
3447
3448 Other helper method for test.
3449
3450 =cut
3451
3452 sub test_via_script {
3453     my($self, $perl, $script) = @_;
3454     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3455     qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
3456 };
3457 }
3458
3459 =item tool_autosplit (o)
3460
3461 Defines a simple perl call that runs autosplit. May be deprecated by
3462 pm_to_blib soon.
3463
3464 =cut
3465
3466 sub tool_autosplit {
3467 # --- Tool Sections ---
3468
3469     my($self, %attribs) = @_;
3470     my($asl) = "";
3471     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
3472     q{
3473 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
3474 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
3475 };
3476 }
3477
3478 =item tools_other (o)
3479
3480 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
3481 the Makefile. Also defines the perl programs MKPATH,
3482 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
3483
3484 =cut
3485
3486 sub tools_other {
3487     my($self) = shift;
3488     my @m;
3489     my $bin_sh = $Config{sh} || '/bin/sh';
3490     push @m, qq{
3491 SHELL = $bin_sh
3492 };
3493
3494     for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
3495         push @m, "$_ = $self->{$_}\n";
3496     }
3497
3498     push @m, q{
3499 # The following is a portable way to say mkdir -p
3500 # To see which directories are created, change the if 0 to if 1
3501 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
3502
3503 # This helps us to minimize the effect of the .exists files A yet
3504 # better solution would be to have a stable file in the perl
3505 # distribution with a timestamp of zero. But this solution doesn't
3506 # need any changes to the core distribution and works with older perls
3507 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
3508 };
3509
3510
3511     return join "", @m if $self->{PARENT};
3512
3513     push @m, q{
3514 # Here we warn users that an old packlist file was found somewhere,
3515 # and that they should call some uninstall routine
3516 WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
3517 -e 'print "WARNING: I have found an old package in\n";' \\
3518 -e 'print "\t$$ARGV[0].\n";' \\
3519 -e 'print "Please make sure the two installations are not conflicting\n";'
3520
3521 UNINST=0
3522 VERBINST=0
3523
3524 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
3525 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
3526
3527 DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
3528 -e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", $$arg=shift, "|", $$arg, ">";' \
3529 -e 'print "=over 4";' \
3530 -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
3531 -e 'print "=back";'
3532
3533 UNINSTALL =   $(PERL) -MExtUtils::Install \
3534 -e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
3535 -e 'print " packlist above carefully.\n  There may be errors. Remove the";' \
3536 -e 'print " appropriate files manually.\n  Sorry for the inconveniences.\n"'
3537 };
3538
3539     return join "", @m;
3540 }
3541
3542 =item tool_xsubpp (o)
3543
3544 Determines typemaps, xsubpp version, prototype behaviour.
3545
3546 =cut
3547
3548 sub tool_xsubpp {
3549     my($self) = shift;
3550     return "" unless $self->needs_linking;
3551     my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
3552     my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3553     if( $self->{TYPEMAPS} ){
3554         my $typemap;
3555         foreach $typemap (@{$self->{TYPEMAPS}}){
3556                 if( ! -f  $typemap ){
3557                         warn "Typemap $typemap not found.\n";
3558                 }
3559                 else{
3560                         push(@tmdeps,  $typemap);
3561                 }
3562         }
3563     }
3564     push(@tmdeps, "typemap") if -f "typemap";
3565     my(@tmargs) = map("-typemap $_", @tmdeps);
3566     if( exists $self->{XSOPT} ){
3567         unshift( @tmargs, $self->{XSOPT} );
3568     }
3569
3570
3571     my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
3572
3573     # What are the correct thresholds for version 1 && 2 Paul?
3574     if ( $xsubpp_version > 1.923 ){
3575         $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3576     } else {
3577         if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3578             print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3579         Your version of xsubpp is $xsubpp_version and cannot handle this.
3580         Please upgrade to a more recent version of xsubpp.
3581 };
3582         } else {
3583             $self->{XSPROTOARG} = "";
3584         }
3585     }
3586
3587     my $xsubpp = "xsubpp";
3588
3589     return qq{
3590 XSUBPPDIR = $xsdir
3591 XSUBPP = \$(XSUBPPDIR)/$xsubpp
3592 XSPROTOARG = $self->{XSPROTOARG}
3593 XSUBPPDEPS = @tmdeps \$(XSUBPP)
3594 XSUBPPARGS = @tmargs
3595 };
3596 };
3597
3598 sub xsubpp_version
3599 {
3600     my($self,$xsubpp) = @_;
3601     return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
3602
3603     my ($version) ;
3604
3605     # try to figure out the version number of the xsubpp on the system
3606
3607     # first try the -v flag, introduced in 1.921 & 2.000a2
3608
3609     return "" unless $self->needs_linking;
3610
3611     my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3612     print "Running $command\n" if $Verbose >= 2;
3613     $version = `$command` ;
3614     warn "Running '$command' exits with status " . ($?>>8) if $?;
3615     chop $version ;
3616
3617     return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
3618
3619     # nope, then try something else
3620
3621     my $counter = '000';
3622     my ($file) = 'temp' ;
3623     $counter++ while -e "$file$counter"; # don't overwrite anything
3624     $file .= $counter;
3625
3626     open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3627     print F <<EOM ;
3628 MODULE = fred PACKAGE = fred
3629
3630 int
3631 fred(a)
3632         int     a;
3633 EOM
3634
3635     close F ;
3636
3637     $command = "$self->{PERL} $xsubpp $file 2>&1";
3638     print "Running $command\n" if $Verbose >= 2;
3639     my $text = `$command` ;
3640     warn "Running '$command' exits with status " . ($?>>8) if $?;
3641     unlink $file ;
3642
3643     # gets 1.2 -> 1.92 and 2.000a1
3644     return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
3645
3646     # it is either 1.0 or 1.1
3647     return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3648
3649     # none of the above, so 1.0
3650     return $Xsubpp_Version = "1.0" ;
3651 }
3652
3653 =item top_targets (o)
3654
3655 Defines the targets all, subdirs, config, and O_FILES
3656
3657 =cut
3658
3659 sub top_targets {
3660 # --- Target Sections ---
3661
3662     my($self) = shift;
3663     my(@m);
3664     push @m, '
3665 #all :: config $(INST_PM) subdirs linkext manifypods
3666 ';
3667
3668     push @m, '
3669 all :: pure_all htmlifypods manifypods
3670         '.$self->{NOECHO}.'$(NOOP)
3671
3672           unless $self->{SKIPHASH}{'all'};
3673     
3674     push @m, '
3675 pure_all :: config pm_to_blib subdirs linkext
3676         '.$self->{NOECHO}.'$(NOOP)
3677
3678 subdirs :: $(MYEXTLIB)
3679         '.$self->{NOECHO}.'$(NOOP)
3680
3681 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3682         '.$self->{NOECHO}.'$(NOOP)
3683
3684 config :: $(INST_ARCHAUTODIR)/.exists
3685         '.$self->{NOECHO}.'$(NOOP)
3686
3687 config :: $(INST_AUTODIR)/.exists
3688         '.$self->{NOECHO}.'$(NOOP)
3689 ';
3690
3691     push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3692
3693     if (%{$self->{HTMLLIBPODS}}) {
3694         push @m, qq[
3695 config :: \$(INST_HTMLLIBDIR)/.exists
3696         $self->{NOECHO}\$(NOOP)
3697
3698 ];
3699         push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
3700     }
3701
3702     if (%{$self->{HTMLSCRIPTPODS}}) {
3703         push @m, qq[
3704 config :: \$(INST_HTMLSCRIPTDIR)/.exists
3705         $self->{NOECHO}\$(NOOP)
3706
3707 ];
3708         push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
3709     }
3710
3711     if (%{$self->{MAN1PODS}}) {
3712         push @m, qq[
3713 config :: \$(INST_MAN1DIR)/.exists
3714         $self->{NOECHO}\$(NOOP)
3715
3716 ];
3717         push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
3718     }
3719     if (%{$self->{MAN3PODS}}) {
3720         push @m, qq[
3721 config :: \$(INST_MAN3DIR)/.exists
3722         $self->{NOECHO}\$(NOOP)
3723
3724 ];
3725         push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
3726     }
3727
3728     push @m, '
3729 $(O_FILES): $(H_FILES)
3730 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
3731
3732     push @m, q{
3733 help:
3734         perldoc ExtUtils::MakeMaker
3735 };
3736
3737     push @m, q{
3738 Version_check:
3739         }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3740                 -MExtUtils::MakeMaker=Version_check \
3741                 -e "Version_check('$(MM_VERSION)')"
3742 };
3743
3744     join('',@m);
3745 }
3746
3747 =item writedoc
3748
3749 Obsolete, deprecated method. Not used since Version 5.21.
3750
3751 =cut
3752
3753 sub writedoc {
3754 # --- perllocal.pod section ---
3755     my($self,$what,$name,@attribs)=@_;
3756     my $time = localtime;
3757     print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3758     print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3759     print "\n\n=back\n\n";
3760 }
3761
3762 =item xs_c (o)
3763
3764 Defines the suffix rules to compile XS files to C.
3765
3766 =cut
3767
3768 sub xs_c {
3769     my($self) = shift;
3770     return '' unless $self->needs_linking();
3771     '
3772 .xs.c:
3773         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
3774 ';
3775 }
3776
3777 =item xs_cpp (o)
3778
3779 Defines the suffix rules to compile XS files to C++.
3780
3781 =cut
3782
3783 sub xs_cpp {
3784     my($self) = shift;
3785     return '' unless $self->needs_linking();
3786     '
3787 .xs.cpp:
3788         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
3789 ';
3790 }
3791
3792 =item xs_o (o)
3793
3794 Defines suffix rules to go from XS to object files directly. This is
3795 only intended for broken make implementations.
3796
3797 =cut
3798
3799 sub xs_o {      # many makes are too dumb to use xs_c then c_o
3800     my($self) = shift;
3801     return '' unless $self->needs_linking();
3802     '
3803 .xs$(OBJ_EXT):
3804         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
3805         $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
3806 ';
3807 }
3808
3809 =item perl_archive
3810
3811 This is internal method that returns path to libperl.a equivalent
3812 to be linked to dynamic extensions. UNIX does not have one but OS2
3813 and Win32 do.
3814
3815 =cut 
3816
3817 sub perl_archive
3818 {
3819  return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos";
3820  return "";
3821 }
3822
3823 =item export_list
3824
3825 This is internal method that returns name of a file that is
3826 passed to linker to define symbols to be exported.
3827 UNIX does not have one but OS2 and Win32 do.
3828
3829 =cut 
3830
3831 sub export_list
3832 {
3833  return "";
3834 }
3835
3836
3837 1;
3838
3839 =back
3840
3841 =head1 SEE ALSO
3842
3843 L<ExtUtils::MakeMaker>
3844
3845 =cut
3846
3847 __END__