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