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