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