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