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