close open file before chmod() (from Rocco Caputo <troc@netrus.net>)
[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.
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     join "", @m;
844 }
845
846 =item dist_ci (o)
847
848 Defines a check in target for RCS.
849
850 =cut
851
852 sub dist_ci {
853     my($self) = shift;
854     my @m;
855     push @m, q{
856 ci :
857         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
858                 -e "@all = keys %{ maniread() };" \\
859                 -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
860                 -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
861 };
862     join "", @m;
863 }
864
865 =item dist_core (o)
866
867 Defines the targets dist, tardist, zipdist, uutardist, shdist
868
869 =cut
870
871 sub dist_core {
872     my($self) = shift;
873     my @m;
874     push @m, q{
875 dist : $(DIST_DEFAULT)
876         }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
877             -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
878
879 tardist : $(DISTVNAME).tar$(SUFFIX)
880
881 zipdist : $(DISTVNAME).zip
882
883 $(DISTVNAME).tar$(SUFFIX) : distdir
884         $(PREOP)
885         $(TO_UNIX)
886         $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
887         $(RM_RF) $(DISTVNAME)
888         $(COMPRESS) $(DISTVNAME).tar
889         $(POSTOP)
890
891 $(DISTVNAME).zip : distdir
892         $(PREOP)
893         $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
894         $(RM_RF) $(DISTVNAME)
895         $(POSTOP)
896
897 uutardist : $(DISTVNAME).tar$(SUFFIX)
898         uuencode $(DISTVNAME).tar$(SUFFIX) \\
899                 $(DISTVNAME).tar$(SUFFIX) > \\
900                 $(DISTVNAME).tar$(SUFFIX)_uu
901
902 shdist : distdir
903         $(PREOP)
904         $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
905         $(RM_RF) $(DISTVNAME)
906         $(POSTOP)
907 };
908     join "", @m;
909 }
910
911 =item dist_dir (o)
912
913 Defines the scratch directory target that will hold the distribution
914 before tar-ing (or shar-ing).
915
916 =cut
917
918 sub dist_dir {
919     my($self) = shift;
920     my @m;
921     push @m, q{
922 distdir :
923         $(RM_RF) $(DISTVNAME)
924         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
925                 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
926 };
927     join "", @m;
928 }
929
930 =item dist_test (o)
931
932 Defines a target that produces the distribution in the
933 scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
934 subdirectory.
935
936 =cut
937
938 sub dist_test {
939     my($self) = shift;
940     my @m;
941     push @m, q{
942 disttest : distdir
943         cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
944         cd $(DISTVNAME) && $(MAKE)
945         cd $(DISTVNAME) && $(MAKE) test
946 };
947     join "", @m;
948 }
949
950 =item dlsyms (o)
951
952 Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
953 files.
954
955 =cut
956
957 sub dlsyms {
958     my($self,%attribs) = @_;
959
960     return '' unless ($^O eq 'aix' && $self->needs_linking() );
961
962     my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
963     my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
964     my($funclist)  = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
965     my(@m);
966
967     push(@m,"
968 dynamic :: $self->{BASEEXT}.exp
969
970 ") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
971
972     push(@m,"
973 static :: $self->{BASEEXT}.exp
974
975 ") unless $self->{SKIPHASH}{'static'};  # we avoid a warning if we tick them
976
977     push(@m,"
978 $self->{BASEEXT}.exp: Makefile.PL
979 ",'     $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
980         Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
981         neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
982         ', "DL_VARS" => ', neatvalue($vars), ');\'
983 ');
984
985     join('',@m);
986 }
987
988 =item dynamic (o)
989
990 Defines the dynamic target.
991
992 =cut
993
994 sub dynamic {
995 # --- Dynamic Loading Sections ---
996
997     my($self) = shift;
998     '
999 ## $(INST_PM) has been moved to the all: target.
1000 ## It remains here for awhile to allow for old usage: "make dynamic"
1001 #dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
1002 dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
1003         '.$self->{NOECHO}.'$(NOOP)
1004 ';
1005 }
1006
1007 =item dynamic_bs (o)
1008
1009 Defines targets for bootstrap files.
1010
1011 =cut
1012
1013 sub dynamic_bs {
1014     my($self, %attribs) = @_;
1015     return '
1016 BOOTSTRAP =
1017 ' unless $self->has_link_code();
1018
1019     return '
1020 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1021
1022 # As Mkbootstrap might not write a file (if none is required)
1023 # we use touch to prevent make continually trying to remake it.
1024 # The DynaLoader only reads a non-empty file.
1025 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
1026         '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1027         '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
1028                 -MExtUtils::Mkbootstrap \
1029                 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
1030         '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
1031         $(CHMOD) $(PERM_RW) $@
1032
1033 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
1034         '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
1035         -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
1036         $(CHMOD) $(PERM_RW) $@
1037 ';
1038 }
1039
1040 =item dynamic_lib (o)
1041
1042 Defines how to produce the *.so (or equivalent) files.
1043
1044 =cut
1045
1046 sub dynamic_lib {
1047     my($self, %attribs) = @_;
1048     return '' unless $self->needs_linking(); #might be because of a subdir
1049
1050     return '' unless $self->has_link_code;
1051
1052     my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1053     my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
1054     my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
1055     my($ldfrom) = '$(LDFROM)';
1056     $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
1057     my(@m);
1058     push(@m,'
1059 # This section creates the dynamically loadable $(INST_DYNAMIC)
1060 # from $(OBJECT) and possibly $(MYEXTLIB).
1061 ARMAYBE = '.$armaybe.'
1062 OTHERLDFLAGS = '.$otherldflags.'
1063 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
1064
1065 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
1066 ');
1067     if ($armaybe ne ':'){
1068         $ldfrom = 'tmp$(LIB_EXT)';
1069         push(@m,'       $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
1070         push(@m,'       $(RANLIB) '."$ldfrom\n");
1071     }
1072     $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
1073
1074     # Brain dead solaris linker does not use LD_RUN_PATH?
1075     # This fixes dynamic extensions which need shared libs
1076     my $ldrun = '';
1077     $ldrun = join ' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}
1078        if ($^O eq 'solaris');
1079
1080     # The IRIX linker also doesn't use LD_RUN_PATH
1081     $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
1082         if ($^O eq 'irix' && $self->{LD_RUN_PATH});
1083
1084     push(@m,'   LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
1085                 ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
1086     push @m, '
1087         $(CHMOD) $(PERM_RWX) $@
1088 ';
1089
1090     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1091     join('',@m);
1092 }
1093
1094 =item exescan
1095
1096 Deprecated method. Use libscan instead.
1097
1098 =cut
1099
1100 sub exescan {
1101     my($self,$path) = @_;
1102     $path;
1103 }
1104
1105 =item extliblist
1106
1107 Called by init_others, and calls ext ExtUtils::Liblist. See
1108 L<ExtUtils::Liblist> for details.
1109
1110 =cut
1111
1112 sub extliblist {
1113     my($self,$libs) = @_;
1114     require ExtUtils::Liblist;
1115     $self->ext($libs, $Verbose);
1116 }
1117
1118 =item file_name_is_absolute
1119
1120 Takes as argument a path and returns true, if it is an absolute path.
1121
1122 =cut
1123
1124 sub file_name_is_absolute {
1125     my($self,$file) = @_;
1126     if ($Is_Dos){
1127         $file =~ m{^([a-z]:)?[\\/]}is ;
1128     }
1129     else {
1130         $file =~ m:^/:s ;
1131     }
1132 }
1133
1134 =item find_perl
1135
1136 Finds the executables PERL and FULLPERL
1137
1138 =cut
1139
1140 sub find_perl {
1141     my($self, $ver, $names, $dirs, $trace) = @_;
1142     my($name, $dir);
1143     if ($trace >= 2){
1144         print "Looking for perl $ver by these names:
1145 @$names
1146 in these dirs:
1147 @$dirs
1148 ";
1149     }
1150     foreach $dir (@$dirs){
1151         next unless defined $dir; # $self->{PERL_SRC} may be undefined
1152         foreach $name (@$names){
1153             my ($abs, $val);
1154             if ($self->file_name_is_absolute($name)) { # /foo/bar
1155                 $abs = $name;
1156             } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1157                 $abs = $self->catfile($dir, $name);
1158             } else { # foo/bar
1159                 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1160             }
1161             print "Checking $abs\n" if ($trace >= 2);
1162             next unless $self->maybe_command($abs);
1163             print "Executing $abs\n" if ($trace >= 2);
1164             $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1165             if ($val =~ /VER_OK/) {
1166                 print "Using PERL=$abs\n" if $trace;
1167                 return $abs;
1168             } elsif ($trace >= 2) {
1169                 print "Result: `$val'\n";
1170             }
1171         }
1172     }
1173     print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1174     0; # false and not empty
1175 }
1176
1177 =back
1178
1179 =head2 Methods to actually produce chunks of text for the Makefile
1180
1181 The methods here are called for each MakeMaker object in the order
1182 specified by @ExtUtils::MakeMaker::MM_Sections.
1183
1184 =over 2
1185
1186 =item fixin
1187
1188 Inserts the sharpbang or equivalent magic number to a script
1189
1190 =cut
1191
1192 sub fixin { # stolen from the pink Camel book, more or less
1193     my($self,@files) = @_;
1194     my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/;
1195     my($file,$interpreter);
1196     for $file (@files) {
1197         local(*FIXIN);
1198         local(*FIXOUT);
1199         open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
1200         local $/ = "\n";
1201         chomp(my $line = <FIXIN>);
1202         next unless $line =~ s/^\s*\#!\s*//;     # Not a shbang file.
1203         # Now figure out the interpreter name.
1204         my($cmd,$arg) = split ' ', $line, 2;
1205         $cmd =~ s!^.*/!!;
1206
1207         # Now look (in reverse) for interpreter in absolute PATH (unless perl).
1208         if ($cmd eq "perl") {
1209             if ($Config{startperl} =~ m,^\#!.*/perl,) {
1210                 $interpreter = $Config{startperl};
1211                 $interpreter =~ s,^\#!,,;
1212             } else {
1213                 $interpreter = $Config{perlpath};
1214             }
1215         } else {
1216             my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
1217             $interpreter = '';
1218             my($dir);
1219             foreach $dir (@absdirs) {
1220                 if ($self->maybe_command($cmd)) {
1221                     warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
1222                     $interpreter = $self->catfile($dir,$cmd);
1223                 }
1224             }
1225         }
1226         # Figure out how to invoke interpreter on this machine.
1227
1228         my($shb) = "";
1229         if ($interpreter) {
1230             print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
1231             # this is probably value-free on DOSISH platforms
1232             if ($does_shbang) {
1233                 $shb .= "$Config{'sharpbang'}$interpreter";
1234                 $shb .= ' ' . $arg if defined $arg;
1235                 $shb .= "\n";
1236             }
1237             $shb .= qq{
1238 eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
1239     if 0; # not running under some shell
1240 } unless $Is_Win32; # this won't work on win32, so don't
1241         } else {
1242             warn "Can't find $cmd in PATH, $file unchanged"
1243                 if $Verbose;
1244             next;
1245         }
1246
1247         unless ( open(FIXOUT,">$file.new") ) {
1248             warn "Can't create new $file: $!\n";
1249             next;
1250         }
1251         my($dev,$ino,$mode) = stat FIXIN;
1252         
1253         # Print out the new #! line (or equivalent).
1254         local $\;
1255         undef $/;
1256         print FIXOUT $shb, <FIXIN>;
1257         close FIXIN;
1258         close FIXOUT;
1259
1260         # can't rename/chmod open files on some DOSISH platforms
1261
1262         # If they override perm_rwx, we won't notice it during fixin,
1263         # because fixin is run through a new instance of MakeMaker.
1264         # That is why we must run another CHMOD later.
1265         $mode = oct($self->perm_rwx) unless $dev;
1266         chmod $mode, $file;
1267
1268         unless ( rename($file, "$file.bak") ) { 
1269             warn "Can't rename $file to $file.bak: $!";
1270             next;
1271         }
1272         unless ( rename("$file.new", $file) ) { 
1273             warn "Can't rename $file.new to $file: $!";
1274             unless ( rename("$file.bak", $file) ) {
1275                 warn "Can't rename $file.bak back to $file either: $!";
1276                 warn "Leaving $file renamed as $file.bak\n";
1277             }
1278             next;
1279         }
1280         unlink "$file.bak";
1281     } continue {
1282         close(FIXIN) if fileno(FIXIN);
1283         chmod oct($self->perm_rwx), $file or
1284           die "Can't reset permissions for $file: $!\n";
1285         system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
1286     }
1287 }
1288
1289 =item force (o)
1290
1291 Just writes FORCE:
1292
1293 =cut
1294
1295 sub force {
1296     my($self) = shift;
1297     '# Phony target to force checking subdirectories.
1298 FORCE:
1299         '.$self->{NOECHO}.'$(NOOP)
1300 ';
1301 }
1302
1303 =item guess_name
1304
1305 Guess the name of this package by examining the working directory's
1306 name. MakeMaker calls this only if the developer has not supplied a
1307 NAME attribute.
1308
1309 =cut
1310
1311 # ';
1312
1313 sub guess_name {
1314     my($self) = @_;
1315     use Cwd 'cwd';
1316     my $name = basename(cwd());
1317     $name =~ s|[\-_][\d\.\-]+\z||;  # this is new with MM 5.00, we
1318                                     # strip minus or underline
1319                                     # followed by a float or some such
1320     print "Warning: Guessing NAME [$name] from current directory name.\n";
1321     $name;
1322 }
1323
1324 =item has_link_code
1325
1326 Returns true if C, XS, MYEXTLIB or similar objects exist within this
1327 object that need a compiler. Does not descend into subdirectories as
1328 needs_linking() does.
1329
1330 =cut
1331
1332 sub has_link_code {
1333     my($self) = shift;
1334     return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1335     if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1336         $self->{HAS_LINK_CODE} = 1;
1337         return 1;
1338     }
1339     return $self->{HAS_LINK_CODE} = 0;
1340 }
1341
1342 =item htmlifypods (o)
1343
1344 Defines targets and routines to translate the pods into HTML manpages
1345 and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
1346 directories.
1347
1348 =cut
1349
1350 sub htmlifypods {
1351     my($self, %attribs) = @_;
1352     return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
1353         %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
1354     my($dist);
1355     my($pod2html_exe);
1356     if (defined $self->{PERL_SRC}) {
1357         $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
1358     } else {
1359         $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
1360     }
1361     unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
1362         # No pod2html but some HTMLxxxPODS to be installed
1363         print <<END;
1364
1365 Warning: I could not locate your pod2html program. Please make sure,
1366          your pod2html program is in your PATH before you execute 'make'
1367
1368 END
1369         $pod2html_exe = "-S pod2html";
1370     }
1371     my(@m);
1372     push @m,
1373 qq[POD2HTML_EXE = $pod2html_exe\n],
1374 qq[POD2HTML = \$(PERL) -we 'use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){' \\\n],
1375 q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
1376  $self->{MAKEFILE}, q[";' \\
1377 -e 'print "Htmlifying $$m{$$_}\n";' \\
1378 -e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\
1379 -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
1380 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
1381 ];
1382     push @m, "\nhtmlifypods : pure_all ";
1383     push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
1384
1385     push(@m,"\n");
1386     if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
1387         push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
1388         push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
1389     }
1390     join('', @m);
1391 }
1392
1393 =item init_dirscan
1394
1395 Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES.
1396
1397 =cut
1398
1399 sub init_dirscan {      # --- File and Directory Lists (.xs .pm .pod etc)
1400     my($self) = @_;
1401     my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1402     local(%pm); #the sub in find() has to see this hash
1403     @ignore{qw(Makefile.PL test.pl)} = (1,1);
1404     $ignore{'makefile.pl'} = 1 if $Is_VMS;
1405     foreach $name ($self->lsdir($self->curdir)){
1406         next if $name =~ /\#/;
1407         next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1408         next unless $self->libscan($name);
1409         if (-d $name){
1410             next if -l $name; # We do not support symlinks at all
1411             $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
1412         } elsif ($name =~ /\.xs\z/){
1413             my($c); ($c = $name) =~ s/\.xs\z/.c/;
1414             $xs{$name} = $c;
1415             $c{$c} = 1;
1416         } elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
1417             $c{$name} = 1
1418                 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
1419         } elsif ($name =~ /\.h\z/i){
1420             $h{$name} = 1;
1421         } elsif ($name =~ /\.PL\z/) {
1422             ($pl_files{$name} = $name) =~ s/\.PL\z// ;
1423         } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
1424             # case-insensitive filesystem, one dot per name, so foo.h.PL
1425             # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
1426             local($/); open(PL,$name); my $txt = <PL>; close PL;
1427             if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
1428                 ($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
1429             }
1430             else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); }
1431         } elsif ($name =~ /\.(p[ml]|pod)\z/){
1432             $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
1433         }
1434     }
1435
1436     # Some larger extensions often wish to install a number of *.pm/pl
1437     # files into the library in various locations.
1438
1439     # The attribute PMLIBDIRS holds an array reference which lists
1440     # subdirectories which we should search for library files to
1441     # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
1442     # recursively search through the named directories (skipping any
1443     # which don't exist or contain Makefile.PL files).
1444
1445     # For each *.pm or *.pl file found $self->libscan() is called with
1446     # the default installation path in $_[1]. The return value of
1447     # libscan defines the actual installation location.  The default
1448     # libscan function simply returns the path.  The file is skipped
1449     # if libscan returns false.
1450
1451     # The default installation location passed to libscan in $_[1] is:
1452     #
1453     #  ./*.pm           => $(INST_LIBDIR)/*.pm
1454     #  ./xyz/...        => $(INST_LIBDIR)/xyz/...
1455     #  ./lib/...        => $(INST_LIB)/...
1456     #
1457     # In this way the 'lib' directory is seen as the root of the actual
1458     # perl library whereas the others are relative to INST_LIBDIR
1459     # (which includes PARENT_NAME). This is a subtle distinction but one
1460     # that's important for nested modules.
1461
1462     $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1463         unless $self->{PMLIBDIRS};
1464
1465     #only existing directories that aren't in $dir are allowed
1466
1467     # Avoid $_ wherever possible:
1468     # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1469     my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1470     my ($pmlibdir);
1471     @{$self->{PMLIBDIRS}} = ();
1472     foreach $pmlibdir (@pmlibdirs) {
1473         -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1474     }
1475
1476     if (@{$self->{PMLIBDIRS}}){
1477         print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1478             if ($Verbose >= 2);
1479         require File::Find;
1480         File::Find::find(sub {
1481             if (-d $_){
1482                 if ($_ eq "CVS" || $_ eq "RCS"){
1483                     $File::Find::prune = 1;
1484                 }
1485                 return;
1486             }
1487             return if /\#/;
1488             my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1489             my($striplibpath,$striplibname);
1490             $prefix =  '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
1491             ($striplibname,$striplibpath) = fileparse($striplibpath);
1492             my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1493             local($_) = $inst; # for backwards compatibility
1494             $inst = $self->libscan($inst);
1495             print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1496             return unless $inst;
1497             $pm{$path} = $inst;
1498         }, @{$self->{PMLIBDIRS}});
1499     }
1500
1501     $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1502     $self->{XS}  = \%xs             unless $self->{XS};
1503     $self->{PM}  = \%pm             unless $self->{PM};
1504     $self->{C}   = [sort keys %c]   unless $self->{C};
1505     my(@o_files) = @{$self->{C}};
1506     $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files] ;
1507     $self->{H}   = [sort keys %h]   unless $self->{H};
1508     $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1509
1510     # Set up names of manual pages to generate from pods
1511     my %pods;
1512     foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) {
1513         unless ($self->{"${man}PODS"}) {
1514             $self->{"${man}PODS"} = {};
1515             $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/;
1516         }
1517     }
1518
1519     if ($pods{MAN1} || $pods{HTMLSCRIPT}) {
1520         if ( exists $self->{EXE_FILES} ) {
1521             foreach $name (@{$self->{EXE_FILES}}) {
1522                 local *FH;
1523                 my($ispod)=0;
1524                 if (open(FH,"<$name")) {
1525                     while (<FH>) {
1526                         if (/^=head1\s+\w+/) {
1527                             $ispod=1;
1528                             last;
1529                         }
1530                     }
1531                     close FH;
1532                 } else {
1533                     # If it doesn't exist yet, we assume, it has pods in it
1534                     $ispod = 1;
1535                 }
1536                 next unless $ispod;
1537                 if ($pods{HTMLSCRIPT}) {
1538                     $self->{HTMLSCRIPTPODS}->{$name} =
1539                       $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)");
1540                 }
1541                 if ($pods{MAN1}) {
1542                     $self->{MAN1PODS}->{$name} =
1543                       $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
1544                 }
1545             }
1546         }
1547     }
1548     if ($pods{MAN3} || $pods{HTMLLIB}) {
1549         my %manifypods = (); # we collect the keys first, i.e. the files
1550                              # we have to convert to pod
1551         foreach $name (keys %{$self->{PM}}) {
1552             if ($name =~ /\.pod\z/ ) {
1553                 $manifypods{$name} = $self->{PM}{$name};
1554             } elsif ($name =~ /\.p[ml]\z/ ) {
1555                 local *FH;
1556                 my($ispod)=0;
1557                 if (open(FH,"<$name")) {
1558                     while (<FH>) {
1559                         if (/^=head1\s+\w+/) {
1560                             $ispod=1;
1561                             last;
1562                         }
1563                     }
1564                     close FH;
1565                 } else {
1566                     $ispod = 1;
1567                 }
1568                 if( $ispod ) {
1569                     $manifypods{$name} = $self->{PM}{$name};
1570                 }
1571             }
1572         }
1573
1574         # Remove "Configure.pm" and similar, if it's not the only pod listed
1575         # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1576         foreach $name (keys %manifypods) {
1577             if ($name =~ /(config|setup).*\.pm/is) {
1578                 delete $manifypods{$name};
1579                 next;
1580             }
1581             my($manpagename) = $name;
1582             $manpagename =~ s/\.p(od|m|l)\z//;
1583             if ($pods{HTMLLIB}) {
1584                 $self->{HTMLLIBPODS}->{$name} =
1585                   $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)");
1586             }
1587             unless ($manpagename =~ s!^\W*lib\W+!!s) { # everything below lib is ok
1588                 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1589             }
1590             if ($pods{MAN3}) {
1591                 $manpagename = $self->replace_manpage_separator($manpagename);
1592                 $self->{MAN3PODS}->{$name} =
1593                   $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
1594             }
1595         }
1596     }
1597 }
1598
1599 =item init_main
1600
1601 Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1602 PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
1603 PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
1604 LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
1605
1606 =cut
1607
1608 sub init_main {
1609     my($self) = @_;
1610
1611     # --- Initialize Module Name and Paths
1612
1613     # NAME    = Foo::Bar::Oracle
1614     # FULLEXT = Foo/Bar/Oracle
1615     # BASEEXT = Oracle
1616     # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1617     # PARENT_NAME = Foo::Bar
1618 ### Only UNIX:
1619 ###    ($self->{FULLEXT} =
1620 ###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1621     $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1622
1623
1624     # Copied from DynaLoader:
1625
1626     my(@modparts) = split(/::/,$self->{NAME});
1627     my($modfname) = $modparts[-1];
1628
1629     # Some systems have restrictions on files names for DLL's etc.
1630     # mod2fname returns appropriate file base name (typically truncated)
1631     # It may also edit @modparts if required.
1632     if (defined &DynaLoader::mod2fname) {
1633         $modfname = &DynaLoader::mod2fname(\@modparts);
1634     }
1635
1636     ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
1637
1638     if (defined &DynaLoader::mod2fname) {
1639         # As of 5.001m, dl_os2 appends '_'
1640         $self->{DLBASE} = $modfname;
1641     } else {
1642         $self->{DLBASE} = '$(BASEEXT)';
1643     }
1644
1645
1646     ### ROOTEXT deprecated from MM 5.32
1647 ###    ($self->{ROOTEXT} =
1648 ###     $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ;      #eg. /BSD/Foo
1649 ###    $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1650
1651
1652     # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1653
1654     # *Real* information: where did we get these two from? ...
1655     my $inc_config_dir = dirname($INC{'Config.pm'});
1656     my $inc_carp_dir   = dirname($INC{'Carp.pm'});
1657
1658     unless ($self->{PERL_SRC}){
1659         my($dir);
1660         foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
1661             if (
1662                 -f $self->catfile($dir,"config.sh")
1663                 &&
1664                 -f $self->catfile($dir,"perl.h")
1665                 &&
1666                 -f $self->catfile($dir,"lib","Exporter.pm")
1667                ) {
1668                 $self->{PERL_SRC}=$dir ;
1669                 last;
1670             }
1671         }
1672     }
1673     if ($self->{PERL_SRC}){
1674         $self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
1675         $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
1676         $self->{PERL_INC}     = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
1677
1678         # catch a situation that has occurred a few times in the past:
1679         unless (
1680                 -s $self->catfile($self->{PERL_SRC},'cflags')
1681                 or
1682                 $Is_VMS
1683                 &&
1684                 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1685                 or
1686                 $Is_Mac
1687                 or
1688                 $Is_Win32
1689                ){
1690             warn qq{
1691 You cannot build extensions below the perl source tree after executing
1692 a 'make clean' in the perl source tree.
1693
1694 To rebuild extensions distributed with the perl source you should
1695 simply Configure (to include those extensions) and then build perl as
1696 normal. After installing perl the source tree can be deleted. It is
1697 not needed for building extensions by running 'perl Makefile.PL'
1698 usually without extra arguments.
1699
1700 It is recommended that you unpack and build additional extensions away
1701 from the perl source tree.
1702 };
1703         }
1704     } else {
1705         # we should also consider $ENV{PERL5LIB} here
1706         my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
1707         $self->{PERL_LIB}     ||= $Config::Config{privlibexp};
1708         $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1709         $self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1710         my $perl_h;
1711
1712         if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
1713             and not $old){
1714             # Maybe somebody tries to build an extension with an
1715             # uninstalled Perl outside of Perl build tree
1716             my $found;
1717             for my $dir (@INC) {
1718               $found = $dir, last if -e $self->catdir($dir, "Config.pm");
1719             }
1720             if ($found) {
1721               my $inc = dirname $found;
1722               if (-e $self->catdir($inc, "perl.h")) {
1723                 $self->{PERL_LIB}          = $found;
1724                 $self->{PERL_ARCHLIB}      = $found;
1725                 $self->{PERL_INC}          = $inc;
1726                 $self->{UNINSTALLED_PERL}  = 1;
1727                 print STDOUT <<EOP;
1728 ... Detected uninstalled Perl.  Trying to continue.
1729 EOP
1730               }
1731             }
1732         }
1733         
1734         unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1735             die qq{
1736 Error: Unable to locate installed Perl libraries or Perl source code.
1737
1738 It is recommended that you install perl in a standard location before
1739 building extensions. Some precompiled versions of perl do not contain
1740 these header files, so you cannot build extensions. In such a case,
1741 please build and install your perl from a fresh perl distribution. It
1742 usually solves this kind of problem.
1743
1744 \(You get this message, because MakeMaker could not find "$perl_h"\)
1745 };
1746         }
1747 #        print STDOUT "Using header files found in $self->{PERL_INC}\n"
1748 #            if $Verbose && $self->needs_linking();
1749
1750     }
1751
1752     # We get SITELIBEXP and SITEARCHEXP directly via
1753     # Get_from_Config. When we are running standard modules, these
1754     # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1755     # set it to "site". I prefer that INSTALLDIRS be set from outside
1756     # MakeMaker.
1757     $self->{INSTALLDIRS} ||= "site";
1758
1759     # INST_LIB typically pre-set if building an extension after
1760     # perl has been built and installed. Setting INST_LIB allows
1761     # you to build directly into, say $Config::Config{privlibexp}.
1762     unless ($self->{INST_LIB}){
1763
1764
1765         ##### XXXXX We have to change this nonsense
1766
1767         if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1768             $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1769         } else {
1770             $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1771         }
1772     }
1773     $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1774     $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1775
1776     # We need to set up INST_LIBDIR before init_libscan() for VMS
1777     my @parentdir = split(/::/, $self->{PARENT_NAME});
1778     $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1779     $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1780     $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1781     $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1782
1783     # INST_EXE is deprecated, should go away March '97
1784     $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1785     $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1786
1787     # The user who requests an installation directory explicitly
1788     # should not have to tell us a architecture installation directory
1789     # as well. We look if a directory exists that is named after the
1790     # architecture. If not we take it as a sign that it should be the
1791     # same as the requested installation directory. Otherwise we take
1792     # the found one.
1793     # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1794     my($libpair);
1795     for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1796         my $lib = "install$libpair->{l}";
1797         my $Lib = uc $lib;
1798         my $Arch = uc "install$libpair->{a}";
1799         if( $self->{$Lib} && ! $self->{$Arch} ){
1800             my($ilib) = $Config{$lib};
1801             $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1802
1803             $self->prefixify($Arch,$ilib,$self->{$Lib});
1804
1805             unless (-d $self->{$Arch}) {
1806                 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1807                 $self->{$Arch} = $self->{$Lib};
1808             }
1809             print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1810         }
1811     }
1812
1813     # we have to look at the relation between $Config{prefix} and the
1814     # requested values. We're going to set the $Config{prefix} part of
1815     # all the installation path variables to literally $(PREFIX), so
1816     # the user can still say make PREFIX=foo
1817     my($configure_prefix) = $Config{'prefix'};
1818     $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
1819     $self->{PREFIX} ||= $configure_prefix;
1820
1821
1822     my($install_variable,$search_prefix,$replace_prefix);
1823
1824     # If the prefix contains perl, Configure shapes the tree as follows:
1825     #    perlprefix/lib/                INSTALLPRIVLIB
1826     #    perlprefix/lib/pod/
1827     #    perlprefix/lib/site_perl/      INSTALLSITELIB
1828     #    perlprefix/bin/                INSTALLBIN
1829     #    perlprefix/man/                INSTALLMAN1DIR
1830     # else
1831     #    prefix/lib/perl5/              INSTALLPRIVLIB
1832     #    prefix/lib/perl5/pod/
1833     #    prefix/lib/perl5/site_perl/    INSTALLSITELIB
1834     #    prefix/bin/                    INSTALLBIN
1835     #    prefix/lib/perl5/man/          INSTALLMAN1DIR
1836     #
1837     # The above results in various kinds of breakage on various
1838     # platforms, so we cope with it as follows: if prefix/lib/perl5
1839     # or prefix/lib/perl5/man exist, we'll replace those instead
1840     # of /prefix/{lib,man}
1841
1842     $replace_prefix = qq[\$\(PREFIX\)];
1843     for $install_variable (qw/
1844                            INSTALLBIN
1845                            INSTALLSCRIPT
1846                            /) {
1847         $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1848     }
1849     my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5");
1850     $funkylibdir = '' unless -d $funkylibdir;
1851     $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib");
1852     if ($self->{LIB}) {
1853         $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1854         $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = 
1855             $self->catdir($self->{LIB},$Config{'archname'});
1856     }
1857     else {
1858         if (-d $self->catdir($self->{PREFIX},"lib","perl5")) {
1859             $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5");
1860         }
1861         else {
1862             $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib");
1863         }
1864         for $install_variable (qw/
1865                                INSTALLPRIVLIB
1866                                INSTALLARCHLIB
1867                                INSTALLSITELIB
1868                                INSTALLSITEARCH
1869                                /)
1870         {
1871             $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1872         }
1873     }
1874     my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man");
1875     $funkymandir = '' unless -d $funkymandir;
1876     $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man");
1877     if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) {
1878         $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man");
1879     }
1880     else {
1881         $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man");
1882     }
1883     for $install_variable (qw/
1884                            INSTALLMAN1DIR
1885                            INSTALLMAN3DIR
1886                            /)
1887     {
1888         $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1889     }
1890
1891     # Now we head at the manpages. Maybe they DO NOT want manpages
1892     # installed
1893     $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1894         unless defined $self->{INSTALLMAN1DIR};
1895     unless (defined $self->{INST_MAN1DIR}){
1896         if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1897             $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1898         } else {
1899             $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1900         }
1901     }
1902     $self->{MAN1EXT} ||= $Config::Config{man1ext};
1903
1904     $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1905         unless defined $self->{INSTALLMAN3DIR};
1906     unless (defined $self->{INST_MAN3DIR}){
1907         if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1908             $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1909         } else {
1910             $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1911         }
1912     }
1913     $self->{MAN3EXT} ||= $Config::Config{man3ext};
1914
1915     $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir}
1916         unless defined $self->{INSTALLHTMLPRIVLIBDIR};
1917     $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir}
1918         unless defined $self->{INSTALLHTMLSITELIBDIR};
1919
1920     unless (defined $self->{INST_HTMLLIBDIR}){
1921         if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){
1922             $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR};
1923         } else {
1924             $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib');
1925         }
1926     }
1927
1928     $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir}
1929         unless defined $self->{INSTALLHTMLSCRIPTDIR};
1930     unless (defined $self->{INST_HTMLSCRIPTDIR}){
1931         if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){
1932             $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR};
1933         } else {
1934             $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin');
1935         }
1936     }
1937     $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html';
1938
1939
1940     # Get some stuff out of %Config if we haven't yet done so
1941     print STDOUT "CONFIG must be an array ref\n"
1942         if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1943     $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1944     push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1945     push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1946     my(%once_only,$m);
1947     foreach $m (@{$self->{CONFIG}}){
1948         next if $once_only{$m};
1949         print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1950                 unless exists $Config::Config{$m};
1951         $self->{uc $m} ||= $Config::Config{$m};
1952         $once_only{$m} = 1;
1953     }
1954
1955 # This is too dangerous:
1956 #    if ($^O eq "next") {
1957 #       $self->{AR} = "libtool";
1958 #       $self->{AR_STATIC_ARGS} = "-o";
1959 #    }
1960 # But I leave it as a placeholder
1961
1962     $self->{AR_STATIC_ARGS} ||= "cr";
1963
1964     # These should never be needed
1965     $self->{LD} ||= 'ld';
1966     $self->{OBJ_EXT} ||= '.o';
1967     $self->{LIB_EXT} ||= '.a';
1968
1969     $self->{MAP_TARGET} ||= "perl";
1970
1971     $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1972
1973     # make a simple check if we find Exporter
1974     warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1975         (Exporter.pm not found)"
1976         unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1977         $self->{NAME} eq "ExtUtils::MakeMaker";
1978
1979     # Determine VERSION and VERSION_FROM
1980     ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1981     if ($self->{VERSION_FROM}){
1982         $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1983             Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1984     }
1985
1986     # strip blanks
1987     if ($self->{VERSION}) {
1988         $self->{VERSION} =~ s/^\s+//;
1989         $self->{VERSION} =~ s/\s+$//;
1990     }
1991
1992     $self->{VERSION} ||= "0.10";
1993     ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1994
1995
1996     # Graham Barr and Paul Marquess had some ideas how to ensure
1997     # version compatibility between the *.pm file and the
1998     # corresponding *.xs file. The bottomline was, that we need an
1999     # XS_VERSION macro that defaults to VERSION:
2000     $self->{XS_VERSION} ||= $self->{VERSION};
2001
2002     # --- Initialize Perl Binary Locations
2003
2004     # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
2005     # will be working versions of perl 5. miniperl has priority over perl
2006     # for PERL to ensure that $(PERL) is usable while building ./ext/*
2007     my ($component,@defpath);
2008     foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
2009         push @defpath, $component if defined $component;
2010     }
2011     $self->{PERL} ||=
2012         $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl',
2013                                 'perl','perl5',"perl$Config{version}" ],
2014             \@defpath, $Verbose );
2015     # don't check if perl is executable, maybe they have decided to
2016     # supply switches with perl
2017
2018     # Define 'FULLPERL' to be a non-miniperl (used in test: target)
2019     ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
2020         unless ($self->{FULLPERL});
2021 }
2022
2023 =item init_others
2024
2025 Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
2026 OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
2027 MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
2028
2029 =cut
2030
2031 sub init_others {       # --- Initialize Other Attributes
2032     my($self) = shift;
2033
2034     # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
2035     # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
2036     # undefined. In any case we turn it into an anon array:
2037
2038     # May check $Config{libs} too, thus not empty.
2039     $self->{LIBS}=[''] unless $self->{LIBS};
2040
2041     $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
2042     $self->{LD_RUN_PATH} = "";
2043     my($libs);
2044     foreach $libs ( @{$self->{LIBS}} ){
2045         $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
2046         my(@libs) = $self->extliblist($libs);
2047         if ($libs[0] or $libs[1] or $libs[2]){
2048             # LD_RUN_PATH now computed by ExtUtils::Liblist
2049             ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
2050             last;
2051         }
2052     }
2053
2054     if ( $self->{OBJECT} ) {
2055         $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
2056     } else {
2057         # init_dirscan should have found out, if we have C files
2058         $self->{OBJECT} = "";
2059         $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
2060     }
2061     $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
2062     $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
2063     $self->{PERLMAINCC} ||= '$(CC)';
2064     $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
2065
2066     # Sanity check: don't define LINKTYPE = dynamic if we're skipping
2067     # the 'dynamic' section of MM.  We don't have this problem with
2068     # 'static', since we either must use it (%Config says we can't
2069     # use dynamic loading) or the caller asked for it explicitly.
2070     if (!$self->{LINKTYPE}) {
2071        $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
2072                         ? 'static'
2073                         : ($Config::Config{usedl} ? 'dynamic' : 'static');
2074     };
2075
2076     # These get overridden for VMS and maybe some other systems
2077     $self->{NOOP}  ||= '$(SHELL) -c true';
2078     $self->{FIRST_MAKEFILE} ||= "Makefile";
2079     $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
2080     $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
2081     $self->{NOECHO} = '@' unless defined $self->{NOECHO};
2082     $self->{RM_F}  ||= "rm -f";
2083     $self->{RM_RF} ||= "rm -rf";
2084     $self->{TOUCH} ||= "touch";
2085     $self->{TEST_F} ||= "test -f";
2086     $self->{CP} ||= "cp";
2087     $self->{MV} ||= "mv";
2088     $self->{CHMOD} ||= "chmod";
2089     $self->{UMASK_NULL} ||= "umask 0";
2090     $self->{DEV_NULL} ||= "> /dev/null 2>&1";
2091 }
2092
2093 =item install (o)
2094
2095 Defines the install target.
2096
2097 =cut
2098
2099 sub install {
2100     my($self, %attribs) = @_;
2101     my(@m);
2102
2103     push @m, q{
2104 install :: all pure_install doc_install
2105
2106 install_perl :: all pure_perl_install doc_perl_install
2107
2108 install_site :: all pure_site_install doc_site_install
2109
2110 install_ :: install_site
2111         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2112
2113 pure_install :: pure_$(INSTALLDIRS)_install
2114
2115 doc_install :: doc_$(INSTALLDIRS)_install
2116         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2117
2118 pure__install : pure_site_install
2119         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2120
2121 doc__install : doc_site_install
2122         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
2123
2124 pure_perl_install ::
2125         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2126                 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2127                 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
2128                 $(INST_LIB) $(INSTALLPRIVLIB) \
2129                 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
2130                 $(INST_BIN) $(INSTALLBIN) \
2131                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
2132                 $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \
2133                 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
2134                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2135                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2136         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2137                 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
2138
2139
2140 pure_site_install ::
2141         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
2142                 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
2143                 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
2144                 $(INST_LIB) $(INSTALLSITELIB) \
2145                 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
2146                 $(INST_BIN) $(INSTALLBIN) \
2147                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
2148                 $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \
2149                 $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \
2150                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
2151                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
2152         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
2153                 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
2154
2155 doc_perl_install ::
2156         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2157         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2158                 "Module" "$(NAME)" \
2159                 "installed into" "$(INSTALLPRIVLIB)" \
2160                 LINKTYPE "$(LINKTYPE)" \
2161                 VERSION "$(VERSION)" \
2162                 EXE_FILES "$(EXE_FILES)" \
2163                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2164
2165 doc_site_install ::
2166         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2167         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2168                 "Module" "$(NAME)" \
2169                 "installed into" "$(INSTALLSITELIB)" \
2170                 LINKTYPE "$(LINKTYPE)" \
2171                 VERSION "$(VERSION)" \
2172                 EXE_FILES "$(EXE_FILES)" \
2173                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2174
2175 };
2176
2177     push @m, q{
2178 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
2179
2180 uninstall_from_perldirs ::
2181         }.$self->{NOECHO}.
2182         q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
2183
2184 uninstall_from_sitedirs ::
2185         }.$self->{NOECHO}.
2186         q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2187 };
2188
2189     join("",@m);
2190 }
2191
2192 =item installbin (o)
2193
2194 Defines targets to make and to install EXE_FILES.
2195
2196 =cut
2197
2198 sub installbin {
2199     my($self) = shift;
2200     return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2201     return "" unless @{$self->{EXE_FILES}};
2202     my(@m, $from, $to, %fromto, @to);
2203     push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2204     for $from (@{$self->{EXE_FILES}}) {
2205         my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2206         local($_) = $path; # for backwards compatibility
2207         $to = $self->libscan($path);
2208         print "libscan($from) => '$to'\n" if ($Verbose >=2);
2209         $fromto{$from}=$to;
2210     }
2211     @to   = values %fromto;
2212     push(@m, qq{
2213 EXE_FILES = @{$self->{EXE_FILES}}
2214
2215 } . ($Is_Win32
2216   ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2217     -e "system qq[pl2bat.bat ].shift"
2218 } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
2219     -e "MY->fixin(shift)"
2220 }).qq{
2221 pure_all :: @to
2222         $self->{NOECHO}\$(NOOP)
2223
2224 realclean ::
2225         $self->{RM_F} @to
2226 });
2227
2228     while (($from,$to) = each %fromto) {
2229         last unless defined $from;
2230         my $todir = dirname($to);
2231         push @m, "
2232 $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
2233         $self->{NOECHO}$self->{RM_F} $to
2234         $self->{CP} $from $to
2235         \$(FIXIN) $to
2236         -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
2237 ";
2238     }
2239     join "", @m;
2240 }
2241
2242 =item libscan (o)
2243
2244 Takes a path to a file that is found by init_dirscan and returns false
2245 if we don't want to include this file in the library. Mainly used to
2246 exclude RCS, CVS, and SCCS directories from installation.
2247
2248 =cut
2249
2250 # ';
2251
2252 sub libscan {
2253     my($self,$path) = @_;
2254     return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2255     $path;
2256 }
2257
2258 =item linkext (o)
2259
2260 Defines the linkext target which in turn defines the LINKTYPE.
2261
2262 =cut
2263
2264 sub linkext {
2265     my($self, %attribs) = @_;
2266     # LINKTYPE => static or dynamic or ''
2267     my($linktype) = defined $attribs{LINKTYPE} ?
2268       $attribs{LINKTYPE} : '$(LINKTYPE)';
2269     "
2270 linkext :: $linktype
2271         $self->{NOECHO}\$(NOOP)
2272 ";
2273 }
2274
2275 =item lsdir
2276
2277 Takes as arguments a directory name and a regular expression. Returns
2278 all entries in the directory that match the regular expression.
2279
2280 =cut
2281
2282 sub lsdir {
2283     my($self) = shift;
2284     my($dir, $regex) = @_;
2285     my(@ls);
2286     my $dh = new DirHandle;
2287     $dh->open($dir || ".") or return ();
2288     @ls = $dh->read;
2289     $dh->close;
2290     @ls = grep(/$regex/, @ls) if $regex;
2291     @ls;
2292 }
2293
2294 =item macro (o)
2295
2296 Simple subroutine to insert the macros defined by the macro attribute
2297 into the Makefile.
2298
2299 =cut
2300
2301 sub macro {
2302     my($self,%attribs) = @_;
2303     my(@m,$key,$val);
2304     while (($key,$val) = each %attribs){
2305         last unless defined $key;
2306         push @m, "$key = $val\n";
2307     }
2308     join "", @m;
2309 }
2310
2311 =item makeaperl (o)
2312
2313 Called by staticmake. Defines how to write the Makefile to produce a
2314 static new perl.
2315
2316 By default the Makefile produced includes all the static extensions in
2317 the perl library. (Purified versions of library files, e.g.,
2318 DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2319
2320 =cut
2321
2322 sub makeaperl {
2323     my($self, %attribs) = @_;
2324     my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2325         @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2326     my(@m);
2327     push @m, "
2328 # --- MakeMaker makeaperl section ---
2329 MAP_TARGET    = $target
2330 FULLPERL      = $self->{FULLPERL}
2331 ";
2332     return join '', @m if $self->{PARENT};
2333
2334     my($dir) = join ":", @{$self->{DIR}};
2335
2336     unless ($self->{MAKEAPERL}) {
2337         push @m, q{
2338 $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2339         $(MAKE) -f $(MAKE_APERL_FILE) $@
2340
2341 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2342         }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2343         }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2344                 Makefile.PL DIR=}, $dir, q{ \
2345                 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2346                 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
2347
2348         foreach (@ARGV){
2349                 if( /\s/ ){
2350                         s/=(.*)/='$1'/;
2351                 }
2352                 push @m, " \\\n\t\t$_";
2353         }
2354 #       push @m, map( " \\\n\t\t$_", @ARGV );
2355         push @m, "\n";
2356
2357         return join '', @m;
2358     }
2359
2360
2361
2362     my($cccmd, $linkcmd, $lperl);
2363
2364
2365     $cccmd = $self->const_cccmd($libperl);
2366     $cccmd =~ s/^CCCMD\s*=\s*//;
2367     $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
2368     $cccmd .= " $Config::Config{cccdlflags}"
2369         if ($Config::Config{useshrplib} eq 'true');
2370     $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
2371
2372     # The front matter of the linkcommand...
2373     $linkcmd = join ' ', "\$(CC)",
2374             grep($_, @Config{qw(large split ldflags ccdlflags)});
2375     $linkcmd =~ s/\s+/ /g;
2376     $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
2377
2378     # Which *.a files could we make use of...
2379     local(%static);
2380     require File::Find;
2381     File::Find::find(sub {
2382         return unless m/\Q$self->{LIB_EXT}\E$/;
2383         return if m/^libperl/;
2384         # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2385         return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
2386
2387         if( exists $self->{INCLUDE_EXT} ){
2388                 my $found = 0;
2389                 my $incl;
2390                 my $xx;
2391
2392                 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
2393                 $xx =~ s,/?$_,,;
2394                 $xx =~ s,/,::,g;
2395
2396                 # Throw away anything not explicitly marked for inclusion.
2397                 # DynaLoader is implied.
2398                 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2399                         if( $xx eq $incl ){
2400                                 $found++;
2401                                 last;
2402                         }
2403                 }
2404                 return unless $found;
2405         }
2406         elsif( exists $self->{EXCLUDE_EXT} ){
2407                 my $excl;
2408                 my $xx;
2409
2410                 ($xx = $File::Find::name) =~ s,.*?/auto/,,s;
2411                 $xx =~ s,/?$_,,;
2412                 $xx =~ s,/,::,g;
2413
2414                 # Throw away anything explicitly marked for exclusion
2415                 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2416                         return if( $xx eq $excl );
2417                 }
2418         }
2419
2420         # don't include the installed version of this extension. I
2421         # leave this line here, although it is not necessary anymore:
2422         # I patched minimod.PL instead, so that Miniperl.pm won't
2423         # enclude duplicates
2424
2425         # Once the patch to minimod.PL is in the distribution, I can
2426         # drop it
2427         return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
2428         use Cwd 'cwd';
2429         $static{cwd() . "/" . $_}++;
2430     }, grep( -d $_, @{$searchdirs || []}) );
2431
2432     # We trust that what has been handed in as argument, will be buildable
2433     $static = [] unless $static;
2434     @static{@{$static}} = (1) x @{$static};
2435
2436     $extra = [] unless $extra && ref $extra eq 'ARRAY';
2437     for (sort keys %static) {
2438         next unless /\Q$self->{LIB_EXT}\E\z/;
2439         $_ = dirname($_) . "/extralibs.ld";
2440         push @$extra, $_;
2441     }
2442
2443     grep(s/^/-I/, @{$perlinc || []});
2444
2445     $target = "perl" unless $target;
2446     $tmp = "." unless $tmp;
2447
2448 # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2449 # regenerate the Makefiles, MAP_STATIC and the dependencies for
2450 # extralibs.all are computed correctly
2451     push @m, "
2452 MAP_LINKCMD   = $linkcmd
2453 MAP_PERLINC   = @{$perlinc || []}
2454 MAP_STATIC    = ",
2455 join(" \\\n\t", reverse sort keys %static), "
2456
2457 MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
2458 ";
2459
2460     if (defined $libperl) {
2461         ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2462     }
2463     unless ($libperl && -f $lperl) { # Ilya's code...
2464         my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2465         $libperl ||= "libperl$self->{LIB_EXT}";
2466         $libperl   = "$dir/$libperl";
2467         $lperl   ||= "libperl$self->{LIB_EXT}";
2468         $lperl     = "$dir/$lperl";
2469
2470         if (! -f $libperl and ! -f $lperl) {
2471           # We did not find a static libperl. Maybe there is a shared one?
2472           if ($^O eq 'solaris' or $^O eq 'sunos') {
2473             $lperl  = $libperl = "$dir/$Config::Config{libperl}";
2474             # SUNOS ld does not take the full path to a shared library
2475             $libperl = '' if $^O eq 'sunos';
2476           }
2477         }
2478
2479         print STDOUT "Warning: $libperl not found
2480     If you're going to build a static perl binary, make sure perl is installed
2481     otherwise ignore this warning\n"
2482                 unless (-f $lperl || defined($self->{PERL_SRC}));
2483     }
2484
2485     push @m, "
2486 MAP_LIBPERL = $libperl
2487 ";
2488
2489     push @m, "
2490 \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2491         $self->{NOECHO}$self->{RM_F} \$\@
2492         $self->{NOECHO}\$(TOUCH) \$\@
2493 ";
2494
2495     my $catfile;
2496     foreach $catfile (@$extra){
2497         push @m, "\tcat $catfile >> \$\@\n";
2498     }
2499     # SUNOS ld does not take the full path to a shared library
2500     my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
2501
2502     # Brain dead solaris linker does not use LD_RUN_PATH?
2503     # This fixes dynamic extensions which need shared libs
2504     my $ldfrom = ($^O eq 'solaris')?
2505            join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
2506
2507 push @m, "
2508 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
2509         \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
2510         $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2511         $self->{NOECHO}echo '    make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2512         $self->{NOECHO}echo 'To remove the intermediate files say'
2513         $self->{NOECHO}echo '    make -f $makefilename map_clean'
2514
2515 $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2516 ";
2517     push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
2518
2519     push @m, qq{
2520 $tmp/perlmain.c: $makefilename}, q{
2521         }.$self->{NOECHO}.q{echo Writing $@
2522         }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
2523                 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
2524
2525 };
2526     push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2527 } if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2528
2529
2530     push @m, q{
2531 doc_inst_perl:
2532         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2533         -}.$self->{NOECHO}.q{$(MKPATH) $(INSTALLARCHLIB)
2534         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2535                 "Perl binary" "$(MAP_TARGET)" \
2536                 MAP_STATIC "$(MAP_STATIC)" \
2537                 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2538                 MAP_LIBPERL "$(MAP_LIBPERL)" \
2539                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2540
2541 };
2542
2543     push @m, q{
2544 inst_perl: pure_inst_perl doc_inst_perl
2545
2546 pure_inst_perl: $(MAP_TARGET)
2547         }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
2548
2549 clean :: map_clean
2550
2551 map_clean :
2552         }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2553 };
2554
2555     join '', @m;
2556 }
2557
2558 =item makefile (o)
2559
2560 Defines how to rewrite the Makefile.
2561
2562 =cut
2563
2564 sub makefile {
2565     my($self) = shift;
2566     my @m;
2567     # We do not know what target was originally specified so we
2568     # must force a manual rerun to be sure. But as it should only
2569     # happen very rarely it is not a significant problem.
2570     push @m, '
2571 $(OBJECT) : $(FIRST_MAKEFILE)
2572 ' if $self->{OBJECT};
2573
2574     push @m, q{
2575 # We take a very conservative approach here, but it\'s worth it.
2576 # We move Makefile to Makefile.old here to avoid gnu make looping.
2577 }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2578         }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2579         }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
2580         -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
2581         -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2582         -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
2583         $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
2584         }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2585         }.$self->{NOECHO}.q{echo "==> Please rerun the make command.  <=="
2586         false
2587
2588 # To change behavior to :: would be nice, but would break Tk b9.02
2589 # so you find such a warning below the dist target.
2590 #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2591 #       }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
2592 };
2593
2594     join "", @m;
2595 }
2596
2597 =item manifypods (o)
2598
2599 Defines targets and routines to translate the pods into manpages and
2600 put them into the INST_* directories.
2601
2602 =cut
2603
2604 sub manifypods {
2605     my($self, %attribs) = @_;
2606     return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2607         %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
2608     my($dist);
2609     my($pod2man_exe);
2610     if (defined $self->{PERL_SRC}) {
2611         $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2612     } else {
2613         $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
2614     }
2615     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
2616       # Maybe a build by uninstalled Perl?
2617       $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man");
2618     }
2619     unless ($pod2man_exe = $self->perl_script($pod2man_exe)) {
2620         # No pod2man but some MAN3PODS to be installed
2621         print <<END;
2622
2623 Warning: I could not locate your pod2man program. Please make sure,
2624          your pod2man program is in your PATH before you execute 'make'
2625
2626 END
2627         $pod2man_exe = "-S pod2man";
2628     }
2629     my(@m);
2630     push @m,
2631 qq[POD2MAN_EXE = $pod2man_exe\n],
2632 qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2633 q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2634  $self->{MAKEFILE}, q[";' \\
2635 -e 'print "Manifying $$m{$$_}\n";' \\
2636 -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2637 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
2638 ];
2639     push @m, "\nmanifypods : pure_all ";
2640     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
2641
2642     push(@m,"\n");
2643     if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2644         push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2645         push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
2646     }
2647     join('', @m);
2648 }
2649
2650 =item maybe_command
2651
2652 Returns true, if the argument is likely to be a command.
2653
2654 =cut
2655
2656 sub maybe_command {
2657     my($self,$file) = @_;
2658     return $file if -x $file && ! -d $file;
2659     return;
2660 }
2661
2662 =item maybe_command_in_dirs
2663
2664 method under development. Not yet used. Ask Ilya :-)
2665
2666 =cut
2667
2668 sub maybe_command_in_dirs {     # $ver is optional argument if looking for perl
2669 # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2670     my($self, $names, $dirs, $trace, $ver) = @_;
2671     my($name, $dir);
2672     foreach $dir (@$dirs){
2673         next unless defined $dir; # $self->{PERL_SRC} may be undefined
2674         foreach $name (@$names){
2675             my($abs,$tryabs);
2676             if ($self->file_name_is_absolute($name)) { # /foo/bar
2677                 $abs = $name;
2678             } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2679                 $abs = $self->catfile($dir, $name);
2680             } else { # foo/bar
2681                 $abs = $self->catfile($self->curdir, $name);
2682             }
2683             print "Checking $abs for $name\n" if ($trace >= 2);
2684             next unless $tryabs = $self->maybe_command($abs);
2685             print "Substituting $tryabs instead of $abs\n"
2686                 if ($trace >= 2 and $tryabs ne $abs);
2687             $abs = $tryabs;
2688             if (defined $ver) {
2689                 print "Executing $abs\n" if ($trace >= 2);
2690                 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2691                     print "Using PERL=$abs\n" if $trace;
2692                     return $abs;
2693                 }
2694             } else { # Do not look for perl
2695                 return $abs;
2696             }
2697         }
2698     }
2699 }
2700
2701 =item needs_linking (o)
2702
2703 Does this module need linking? Looks into subdirectory objects (see
2704 also has_link_code())
2705
2706 =cut
2707
2708 sub needs_linking {
2709     my($self) = shift;
2710     my($child,$caller);
2711     $caller = (caller(0))[3];
2712     Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2713     return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2714     if ($self->has_link_code or $self->{MAKEAPERL}){
2715         $self->{NEEDS_LINKING} = 1;
2716         return 1;
2717     }
2718     foreach $child (keys %{$self->{CHILDREN}}) {
2719         if ($self->{CHILDREN}->{$child}->needs_linking) {
2720             $self->{NEEDS_LINKING} = 1;
2721             return 1;
2722         }
2723     }
2724     return $self->{NEEDS_LINKING} = 0;
2725 }
2726
2727 =item nicetext
2728
2729 misnamed method (will have to be changed). The MM_Unix method just
2730 returns the argument without further processing.
2731
2732 On VMS used to insure that colons marking targets are preceded by
2733 space - most Unix Makes don't need this, but it's necessary under VMS
2734 to distinguish the target delimiter from a colon appearing as part of
2735 a filespec.
2736
2737 =cut
2738
2739 sub nicetext {
2740     my($self,$text) = @_;
2741     $text;
2742 }
2743
2744 =item parse_version
2745
2746 parse a file and return what you think is $VERSION in this file set to.
2747 It will return the string "undef" if it can't figure out what $VERSION
2748 is.
2749
2750 =cut
2751
2752 sub parse_version {
2753     my($self,$parsefile) = @_;
2754     my $result;
2755     local *FH;
2756     local $/ = "\n";
2757     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2758     my $inpod = 0;
2759     while (<FH>) {
2760         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2761         next if $inpod;
2762         chop;
2763         # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2764         next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
2765         my $eval = qq{
2766             package ExtUtils::MakeMaker::_version;
2767             no strict;
2768
2769             local $1$2;
2770             \$$2=undef; do {
2771                 $_
2772             }; \$$2
2773         };
2774         no warnings;
2775         $result = eval($eval);
2776         warn "Could not eval '$eval' in $parsefile: $@" if $@;
2777         $result = "undef" unless defined $result;
2778         last;
2779     }
2780     close FH;
2781     return $result;
2782 }
2783
2784 =item parse_abstract
2785
2786 parse a file and return what you think is the ABSTRACT
2787
2788 =cut
2789
2790 sub parse_abstract {
2791     my($self,$parsefile) = @_;
2792     my $result;
2793     local *FH;
2794     local $/ = "\n";
2795     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2796     my $inpod = 0;
2797     my $package = $self->{DISTNAME};
2798     $package =~ s/-/::/g;
2799     while (<FH>) {
2800         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2801         next if !$inpod;
2802         chop;
2803         next unless /^($package\s-\s)(.*)/;
2804         $result = $2;
2805         last;
2806     }
2807     close FH;
2808     return $result;
2809 }
2810
2811 =item pasthru (o)
2812
2813 Defines the string that is passed to recursive make calls in
2814 subdirectories.
2815
2816 =cut
2817
2818 sub pasthru {
2819     my($self) = shift;
2820     my(@m,$key);
2821
2822     my(@pasthru);
2823     my($sep) = $Is_VMS ? ',' : '';
2824     $sep .= "\\\n\t";
2825
2826     foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
2827         push @pasthru, "$key=\"\$($key)\"";
2828     }
2829
2830     push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
2831     join "", @m;
2832 }
2833
2834 =item path
2835
2836 Takes no argument, returns the environment variable PATH as an array.
2837
2838 =cut
2839
2840 sub path {
2841     my($self) = @_;
2842     my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
2843     my $path = $ENV{PATH};
2844     $path =~ s:\\:/:g if $Is_OS2;
2845     my @path = split $path_sep, $path;
2846     foreach(@path) { $_ = '.' if $_ eq '' }
2847     @path;
2848 }
2849
2850 =item perl_script
2851
2852 Takes one argument, a file name, and returns the file name, if the
2853 argument is likely to be a perl script. On MM_Unix this is true for
2854 any ordinary, readable file.
2855
2856 =cut
2857
2858 sub perl_script {
2859     my($self,$file) = @_;
2860     return $file if -r $file && -f _;
2861     return;
2862 }
2863
2864 =item perldepend (o)
2865
2866 Defines the dependency from all *.h files that come with the perl
2867 distribution.
2868
2869 =cut
2870
2871 sub perldepend {
2872     my($self) = shift;
2873     my(@m);
2874     push @m, q{
2875 # Check for unpropogated config.sh changes. Should never happen.
2876 # We do NOT just update config.h because that is not sufficient.
2877 # An out of date config.h is not fatal but complains loudly!
2878 $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2879         -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2880
2881 $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2882         }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2883         cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2884 } if $self->{PERL_SRC};
2885
2886     return join "", @m unless $self->needs_linking;
2887
2888     push @m, q{
2889 PERL_HDRS = \
2890         $(PERL_INC)/EXTERN.h            \
2891         $(PERL_INC)/INTERN.h            \
2892         $(PERL_INC)/XSUB.h              \
2893         $(PERL_INC)/av.h                \
2894         $(PERL_INC)/cc_runtime.h        \
2895         $(PERL_INC)/config.h            \
2896         $(PERL_INC)/cop.h               \
2897         $(PERL_INC)/cv.h                \
2898         $(PERL_INC)/dosish.h            \
2899         $(PERL_INC)/embed.h             \
2900         $(PERL_INC)/embedvar.h          \
2901         $(PERL_INC)/fakethr.h           \
2902         $(PERL_INC)/form.h              \
2903         $(PERL_INC)/gv.h                \
2904         $(PERL_INC)/handy.h             \
2905         $(PERL_INC)/hv.h                \
2906         $(PERL_INC)/intrpvar.h          \
2907         $(PERL_INC)/iperlsys.h          \
2908         $(PERL_INC)/keywords.h          \
2909         $(PERL_INC)/mg.h                \
2910         $(PERL_INC)/nostdio.h           \
2911         $(PERL_INC)/objXSUB.h           \
2912         $(PERL_INC)/op.h                \
2913         $(PERL_INC)/opcode.h            \
2914         $(PERL_INC)/opnames.h           \
2915         $(PERL_INC)/patchlevel.h        \
2916         $(PERL_INC)/perl.h              \
2917         $(PERL_INC)/perlapi.h           \
2918         $(PERL_INC)/perlio.h            \
2919         $(PERL_INC)/perlsdio.h          \
2920         $(PERL_INC)/perlsfio.h          \
2921         $(PERL_INC)/perlvars.h          \
2922         $(PERL_INC)/perly.h             \
2923         $(PERL_INC)/pp.h                \
2924         $(PERL_INC)/pp_proto.h          \
2925         $(PERL_INC)/proto.h             \
2926         $(PERL_INC)/regcomp.h           \
2927         $(PERL_INC)/regexp.h            \
2928         $(PERL_INC)/regnodes.h          \
2929         $(PERL_INC)/scope.h             \
2930         $(PERL_INC)/sv.h                \
2931         $(PERL_INC)/thrdvar.h           \
2932         $(PERL_INC)/thread.h            \
2933         $(PERL_INC)/unixish.h           \
2934         $(PERL_INC)/utf8.h              \
2935         $(PERL_INC)/util.h              \
2936         $(PERL_INC)/warnings.h
2937
2938 $(OBJECT) : $(PERL_HDRS)
2939 } if $self->{OBJECT};
2940
2941     push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
2942
2943     join "\n", @m;
2944 }
2945
2946 =item ppd
2947
2948 Defines target that creates a PPD (Perl Package Description) file
2949 for a binary distribution.
2950
2951 =cut
2952
2953 sub ppd {
2954     my($self) = @_;
2955     my(@m);
2956     if ($self->{ABSTRACT_FROM}){
2957         $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2958             Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
2959     }
2960     my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
2961     push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
2962     push(@m, "ppd:\n");
2963     push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
2964     push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
2965     my $abstract = $self->{ABSTRACT};
2966     $abstract =~ s/\n/\\n/sg;
2967     $abstract =~ s/</&lt;/g;
2968     $abstract =~ s/>/&gt;/g;
2969     push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
2970     my ($author) = $self->{AUTHOR};
2971     $author =~ s/</&lt;/g;
2972     $author =~ s/>/&gt;/g;
2973     $author =~ s/@/\\@/g;
2974     push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
2975     push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
2976     my ($prereq);
2977     foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
2978         my $pre_req = $prereq;
2979         $pre_req =~ s/::/-/g;
2980         my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
2981         push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
2982     }
2983     push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
2984     push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
2985     my ($bin_location) = $self->{BINARY_LOCATION};
2986     $bin_location =~ s/\\/\\\\/g;
2987     if ($self->{PPM_INSTALL_SCRIPT}) {
2988         if ($self->{PPM_INSTALL_EXEC}) {
2989             push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2990         }
2991         else {
2992             push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2993         }
2994     }
2995     push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
2996     push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
2997     push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
2998
2999     join("", @m);   
3000 }
3001
3002 =item perm_rw (o)
3003
3004 Returns the attribute C<PERM_RW> or the string C<644>.
3005 Used as the string that is passed
3006 to the C<chmod> command to set the permissions for read/writeable files.
3007 MakeMaker chooses C<644> because it has turned out in the past that
3008 relying on the umask provokes hard-to-track bug reports.
3009 When the return value is used by the perl function C<chmod>, it is
3010 interpreted as an octal value.
3011
3012 =cut
3013
3014 sub perm_rw {
3015     shift->{PERM_RW} || "644";
3016 }
3017
3018 =item perm_rwx (o)
3019
3020 Returns the attribute C<PERM_RWX> or the string C<755>,
3021 i.e. the string that is passed
3022 to the C<chmod> command to set the permissions for executable files.
3023 See also perl_rw.
3024
3025 =cut
3026
3027 sub perm_rwx {
3028     shift->{PERM_RWX} || "755";
3029 }
3030
3031 =item pm_to_blib
3032
3033 Defines target that copies all files in the hash PM to their
3034 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
3035
3036 =cut
3037
3038 sub pm_to_blib {
3039     my $self = shift;
3040     my($autodir) = $self->catdir('$(INST_LIB)','auto');
3041     return q{
3042 pm_to_blib: $(TO_INST_PM)
3043         }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
3044         "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
3045         -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
3046         }.$self->{NOECHO}.q{$(TOUCH) $@
3047 };
3048 }
3049
3050 =item post_constants (o)
3051
3052 Returns an empty string per default. Dedicated to overrides from
3053 within Makefile.PL after all constants have been defined.
3054
3055 =cut
3056
3057 sub post_constants{
3058     my($self) = shift;
3059     "";
3060 }
3061
3062 =item post_initialize (o)
3063
3064 Returns an empty string per default. Used in Makefile.PLs to add some
3065 chunk of text to the Makefile after the object is initialized.
3066
3067 =cut
3068
3069 sub post_initialize {
3070     my($self) = shift;
3071     "";
3072 }
3073
3074 =item postamble (o)
3075
3076 Returns an empty string. Can be used in Makefile.PLs to write some
3077 text to the Makefile at the end.
3078
3079 =cut
3080
3081 sub postamble {
3082     my($self) = shift;
3083     "";
3084 }
3085
3086 =item prefixify
3087
3088 Check a path variable in $self from %Config, if it contains a prefix,
3089 and replace it with another one.
3090
3091 Takes as arguments an attribute name, a search prefix and a
3092 replacement prefix. Changes the attribute in the object.
3093
3094 =cut
3095
3096 sub prefixify {
3097     my($self,$var,$sprefix,$rprefix) = @_;
3098     $self->{uc $var} ||= $Config{lc $var};
3099     $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
3100     $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/s;
3101 }
3102
3103 =item processPL (o)
3104
3105 Defines targets to run *.PL files.
3106
3107 =cut
3108
3109 sub processPL {
3110     my($self) = shift;
3111     return "" unless $self->{PL_FILES};
3112     my(@m, $plfile);
3113     foreach $plfile (sort keys %{$self->{PL_FILES}}) {
3114         my $list = ref($self->{PL_FILES}->{$plfile})
3115                 ? $self->{PL_FILES}->{$plfile}
3116                 : [$self->{PL_FILES}->{$plfile}];
3117         foreach $target (@$list) {
3118         push @m, "
3119 all :: $target
3120         $self->{NOECHO}\$(NOOP)
3121
3122 $target :: $plfile
3123         \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target
3124 ";
3125         }
3126     }
3127     join "", @m;
3128 }
3129
3130 =item realclean (o)
3131
3132 Defines the realclean target.
3133
3134 =cut
3135
3136 sub realclean {
3137     my($self, %attribs) = @_;
3138     my(@m);
3139     push(@m,'
3140 # Delete temporary files (via clean) and also delete installed files
3141 realclean purge ::  clean
3142 ');
3143     # realclean subdirectories first (already cleaned)
3144     my $sub = ($Is_Win32  &&  Win32::IsWin95()) ?
3145       "\tcd %s\n\t\$(TEST_F) %s\n\t\$(MAKE) %s realclean\n\tcd ..\n" :
3146       "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
3147     foreach(@{$self->{DIR}}){
3148         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
3149         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
3150     }
3151     push(@m, "  $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
3152     if( $self->has_link_code ){
3153         push(@m, "      $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
3154         push(@m, "      $self->{RM_F} \$(INST_STATIC)\n");
3155     }
3156     push(@m, "  $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n")
3157         if keys %{$self->{PM}};
3158     my(@otherfiles) = ($self->{MAKEFILE},
3159                        "$self->{MAKEFILE}.old"); # Makefiles last
3160     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
3161     push(@m, "  $self->{RM_RF} @otherfiles\n") if @otherfiles;
3162     push(@m, "  $attribs{POSTOP}\n")       if $attribs{POSTOP};
3163     join("", @m);
3164 }
3165
3166 =item replace_manpage_separator
3167
3168 Takes the name of a package, which may be a nested package, in the
3169 form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
3170
3171 =cut
3172
3173 sub replace_manpage_separator {
3174     my($self,$man) = @_;
3175         if ($^O eq 'uwin') {
3176                 $man =~ s,/+,.,g;
3177         } else {
3178                 $man =~ s,/+,::,g;
3179         }
3180     $man;
3181 }
3182
3183 =item static (o)
3184
3185 Defines the static target.
3186
3187 =cut
3188
3189 sub static {
3190 # --- Static Loading Sections ---
3191
3192     my($self) = shift;
3193     '
3194 ## $(INST_PM) has been moved to the all: target.
3195 ## It remains here for awhile to allow for old usage: "make static"
3196 #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
3197 static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
3198         '.$self->{NOECHO}.'$(NOOP)
3199 ';
3200 }
3201
3202 =item static_lib (o)
3203
3204 Defines how to produce the *.a (or equivalent) files.
3205
3206 =cut
3207
3208 sub static_lib {
3209     my($self) = @_;
3210 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
3211 #    return '' unless $self->needs_linking(); #might be because of a subdir
3212
3213     return '' unless $self->has_link_code;
3214
3215     my(@m);
3216     push(@m, <<'END');
3217 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
3218         $(RM_RF) $@
3219 END
3220     # If this extension has it's own library (eg SDBM_File)
3221     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3222     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
3223
3224     my $ar; 
3225     if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
3226         # Prefer the absolute pathed ar if available so that PATH
3227         # doesn't confuse us.  Perl itself is built with the full_ar.  
3228         $ar = 'FULL_AR';
3229     } else {
3230         $ar = 'AR';
3231     }
3232     push @m,
3233         "\t\$($ar) ".'$(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@'."\n";
3234     push @m,
3235 q{      $(CHMOD) $(PERM_RWX) $@
3236         }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
3237 };
3238     # Old mechanism - still available:
3239     push @m,
3240 "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3241 }       if $self->{PERL_SRC} && $self->{EXTRALIBS};
3242     push @m, "\n";
3243
3244     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3245     join('', "\n",@m);
3246 }
3247
3248 =item staticmake (o)
3249
3250 Calls makeaperl.
3251
3252 =cut
3253
3254 sub staticmake {
3255     my($self, %attribs) = @_;
3256     my(@static);
3257
3258     my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
3259
3260     # And as it's not yet built, we add the current extension
3261     # but only if it has some C code (or XS code, which implies C code)
3262     if (@{$self->{C}}) {
3263         @static = $self->catfile($self->{INST_ARCHLIB},
3264                                  "auto",
3265                                  $self->{FULLEXT},
3266                                  "$self->{BASEEXT}$self->{LIB_EXT}"
3267                                 );
3268     }
3269
3270     # Either we determine now, which libraries we will produce in the
3271     # subdirectories or we do it at runtime of the make.
3272
3273     # We could ask all subdir objects, but I cannot imagine, why it
3274     # would be necessary.
3275
3276     # Instead we determine all libraries for the new perl at
3277     # runtime.
3278     my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
3279
3280     $self->makeaperl(MAKE       => $self->{MAKEFILE},
3281                      DIRS       => \@searchdirs,
3282                      STAT       => \@static,
3283                      INCL       => \@perlinc,
3284                      TARGET     => $self->{MAP_TARGET},
3285                      TMP        => "",
3286                      LIBPERL    => $self->{LIBPERL_A}
3287                     );
3288 }
3289
3290 =item subdir_x (o)
3291
3292 Helper subroutine for subdirs
3293
3294 =cut
3295
3296 sub subdir_x {
3297     my($self, $subdir) = @_;
3298     my(@m);
3299     if ($Is_Win32 && Win32::IsWin95()) {
3300         # XXX: dmake-specific, like rest of Win95 port
3301         return <<EOT;
3302 subdirs ::
3303 @[
3304         cd $subdir
3305         \$(MAKE) all \$(PASTHRU)
3306         cd ..
3307 ]
3308 EOT
3309     }
3310     else {
3311         return <<EOT;
3312
3313 subdirs ::
3314         $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
3315
3316 EOT
3317     }
3318 }
3319
3320 =item subdirs (o)
3321
3322 Defines targets to process subdirectories.
3323
3324 =cut
3325
3326 sub subdirs {
3327 # --- Sub-directory Sections ---
3328     my($self) = shift;
3329     my(@m,$dir);
3330     # This method provides a mechanism to automatically deal with
3331     # subdirectories containing further Makefile.PL scripts.
3332     # It calls the subdir_x() method for each subdirectory.
3333     foreach $dir (@{$self->{DIR}}){
3334         push(@m, $self->subdir_x($dir));
3335 ####    print "Including $dir subdirectory\n";
3336     }
3337     if (@m){
3338         unshift(@m, "
3339 # The default clean, realclean and test targets in this Makefile
3340 # have automatically been given entries for each subdir.
3341
3342 ");
3343     } else {
3344         push(@m, "\n# none")
3345     }
3346     join('',@m);
3347 }
3348
3349 =item test (o)
3350
3351 Defines the test targets.
3352
3353 =cut
3354
3355 sub test {
3356 # --- Test and Installation Sections ---
3357
3358     my($self, %attribs) = @_;
3359     my $tests = $attribs{TESTS};
3360     if (!$tests && -d 't') {
3361         $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
3362     }
3363     # note: 'test.pl' name is also hardcoded in init_dirscan()
3364     my(@m);
3365     push(@m,"
3366 TEST_VERBOSE=0
3367 TEST_TYPE=test_\$(LINKTYPE)
3368 TEST_FILE = test.pl
3369 TEST_FILES = $tests
3370 TESTDB_SW = -d
3371
3372 testdb :: testdb_\$(LINKTYPE)
3373
3374 test :: \$(TEST_TYPE)
3375 ");
3376     push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
3377                  @{$self->{DIR}}));
3378     push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
3379         unless $tests or -f "test.pl" or @{$self->{DIR}};
3380     push(@m, "\n");
3381
3382     push(@m, "test_dynamic :: pure_all\n");
3383     push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
3384     push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
3385     push(@m, "\n");
3386
3387     push(@m, "testdb_dynamic :: pure_all\n");
3388     push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
3389     push(@m, "\n");
3390
3391     # Occasionally we may face this degenerate target:
3392     push @m, "test_ : test_dynamic\n\n";
3393
3394     if ($self->needs_linking()) {
3395         push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
3396         push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
3397         push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
3398         push(@m, "\n");
3399         push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
3400         push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
3401         push(@m, "\n");
3402     } else {
3403         push @m, "test_static :: test_dynamic\n";
3404         push @m, "testdb_static :: testdb_dynamic\n";
3405     }
3406     join("", @m);
3407 }
3408
3409 =item test_via_harness (o)
3410
3411 Helper method to write the test targets
3412
3413 =cut
3414
3415 sub test_via_harness {
3416     my($self, $perl, $tests) = @_;
3417     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3418     "\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";
3419 }
3420
3421 =item test_via_script (o)
3422
3423 Other helper method for test.
3424
3425 =cut
3426
3427 sub test_via_script {
3428     my($self, $perl, $script) = @_;
3429     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3430     qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
3431 };
3432 }
3433
3434 =item tool_autosplit (o)
3435
3436 Defines a simple perl call that runs autosplit. May be deprecated by
3437 pm_to_blib soon.
3438
3439 =cut
3440
3441 sub tool_autosplit {
3442 # --- Tool Sections ---
3443
3444     my($self, %attribs) = @_;
3445     my($asl) = "";
3446     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
3447     q{
3448 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
3449 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
3450 };
3451 }
3452
3453 =item tools_other (o)
3454
3455 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
3456 the Makefile. Also defines the perl programs MKPATH,
3457 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
3458
3459 =cut
3460
3461 sub tools_other {
3462     my($self) = shift;
3463     my @m;
3464     my $bin_sh = $Config{sh} || '/bin/sh';
3465     push @m, qq{
3466 SHELL = $bin_sh
3467 };
3468
3469     for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
3470         push @m, "$_ = $self->{$_}\n";
3471     }
3472
3473     push @m, q{
3474 # The following is a portable way to say mkdir -p
3475 # To see which directories are created, change the if 0 to if 1
3476 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
3477
3478 # This helps us to minimize the effect of the .exists files A yet
3479 # better solution would be to have a stable file in the perl
3480 # distribution with a timestamp of zero. But this solution doesn't
3481 # need any changes to the core distribution and works with older perls
3482 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
3483 };
3484
3485
3486     return join "", @m if $self->{PARENT};
3487
3488     push @m, q{
3489 # Here we warn users that an old packlist file was found somewhere,
3490 # and that they should call some uninstall routine
3491 WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
3492 -e 'print "WARNING: I have found an old package in\n";' \\
3493 -e 'print "\t$$ARGV[0].\n";' \\
3494 -e 'print "Please make sure the two installations are not conflicting\n";'
3495
3496 UNINST=0
3497 VERBINST=1
3498
3499 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
3500 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
3501
3502 DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
3503 -e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", $$arg=shift, "|", $$arg, ">";' \
3504 -e 'print "=over 4";' \
3505 -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
3506 -e 'print "=back";'
3507
3508 UNINSTALL =   $(PERL) -MExtUtils::Install \
3509 -e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
3510 -e 'print " packlist above carefully.\n  There may be errors. Remove the";' \
3511 -e 'print " appropriate files manually.\n  Sorry for the inconveniences.\n"'
3512 };
3513
3514     return join "", @m;
3515 }
3516
3517 =item tool_xsubpp (o)
3518
3519 Determines typemaps, xsubpp version, prototype behaviour.
3520
3521 =cut
3522
3523 sub tool_xsubpp {
3524     my($self) = shift;
3525     return "" unless $self->needs_linking;
3526     my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
3527     my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3528     if( $self->{TYPEMAPS} ){
3529         my $typemap;
3530         foreach $typemap (@{$self->{TYPEMAPS}}){
3531                 if( ! -f  $typemap ){
3532                         warn "Typemap $typemap not found.\n";
3533                 }
3534                 else{
3535                         push(@tmdeps,  $typemap);
3536                 }
3537         }
3538     }
3539     push(@tmdeps, "typemap") if -f "typemap";
3540     my(@tmargs) = map("-typemap $_", @tmdeps);
3541     if( exists $self->{XSOPT} ){
3542         unshift( @tmargs, $self->{XSOPT} );
3543     }
3544
3545
3546     my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
3547
3548     # What are the correct thresholds for version 1 && 2 Paul?
3549     if ( $xsubpp_version > 1.923 ){
3550         $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3551     } else {
3552         if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3553             print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3554         Your version of xsubpp is $xsubpp_version and cannot handle this.
3555         Please upgrade to a more recent version of xsubpp.
3556 };
3557         } else {
3558             $self->{XSPROTOARG} = "";
3559         }
3560     }
3561
3562     my $xsubpp = "xsubpp";
3563
3564     return qq{
3565 XSUBPPDIR = $xsdir
3566 XSUBPP = \$(XSUBPPDIR)/$xsubpp
3567 XSPROTOARG = $self->{XSPROTOARG}
3568 XSUBPPDEPS = @tmdeps \$(XSUBPP)
3569 XSUBPPARGS = @tmargs
3570 };
3571 };
3572
3573 sub xsubpp_version
3574 {
3575     my($self,$xsubpp) = @_;
3576     return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
3577
3578     my ($version) ;
3579
3580     # try to figure out the version number of the xsubpp on the system
3581
3582     # first try the -v flag, introduced in 1.921 & 2.000a2
3583
3584     return "" unless $self->needs_linking;
3585
3586     my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3587     print "Running $command\n" if $Verbose >= 2;
3588     $version = `$command` ;
3589     warn "Running '$command' exits with status " . ($?>>8) if $?;
3590     chop $version ;
3591
3592     return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
3593
3594     # nope, then try something else
3595
3596     my $counter = '000';
3597     my ($file) = 'temp' ;
3598     $counter++ while -e "$file$counter"; # don't overwrite anything
3599     $file .= $counter;
3600
3601     open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3602     print F <<EOM ;
3603 MODULE = fred PACKAGE = fred
3604
3605 int
3606 fred(a)
3607         int     a;
3608 EOM
3609
3610     close F ;
3611
3612     $command = "$self->{PERL} $xsubpp $file 2>&1";
3613     print "Running $command\n" if $Verbose >= 2;
3614     my $text = `$command` ;
3615     warn "Running '$command' exits with status " . ($?>>8) if $?;
3616     unlink $file ;
3617
3618     # gets 1.2 -> 1.92 and 2.000a1
3619     return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
3620
3621     # it is either 1.0 or 1.1
3622     return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3623
3624     # none of the above, so 1.0
3625     return $Xsubpp_Version = "1.0" ;
3626 }
3627
3628 =item top_targets (o)
3629
3630 Defines the targets all, subdirs, config, and O_FILES
3631
3632 =cut
3633
3634 sub top_targets {
3635 # --- Target Sections ---
3636
3637     my($self) = shift;
3638     my(@m);
3639     push @m, '
3640 #all :: config $(INST_PM) subdirs linkext manifypods
3641 ';
3642
3643     push @m, '
3644 all :: pure_all htmlifypods manifypods
3645         '.$self->{NOECHO}.'$(NOOP)
3646
3647           unless $self->{SKIPHASH}{'all'};
3648     
3649     push @m, '
3650 pure_all :: config pm_to_blib subdirs linkext
3651         '.$self->{NOECHO}.'$(NOOP)
3652
3653 subdirs :: $(MYEXTLIB)
3654         '.$self->{NOECHO}.'$(NOOP)
3655
3656 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3657         '.$self->{NOECHO}.'$(NOOP)
3658
3659 config :: $(INST_ARCHAUTODIR)/.exists
3660         '.$self->{NOECHO}.'$(NOOP)
3661
3662 config :: $(INST_AUTODIR)/.exists
3663         '.$self->{NOECHO}.'$(NOOP)
3664 ';
3665
3666     push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3667
3668     if (%{$self->{HTMLLIBPODS}}) {
3669         push @m, qq[
3670 config :: \$(INST_HTMLLIBDIR)/.exists
3671         $self->{NOECHO}\$(NOOP)
3672
3673 ];
3674         push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
3675     }
3676
3677     if (%{$self->{HTMLSCRIPTPODS}}) {
3678         push @m, qq[
3679 config :: \$(INST_HTMLSCRIPTDIR)/.exists
3680         $self->{NOECHO}\$(NOOP)
3681
3682 ];
3683         push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
3684     }
3685
3686     if (%{$self->{MAN1PODS}}) {
3687         push @m, qq[
3688 config :: \$(INST_MAN1DIR)/.exists
3689         $self->{NOECHO}\$(NOOP)
3690
3691 ];
3692         push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
3693     }
3694     if (%{$self->{MAN3PODS}}) {
3695         push @m, qq[
3696 config :: \$(INST_MAN3DIR)/.exists
3697         $self->{NOECHO}\$(NOOP)
3698
3699 ];
3700         push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
3701     }
3702
3703     push @m, '
3704 $(O_FILES): $(H_FILES)
3705 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
3706
3707     push @m, q{
3708 help:
3709         perldoc ExtUtils::MakeMaker
3710 };
3711
3712     push @m, q{
3713 Version_check:
3714         }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3715                 -MExtUtils::MakeMaker=Version_check \
3716                 -e "Version_check('$(MM_VERSION)')"
3717 };
3718
3719     join('',@m);
3720 }
3721
3722 =item writedoc
3723
3724 Obsolete, deprecated method. Not used since Version 5.21.
3725
3726 =cut
3727
3728 sub writedoc {
3729 # --- perllocal.pod section ---
3730     my($self,$what,$name,@attribs)=@_;
3731     my $time = localtime;
3732     print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3733     print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3734     print "\n\n=back\n\n";
3735 }
3736
3737 =item xs_c (o)
3738
3739 Defines the suffix rules to compile XS files to C.
3740
3741 =cut
3742
3743 sub xs_c {
3744     my($self) = shift;
3745     return '' unless $self->needs_linking();
3746     '
3747 .xs.c:
3748         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
3749 ';
3750 }
3751
3752 =item xs_cpp (o)
3753
3754 Defines the suffix rules to compile XS files to C++.
3755
3756 =cut
3757
3758 sub xs_cpp {
3759     my($self) = shift;
3760     return '' unless $self->needs_linking();
3761     '
3762 .xs.cpp:
3763         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
3764 ';
3765 }
3766
3767 =item xs_o (o)
3768
3769 Defines suffix rules to go from XS to object files directly. This is
3770 only intended for broken make implementations.
3771
3772 =cut
3773
3774 sub xs_o {      # many makes are too dumb to use xs_c then c_o
3775     my($self) = shift;
3776     return '' unless $self->needs_linking();
3777     '
3778 .xs$(OBJ_EXT):
3779         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
3780         $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
3781 ';
3782 }
3783
3784 =item perl_archive
3785
3786 This is internal method that returns path to libperl.a equivalent
3787 to be linked to dynamic extensions. UNIX does not have one but OS2
3788 and Win32 do.
3789
3790 =cut 
3791
3792 sub perl_archive
3793 {
3794  return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos";
3795  return "";
3796 }
3797
3798 =item export_list
3799
3800 This is internal method that returns name of a file that is
3801 passed to linker to define symbols to be exported.
3802 UNIX does not have one but OS2 and Win32 do.
3803
3804 =cut 
3805
3806 sub export_list
3807 {
3808  return "";
3809 }
3810
3811
3812 1;
3813
3814 =back
3815
3816 =head1 SEE ALSO
3817
3818 L<ExtUtils::MakeMaker>
3819
3820 =cut
3821
3822 __END__