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