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