Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / perl5 / 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.1.1.2 $, 10;
12 # $Id: MM_Unix.pm,v 1.1.1.2 1999/05/02 14:25:31 markm Exp $
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 Defines 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) -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     $search_prefix = $self->catdir($configure_prefix,"local");
1714     for $install_variable (qw/
1715                            INSTALLBIN
1716                            INSTALLSCRIPT
1717                            /) {
1718         $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1719     }
1720     $search_prefix = $configure_prefix =~ /perl/ ?
1721         $self->catdir($configure_prefix,"lib") :
1722         $self->catdir($configure_prefix,"lib","perl5");
1723     if ($self->{LIB}) {
1724         $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1725         $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = 
1726             $self->catdir($self->{LIB},$Config{'archname'});
1727     } else {
1728         $replace_prefix = $self->{PREFIX} =~ /perl/ ? 
1729             $self->catdir(qq[\$\(PREFIX\)],"lib") :
1730                 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
1731         for $install_variable (qw/
1732                                INSTALLPRIVLIB
1733                                INSTALLARCHLIB
1734                                INSTALLSITELIB
1735                                INSTALLSITEARCH
1736                                /) {
1737             $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1738         }
1739     }
1740     $search_prefix = $configure_prefix =~ /perl/ ?
1741         $self->catdir($configure_prefix,"man") :
1742             $self->catdir($configure_prefix,"lib","perl5","man");
1743     $replace_prefix = $self->{PREFIX} =~ /perl/ ? 
1744         $self->catdir(qq[\$\(PREFIX\)],"man") :
1745             $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
1746     for $install_variable (qw/
1747                            INSTALLMAN1DIR
1748                            INSTALLMAN3DIR
1749                            /) {
1750         $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1751     }
1752
1753     # Now we head at the manpages. Maybe they DO NOT want manpages
1754     # installed
1755     $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1756         unless defined $self->{INSTALLMAN1DIR};
1757     unless (defined $self->{INST_MAN1DIR}){
1758         if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1759             $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1760         } else {
1761             $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1762         }
1763     }
1764     $self->{MAN1EXT} ||= $Config::Config{man1ext};
1765
1766     $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1767         unless defined $self->{INSTALLMAN3DIR};
1768     unless (defined $self->{INST_MAN3DIR}){
1769         if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1770             $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1771         } else {
1772             $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1773         }
1774     }
1775     $self->{MAN3EXT} ||= $Config::Config{man3ext};
1776
1777
1778     # Get some stuff out of %Config if we haven't yet done so
1779     print STDOUT "CONFIG must be an array ref\n"
1780         if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1781     $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1782     push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1783     push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1784     my(%once_only,$m);
1785     foreach $m (@{$self->{CONFIG}}){
1786         next if $once_only{$m};
1787         print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1788                 unless exists $Config::Config{$m};
1789         $self->{uc $m} ||= $Config::Config{$m};
1790         $once_only{$m} = 1;
1791     }
1792
1793 # This is too dangerous:
1794 #    if ($^O eq "next") {
1795 #       $self->{AR} = "libtool";
1796 #       $self->{AR_STATIC_ARGS} = "-o";
1797 #    }
1798 # But I leave it as a placeholder
1799
1800     $self->{AR_STATIC_ARGS} ||= "cr";
1801
1802     # These should never be needed
1803     $self->{LD} ||= 'ld';
1804     $self->{OBJ_EXT} ||= '.o';
1805     $self->{LIB_EXT} ||= '.a';
1806
1807     $self->{MAP_TARGET} ||= "perl";
1808
1809     $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1810
1811     # make a simple check if we find Exporter
1812     warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1813         (Exporter.pm not found)"
1814         unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1815         $self->{NAME} eq "ExtUtils::MakeMaker";
1816
1817     # Determine VERSION and VERSION_FROM
1818     ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1819     if ($self->{VERSION_FROM}){
1820         $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1821             Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1822     }
1823
1824     # strip blanks
1825     if ($self->{VERSION}) {
1826         $self->{VERSION} =~ s/^\s+//;
1827         $self->{VERSION} =~ s/\s+$//;
1828     }
1829
1830     $self->{VERSION} ||= "0.10";
1831     ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1832
1833
1834     # Graham Barr and Paul Marquess had some ideas how to ensure
1835     # version compatibility between the *.pm file and the
1836     # corresponding *.xs file. The bottomline was, that we need an
1837     # XS_VERSION macro that defaults to VERSION:
1838     $self->{XS_VERSION} ||= $self->{VERSION};
1839
1840     # --- Initialize Perl Binary Locations
1841
1842     # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
1843     # will be working versions of perl 5. miniperl has priority over perl
1844     # for PERL to ensure that $(PERL) is usable while building ./ext/*
1845     my ($component,@defpath);
1846     foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
1847         push @defpath, $component if defined $component;
1848     }
1849     $self->{PERL} ||=
1850         $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
1851             \@defpath, $Verbose );
1852     # don't check if perl is executable, maybe they have decided to
1853     # supply switches with perl
1854
1855     # Define 'FULLPERL' to be a non-miniperl (used in test: target)
1856     ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
1857         unless ($self->{FULLPERL});
1858 }
1859
1860 =item init_others
1861
1862 Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
1863 OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
1864 MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1865
1866 =cut
1867
1868 sub init_others {       # --- Initialize Other Attributes
1869     my($self) = shift;
1870
1871     # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
1872     # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
1873     # undefined. In any case we turn it into an anon array:
1874
1875     # May check $Config{libs} too, thus not empty.
1876     $self->{LIBS}=[''] unless $self->{LIBS};
1877
1878     $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
1879     $self->{LD_RUN_PATH} = "";
1880     my($libs);
1881     foreach $libs ( @{$self->{LIBS}} ){
1882         $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
1883         my(@libs) = $self->extliblist($libs);
1884         if ($libs[0] or $libs[1] or $libs[2]){
1885             # LD_RUN_PATH now computed by ExtUtils::Liblist
1886             ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
1887             last;
1888         }
1889     }
1890
1891     if ( $self->{OBJECT} ) {
1892         $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
1893     } else {
1894         # init_dirscan should have found out, if we have C files
1895         $self->{OBJECT} = "";
1896         $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1897     }
1898     $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
1899     $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
1900     $self->{PERLMAINCC} ||= '$(CC)';
1901     $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1902
1903     # Sanity check: don't define LINKTYPE = dynamic if we're skipping
1904     # the 'dynamic' section of MM.  We don't have this problem with
1905     # 'static', since we either must use it (%Config says we can't
1906     # use dynamic loading) or the caller asked for it explicitly.
1907     if (!$self->{LINKTYPE}) {
1908        $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
1909                         ? 'static'
1910                         : ($Config::Config{usedl} ? 'dynamic' : 'static');
1911     };
1912
1913     # These get overridden for VMS and maybe some other systems
1914     $self->{NOOP}  ||= '$(SHELL) -c true';
1915     $self->{FIRST_MAKEFILE} ||= "Makefile";
1916     $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
1917     $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
1918     $self->{NOECHO} = '@' unless defined $self->{NOECHO};
1919     $self->{RM_F}  ||= "rm -f";
1920     $self->{RM_RF} ||= "rm -rf";
1921     $self->{TOUCH} ||= "touch";
1922     $self->{TEST_F} ||= "test -f";
1923     $self->{CP} ||= "cp";
1924     $self->{MV} ||= "mv";
1925     $self->{CHMOD} ||= "chmod";
1926     $self->{UMASK_NULL} ||= "umask 0";
1927     $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1928 }
1929
1930 =item install (o)
1931
1932 Defines the install target.
1933
1934 =cut
1935
1936 sub install {
1937     my($self, %attribs) = @_;
1938     my(@m);
1939
1940     push @m, q{
1941 install :: all pure_install doc_install
1942
1943 install_perl :: all pure_perl_install doc_perl_install
1944
1945 install_site :: all pure_site_install doc_site_install
1946
1947 install_ :: install_site
1948         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1949
1950 pure_install :: pure_$(INSTALLDIRS)_install
1951
1952 doc_install :: doc_$(INSTALLDIRS)_install
1953         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1954
1955 pure__install : pure_site_install
1956         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1957
1958 doc__install : doc_site_install
1959         @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1960
1961 pure_perl_install ::
1962         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1963                 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1964                 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1965                 $(INST_LIB) $(INSTALLPRIVLIB) \
1966                 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
1967                 $(INST_BIN) $(INSTALLBIN) \
1968                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1969                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1970                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1971         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1972                 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1973
1974
1975 pure_site_install ::
1976         }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1977                 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
1978                 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
1979                 $(INST_LIB) $(INSTALLSITELIB) \
1980                 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
1981                 $(INST_BIN) $(INSTALLBIN) \
1982                 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1983                 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1984                 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1985         }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1986                 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1987
1988 doc_perl_install ::
1989         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
1990                 "Module" "$(NAME)" \
1991                 "installed into" "$(INSTALLPRIVLIB)" \
1992                 LINKTYPE "$(LINKTYPE)" \
1993                 VERSION "$(VERSION)" \
1994                 EXE_FILES "$(EXE_FILES)" \
1995                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1996
1997 doc_site_install ::
1998         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
1999                 "Module" "$(NAME)" \
2000                 "installed into" "$(INSTALLSITELIB)" \
2001                 LINKTYPE "$(LINKTYPE)" \
2002                 VERSION "$(VERSION)" \
2003                 EXE_FILES "$(EXE_FILES)" \
2004                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2005
2006 };
2007
2008     push @m, q{
2009 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
2010
2011 uninstall_from_perldirs ::
2012         }.$self->{NOECHO}.
2013         q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
2014
2015 uninstall_from_sitedirs ::
2016         }.$self->{NOECHO}.
2017         q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
2018 };
2019
2020     join("",@m);
2021 }
2022
2023 =item installbin (o)
2024
2025 Defines targets to make and to install EXE_FILES.
2026
2027 =cut
2028
2029 sub installbin {
2030     my($self) = shift;
2031     return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
2032     return "" unless @{$self->{EXE_FILES}};
2033     my(@m, $from, $to, %fromto, @to);
2034     push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
2035     for $from (@{$self->{EXE_FILES}}) {
2036         my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
2037         local($_) = $path; # for backwards compatibility
2038         $to = $self->libscan($path);
2039         print "libscan($from) => '$to'\n" if ($Verbose >=2);
2040         $fromto{$from}=$to;
2041     }
2042     @to   = values %fromto;
2043     push(@m, qq{
2044 EXE_FILES = @{$self->{EXE_FILES}}
2045
2046 } . ($Is_Win32
2047   ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2048     -e "system qq[pl2bat.bat ].shift"
2049 } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
2050     -e "MY->fixin(shift)"
2051 }).qq{
2052 pure_all :: @to
2053         $self->{NOECHO}\$(NOOP)
2054
2055 realclean ::
2056         $self->{RM_F} @to
2057 });
2058
2059     while (($from,$to) = each %fromto) {
2060         last unless defined $from;
2061         my $todir = dirname($to);
2062         push @m, "
2063 $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
2064         $self->{NOECHO}$self->{RM_F} $to
2065         $self->{CP} $from $to
2066         \$(FIXIN) $to
2067         -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to
2068 ";
2069     }
2070     join "", @m;
2071 }
2072
2073 =item libscan (o)
2074
2075 Takes a path to a file that is found by init_dirscan and returns false
2076 if we don't want to include this file in the library. Mainly used to
2077 exclude RCS, CVS, and SCCS directories from installation.
2078
2079 =cut
2080
2081 # ';
2082
2083 sub libscan {
2084     my($self,$path) = @_;
2085     return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2086     $path;
2087 }
2088
2089 =item linkext (o)
2090
2091 Defines the linkext target which in turn defines the LINKTYPE.
2092
2093 =cut
2094
2095 sub linkext {
2096     my($self, %attribs) = @_;
2097     # LINKTYPE => static or dynamic or ''
2098     my($linktype) = defined $attribs{LINKTYPE} ?
2099       $attribs{LINKTYPE} : '$(LINKTYPE)';
2100     "
2101 linkext :: $linktype
2102         $self->{NOECHO}\$(NOOP)
2103 ";
2104 }
2105
2106 =item lsdir
2107
2108 Takes as arguments a directory name and a regular expression. Returns
2109 all entries in the directory that match the regular expression.
2110
2111 =cut
2112
2113 sub lsdir {
2114     my($self) = shift;
2115     my($dir, $regex) = @_;
2116     my(@ls);
2117     my $dh = new DirHandle;
2118     $dh->open($dir || ".") or return ();
2119     @ls = $dh->read;
2120     $dh->close;
2121     @ls = grep(/$regex/, @ls) if $regex;
2122     @ls;
2123 }
2124
2125 =item macro (o)
2126
2127 Simple subroutine to insert the macros defined by the macro attribute
2128 into the Makefile.
2129
2130 =cut
2131
2132 sub macro {
2133     my($self,%attribs) = @_;
2134     my(@m,$key,$val);
2135     while (($key,$val) = each %attribs){
2136         last unless defined $key;
2137         push @m, "$key = $val\n";
2138     }
2139     join "", @m;
2140 }
2141
2142 =item makeaperl (o)
2143
2144 Called by staticmake. Defines how to write the Makefile to produce a
2145 static new perl.
2146
2147 By default the Makefile produced includes all the static extensions in
2148 the perl library. (Purified versions of library files, e.g.,
2149 DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2150
2151 =cut
2152
2153 sub makeaperl {
2154     my($self, %attribs) = @_;
2155     my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2156         @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2157     my(@m);
2158     push @m, "
2159 # --- MakeMaker makeaperl section ---
2160 MAP_TARGET    = $target
2161 FULLPERL      = $self->{FULLPERL}
2162 ";
2163     return join '', @m if $self->{PARENT};
2164
2165     my($dir) = join ":", @{$self->{DIR}};
2166
2167     unless ($self->{MAKEAPERL}) {
2168         push @m, q{
2169 $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2170         $(MAKE) -f $(MAKE_APERL_FILE) $@
2171
2172 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2173         }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2174         }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2175                 Makefile.PL DIR=}, $dir, q{ \
2176                 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2177                 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
2178
2179         foreach (@ARGV){
2180                 if( /\s/ ){
2181                         s/=(.*)/='$1'/;
2182                 }
2183                 push @m, " \\\n\t\t$_";
2184         }
2185 #       push @m, map( " \\\n\t\t$_", @ARGV );
2186         push @m, "\n";
2187
2188         return join '', @m;
2189     }
2190
2191
2192
2193     my($cccmd, $linkcmd, $lperl);
2194
2195
2196     $cccmd = $self->const_cccmd($libperl);
2197     $cccmd =~ s/^CCCMD\s*=\s*//;
2198     $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
2199     $cccmd .= " $Config::Config{cccdlflags}"
2200         if ($Config::Config{useshrplib} eq 'true');
2201     $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
2202
2203     # The front matter of the linkcommand...
2204     $linkcmd = join ' ', "\$(CC)",
2205             grep($_, @Config{qw(large split ldflags ccdlflags)});
2206     $linkcmd =~ s/\s+/ /g;
2207     $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
2208
2209     # Which *.a files could we make use of...
2210     local(%static);
2211     require File::Find;
2212     File::Find::find(sub {
2213         return unless m/\Q$self->{LIB_EXT}\E$/;
2214         return if m/^libperl/;
2215         # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2216         return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
2217
2218         if( exists $self->{INCLUDE_EXT} ){
2219                 my $found = 0;
2220                 my $incl;
2221                 my $xx;
2222
2223                 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2224                 $xx =~ s,/?$_,,;
2225                 $xx =~ s,/,::,g;
2226
2227                 # Throw away anything not explicitly marked for inclusion.
2228                 # DynaLoader is implied.
2229                 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2230                         if( $xx eq $incl ){
2231                                 $found++;
2232                                 last;
2233                         }
2234                 }
2235                 return unless $found;
2236         }
2237         elsif( exists $self->{EXCLUDE_EXT} ){
2238                 my $excl;
2239                 my $xx;
2240
2241                 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2242                 $xx =~ s,/?$_,,;
2243                 $xx =~ s,/,::,g;
2244
2245                 # Throw away anything explicitly marked for exclusion
2246                 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2247                         return if( $xx eq $excl );
2248                 }
2249         }
2250
2251         # don't include the installed version of this extension. I
2252         # leave this line here, although it is not necessary anymore:
2253         # I patched minimod.PL instead, so that Miniperl.pm won't
2254         # enclude duplicates
2255
2256         # Once the patch to minimod.PL is in the distribution, I can
2257         # drop it
2258         return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
2259         use Cwd 'cwd';
2260         $static{cwd() . "/" . $_}++;
2261     }, grep( -d $_, @{$searchdirs || []}) );
2262
2263     # We trust that what has been handed in as argument, will be buildable
2264     $static = [] unless $static;
2265     @static{@{$static}} = (1) x @{$static};
2266
2267     $extra = [] unless $extra && ref $extra eq 'ARRAY';
2268     for (sort keys %static) {
2269         next unless /\Q$self->{LIB_EXT}\E$/;
2270         $_ = dirname($_) . "/extralibs.ld";
2271         push @$extra, $_;
2272     }
2273
2274     grep(s/^/-I/, @{$perlinc || []});
2275
2276     $target = "perl" unless $target;
2277     $tmp = "." unless $tmp;
2278
2279 # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2280 # regenerate the Makefiles, MAP_STATIC and the dependencies for
2281 # extralibs.all are computed correctly
2282     push @m, "
2283 MAP_LINKCMD   = $linkcmd
2284 MAP_PERLINC   = @{$perlinc || []}
2285 MAP_STATIC    = ",
2286 join(" \\\n\t", reverse sort keys %static), "
2287
2288 MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
2289 ";
2290
2291     if (defined $libperl) {
2292         ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2293     }
2294     unless ($libperl && -f $lperl) { # Ilya's code...
2295         my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2296         $libperl ||= "libperl$self->{LIB_EXT}";
2297         $libperl   = "$dir/$libperl";
2298         $lperl   ||= "libperl$self->{LIB_EXT}";
2299         $lperl     = "$dir/$lperl";
2300
2301         if (! -f $libperl and ! -f $lperl) {
2302           # We did not find a static libperl. Maybe there is a shared one?
2303           if ($^O eq 'solaris' or $^O eq 'sunos') {
2304             $lperl  = $libperl = "$dir/$Config::Config{libperl}";
2305             # SUNOS ld does not take the full path to a shared library
2306             $libperl = '' if $^O eq 'sunos';
2307           }
2308         }
2309
2310         print STDOUT "Warning: $libperl not found
2311     If you're going to build a static perl binary, make sure perl is installed
2312     otherwise ignore this warning\n"
2313                 unless (-f $lperl || defined($self->{PERL_SRC}));
2314     }
2315
2316     push @m, "
2317 MAP_LIBPERL = $libperl
2318 ";
2319
2320     push @m, "
2321 \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2322         $self->{NOECHO}$self->{RM_F} \$\@
2323         $self->{NOECHO}\$(TOUCH) \$\@
2324 ";
2325
2326     my $catfile;
2327     foreach $catfile (@$extra){
2328         push @m, "\tcat $catfile >> \$\@\n";
2329     }
2330     # SUNOS ld does not take the full path to a shared library
2331     my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
2332
2333     # Brain dead solaris linker does not use LD_RUN_PATH?
2334     # This fixes dynamic extensions which need shared libs
2335     my $ldfrom = ($^O eq 'solaris')?
2336            join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
2337
2338 push @m, "
2339 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
2340         \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
2341         $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2342         $self->{NOECHO}echo '    make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2343         $self->{NOECHO}echo 'To remove the intermediate files say'
2344         $self->{NOECHO}echo '    make -f $makefilename map_clean'
2345
2346 $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2347 ";
2348     push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
2349
2350     push @m, qq{
2351 $tmp/perlmain.c: $makefilename}, q{
2352         }.$self->{NOECHO}.q{echo Writing $@
2353         }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
2354                 -e "writemain(grep s#.*/auto/##, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
2355
2356 };
2357     push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2358 } if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2359
2360
2361     push @m, q{
2362 doc_inst_perl:
2363         }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2364         -}.$self->{NOECHO}.q{$(DOC_INSTALL) \
2365                 "Perl binary" "$(MAP_TARGET)" \
2366                 MAP_STATIC "$(MAP_STATIC)" \
2367                 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2368                 MAP_LIBPERL "$(MAP_LIBPERL)" \
2369                 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2370
2371 };
2372
2373     push @m, q{
2374 inst_perl: pure_inst_perl doc_inst_perl
2375
2376 pure_inst_perl: $(MAP_TARGET)
2377         }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
2378
2379 clean :: map_clean
2380
2381 map_clean :
2382         }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2383 };
2384
2385     join '', @m;
2386 }
2387
2388 =item makefile (o)
2389
2390 Defines how to rewrite the Makefile.
2391
2392 =cut
2393
2394 sub makefile {
2395     my($self) = shift;
2396     my @m;
2397     # We do not know what target was originally specified so we
2398     # must force a manual rerun to be sure. But as it should only
2399     # happen very rarely it is not a significant problem.
2400     push @m, '
2401 $(OBJECT) : $(FIRST_MAKEFILE)
2402 ' if $self->{OBJECT};
2403
2404     push @m, q{
2405 # We take a very conservative approach here, but it\'s worth it.
2406 # We move Makefile to Makefile.old here to avoid gnu make looping.
2407 }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2408         }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2409         }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
2410         -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{
2411         -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2412         -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
2413         $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
2414         }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2415         }.$self->{NOECHO}.q{echo "==> Please rerun the make command.  <=="
2416         false
2417
2418 # To change behavior to :: would be nice, but would break Tk b9.02
2419 # so you find such a warning below the dist target.
2420 #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2421 #       }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
2422 };
2423
2424     join "", @m;
2425 }
2426
2427 =item manifypods (o)
2428
2429 Defines targets and routines to translate the pods into manpages and
2430 put them into the INST_* directories.
2431
2432 =cut
2433
2434 sub manifypods {
2435     my($self, %attribs) = @_;
2436     return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
2437         %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
2438     my($dist);
2439     my($pod2man_exe);
2440     if (defined $self->{PERL_SRC}) {
2441         $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2442     } else {
2443         $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
2444     }
2445     unless ($self->perl_script($pod2man_exe)) {
2446         # No pod2man but some MAN3PODS to be installed
2447         print <<END;
2448
2449 Warning: I could not locate your pod2man program. Please make sure,
2450          your pod2man program is in your PATH before you execute 'make'
2451
2452 END
2453         $pod2man_exe = "-S pod2man";
2454     }
2455     my(@m);
2456     push @m,
2457 qq[POD2MAN_EXE = $pod2man_exe\n],
2458 qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
2459 q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
2460  $self->{MAKEFILE}, q[";' \\
2461 -e 'print "Manifying $$m{$$_}\n";' \\
2462 -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2463 -e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
2464 ];
2465     push @m, "\nmanifypods : pure_all ";
2466     push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
2467
2468     push(@m,"\n");
2469     if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2470         push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2471         push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
2472     }
2473     join('', @m);
2474 }
2475
2476 =item maybe_command
2477
2478 Returns true, if the argument is likely to be a command.
2479
2480 =cut
2481
2482 sub maybe_command {
2483     my($self,$file) = @_;
2484     return $file if -x $file && ! -d $file;
2485     return;
2486 }
2487
2488 =item maybe_command_in_dirs
2489
2490 method under development. Not yet used. Ask Ilya :-)
2491
2492 =cut
2493
2494 sub maybe_command_in_dirs {     # $ver is optional argument if looking for perl
2495 # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2496     my($self, $names, $dirs, $trace, $ver) = @_;
2497     my($name, $dir);
2498     foreach $dir (@$dirs){
2499         next unless defined $dir; # $self->{PERL_SRC} may be undefined
2500         foreach $name (@$names){
2501             my($abs,$tryabs);
2502             if ($self->file_name_is_absolute($name)) { # /foo/bar
2503                 $abs = $name;
2504             } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2505                 $abs = $self->catfile($dir, $name);
2506             } else { # foo/bar
2507                 $abs = $self->catfile($self->curdir, $name);
2508             }
2509             print "Checking $abs for $name\n" if ($trace >= 2);
2510             next unless $tryabs = $self->maybe_command($abs);
2511             print "Substituting $tryabs instead of $abs\n"
2512                 if ($trace >= 2 and $tryabs ne $abs);
2513             $abs = $tryabs;
2514             if (defined $ver) {
2515                 print "Executing $abs\n" if ($trace >= 2);
2516                 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2517                     print "Using PERL=$abs\n" if $trace;
2518                     return $abs;
2519                 }
2520             } else { # Do not look for perl
2521                 return $abs;
2522             }
2523         }
2524     }
2525 }
2526
2527 =item needs_linking (o)
2528
2529 Does this module need linking? Looks into subdirectory objects (see
2530 also has_link_code())
2531
2532 =cut
2533
2534 sub needs_linking {
2535     my($self) = shift;
2536     my($child,$caller);
2537     $caller = (caller(0))[3];
2538     Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2539     return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2540     if ($self->has_link_code or $self->{MAKEAPERL}){
2541         $self->{NEEDS_LINKING} = 1;
2542         return 1;
2543     }
2544     foreach $child (keys %{$self->{CHILDREN}}) {
2545         if ($self->{CHILDREN}->{$child}->needs_linking) {
2546             $self->{NEEDS_LINKING} = 1;
2547             return 1;
2548         }
2549     }
2550     return $self->{NEEDS_LINKING} = 0;
2551 }
2552
2553 =item nicetext
2554
2555 misnamed method (will have to be changed). The MM_Unix method just
2556 returns the argument without further processing.
2557
2558 On VMS used to insure that colons marking targets are preceded by
2559 space - most Unix Makes don't need this, but it's necessary under VMS
2560 to distinguish the target delimiter from a colon appearing as part of
2561 a filespec.
2562
2563 =cut
2564
2565 sub nicetext {
2566     my($self,$text) = @_;
2567     $text;
2568 }
2569
2570 =item parse_version
2571
2572 parse a file and return what you think is $VERSION in this file set to
2573
2574 =cut
2575
2576 sub parse_version {
2577     my($self,$parsefile) = @_;
2578     my $result;
2579     local *FH;
2580     local $/ = "\n";
2581     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2582     my $inpod = 0;
2583     while (<FH>) {
2584         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2585         next if $inpod;
2586         chop;
2587         # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2588         next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
2589         my $eval = qq{
2590             package ExtUtils::MakeMaker::_version;
2591             no strict;
2592
2593             local $1$2;
2594             \$$2=undef; do {
2595                 $_
2596             }; \$$2
2597         };
2598         local($^W) = 0;
2599         $result = eval($eval);
2600         die "Could not eval '$eval' in $parsefile: $@" if $@;
2601         $result = "undef" unless defined $result;
2602         last;
2603     }
2604     close FH;
2605     return $result;
2606 }
2607
2608 =item parse_abstract
2609
2610 parse a file and return what you think is the ABSTRACT
2611
2612 =cut
2613
2614 sub parse_abstract {
2615     my($self,$parsefile) = @_;
2616     my $result;
2617     local *FH;
2618     local $/ = "\n";
2619     open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2620     my $inpod = 0;
2621     my $package = $self->{DISTNAME};
2622     $package =~ s/-/::/;
2623     while (<FH>) {
2624         $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2625         next if !$inpod;
2626         chop;
2627         next unless /^($package\s-\s)(.*)/;
2628         $result = $2;
2629         last;
2630     }
2631     close FH;
2632     return $result;
2633 }
2634
2635 =item pasthru (o)
2636
2637 Defines the string that is passed to recursive make calls in
2638 subdirectories.
2639
2640 =cut
2641
2642 sub pasthru {
2643     my($self) = shift;
2644     my(@m,$key);
2645
2646     my(@pasthru);
2647     my($sep) = $Is_VMS ? ',' : '';
2648     $sep .= "\\\n\t";
2649
2650     foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
2651         push @pasthru, "$key=\"\$($key)\"";
2652     }
2653
2654     push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
2655     join "", @m;
2656 }
2657
2658 =item path
2659
2660 Takes no argument, returns the environment variable PATH as an array.
2661
2662 =cut
2663
2664 sub path {
2665     my($self) = @_;
2666     my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
2667     my $path = $ENV{PATH};
2668     $path =~ s:\\:/:g if $Is_OS2;
2669     my @path = split $path_sep, $path;
2670     foreach(@path) { $_ = '.' if $_ eq '' }
2671     @path;
2672 }
2673
2674 =item perl_script
2675
2676 Takes one argument, a file name, and returns the file name, if the
2677 argument is likely to be a perl script. On MM_Unix this is true for
2678 any ordinary, readable file.
2679
2680 =cut
2681
2682 sub perl_script {
2683     my($self,$file) = @_;
2684     return $file if -r $file && -f _;
2685     return;
2686 }
2687
2688 =item perldepend (o)
2689
2690 Defines the dependency from all *.h files that come with the perl
2691 distribution.
2692
2693 =cut
2694
2695 sub perldepend {
2696     my($self) = shift;
2697     my(@m);
2698     push @m, q{
2699 # Check for unpropogated config.sh changes. Should never happen.
2700 # We do NOT just update config.h because that is not sufficient.
2701 # An out of date config.h is not fatal but complains loudly!
2702 $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2703         -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2704
2705 $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2706         }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2707         cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2708 } if $self->{PERL_SRC};
2709
2710     return join "", @m unless $self->needs_linking;
2711
2712     push @m, q{
2713 PERL_HDRS = \
2714 $(PERL_INC)/EXTERN.h       $(PERL_INC)/gv.h           $(PERL_INC)/pp.h       \
2715 $(PERL_INC)/INTERN.h       $(PERL_INC)/handy.h        $(PERL_INC)/proto.h    \
2716 $(PERL_INC)/XSUB.h         $(PERL_INC)/hv.h           $(PERL_INC)/regcomp.h  \
2717 $(PERL_INC)/av.h           $(PERL_INC)/keywords.h     $(PERL_INC)/regexp.h   \
2718 $(PERL_INC)/config.h       $(PERL_INC)/mg.h           $(PERL_INC)/scope.h    \
2719 $(PERL_INC)/cop.h          $(PERL_INC)/op.h           $(PERL_INC)/sv.h       \
2720 $(PERL_INC)/cv.h           $(PERL_INC)/opcode.h       $(PERL_INC)/unixish.h  \
2721 $(PERL_INC)/dosish.h       $(PERL_INC)/patchlevel.h   $(PERL_INC)/util.h     \
2722 $(PERL_INC)/embed.h        $(PERL_INC)/perl.h         $(PERL_INC)/iperlsys.h \
2723 $(PERL_INC)/form.h         $(PERL_INC)/perly.h
2724
2725 $(OBJECT) : $(PERL_HDRS)
2726 } if $self->{OBJECT};
2727
2728     push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
2729
2730     join "\n", @m;
2731 }
2732
2733 =item ppd
2734
2735 Defines target that creates a PPD (Perl Package Description) file
2736 for a binary distribution.
2737
2738 =cut
2739
2740 sub ppd {
2741     my($self) = @_;
2742     my(@m);
2743     if ($self->{ABSTRACT_FROM}){
2744         $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2745             Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n";
2746     }
2747     my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
2748     push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
2749     push(@m, "ppd:\n");
2750     push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
2751     push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
2752     my $abstract = $self->{ABSTRACT};
2753     $abstract =~ s/\n/\\n/sg;
2754     $abstract =~ s/</&lt;/g;
2755     $abstract =~ s/>/&gt;/g;
2756     push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
2757     my ($author) = $self->{AUTHOR};
2758     $author =~ s/</&lt;/g;
2759     $author =~ s/>/&gt;/g;
2760     $author =~ s/@/\\@/g;
2761     push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
2762     push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
2763     my ($prereq);
2764     foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
2765         my $pre_req = $prereq;
2766         $pre_req =~ s/::/-/g;
2767         my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3];
2768         push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" VERSION=\\\"$dep_ver\\\" />\\n}");
2769     }
2770     push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
2771     push(@m, ". qq{\\t\\t<ARCHITECTURE NAME=\\\"$Config{'archname'}\\\" />\\n}");
2772     my ($bin_location) = $self->{BINARY_LOCATION};
2773     $bin_location =~ s/\\/\\\\/g;
2774     if ($self->{PPM_INSTALL_SCRIPT}) {
2775         if ($self->{PPM_INSTALL_EXEC}) {
2776             push(@m, " . qq{\\t\\t<INSTALL EXEC=\\\"$self->{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2777         }
2778         else {
2779             push(@m, " . qq{\\t\\t<INSTALL>$self->{PPM_INSTALL_SCRIPT}</INSTALL>\\n}");
2780         }
2781     }
2782     push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
2783     push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
2784     push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
2785
2786     join("", @m);   
2787 }
2788
2789 =item perm_rw (o)
2790
2791 Returns the attribute C<PERM_RW> or the string C<644>.
2792 Used as the string that is passed
2793 to the C<chmod> command to set the permissions for read/writeable files.
2794 MakeMaker chooses C<644> because it has turned out in the past that
2795 relying on the umask provokes hard-to-track bug reports.
2796 When the return value is used by the perl function C<chmod>, it is
2797 interpreted as an octal value.
2798
2799 =cut
2800
2801 sub perm_rw {
2802     shift->{PERM_RW} || "644";
2803 }
2804
2805 =item perm_rwx (o)
2806
2807 Returns the attribute C<PERM_RWX> or the string C<755>,
2808 i.e. the string that is passed
2809 to the C<chmod> command to set the permissions for executable files.
2810 See also perl_rw.
2811
2812 =cut
2813
2814 sub perm_rwx {
2815     shift->{PERM_RWX} || "755";
2816 }
2817
2818 =item pm_to_blib
2819
2820 Defines target that copies all files in the hash PM to their
2821 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
2822
2823 =cut
2824
2825 sub pm_to_blib {
2826     my $self = shift;
2827     my($autodir) = $self->catdir('$(INST_LIB)','auto');
2828     return q{
2829 pm_to_blib: $(TO_INST_PM)
2830         }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
2831         "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
2832         -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
2833         }.$self->{NOECHO}.q{$(TOUCH) $@
2834 };
2835 }
2836
2837 =item post_constants (o)
2838
2839 Returns an empty string per default. Dedicated to overrides from
2840 within Makefile.PL after all constants have been defined.
2841
2842 =cut
2843
2844 sub post_constants{
2845     my($self) = shift;
2846     "";
2847 }
2848
2849 =item post_initialize (o)
2850
2851 Returns an empty string per default. Used in Makefile.PLs to add some
2852 chunk of text to the Makefile after the object is initialized.
2853
2854 =cut
2855
2856 sub post_initialize {
2857     my($self) = shift;
2858     "";
2859 }
2860
2861 =item postamble (o)
2862
2863 Returns an empty string. Can be used in Makefile.PLs to write some
2864 text to the Makefile at the end.
2865
2866 =cut
2867
2868 sub postamble {
2869     my($self) = shift;
2870     "";
2871 }
2872
2873 =item prefixify
2874
2875 Check a path variable in $self from %Config, if it contains a prefix,
2876 and replace it with another one.
2877
2878 Takes as arguments an attribute name, a search prefix and a
2879 replacement prefix. Changes the attribute in the object.
2880
2881 =cut
2882
2883 sub prefixify {
2884     my($self,$var,$sprefix,$rprefix) = @_;
2885     $self->{uc $var} ||= $Config{lc $var};
2886     $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
2887     $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
2888 }
2889
2890 =item processPL (o)
2891
2892 Defines targets to run *.PL files.
2893
2894 =cut
2895
2896 sub processPL {
2897     my($self) = shift;
2898     return "" unless $self->{PL_FILES};
2899     my(@m, $plfile);
2900     foreach $plfile (sort keys %{$self->{PL_FILES}}) {
2901         my $list = ref($self->{PL_FILES}->{$plfile})
2902                 ? $self->{PL_FILES}->{$plfile}
2903                 : [$self->{PL_FILES}->{$plfile}];
2904         foreach $target (@$list) {
2905         push @m, "
2906 all :: $target
2907         $self->{NOECHO}\$(NOOP)
2908
2909 $target :: $plfile
2910         \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target
2911 ";
2912         }
2913     }
2914     join "", @m;
2915 }
2916
2917 =item realclean (o)
2918
2919 Defines the realclean target.
2920
2921 =cut
2922
2923 sub realclean {
2924     my($self, %attribs) = @_;
2925     my(@m);
2926     push(@m,'
2927 # Delete temporary files (via clean) and also delete installed files
2928 realclean purge ::  clean
2929 ');
2930     # realclean subdirectories first (already cleaned)
2931     my $sub = "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
2932     foreach(@{$self->{DIR}}){
2933         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
2934         push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
2935     }
2936     push(@m, "  $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
2937     if( $self->has_link_code ){
2938         push(@m, "      $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
2939         push(@m, "      $self->{RM_F} \$(INST_STATIC)\n");
2940     }
2941     push(@m, "  $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n")
2942         if keys %{$self->{PM}};
2943     my(@otherfiles) = ($self->{MAKEFILE},
2944                        "$self->{MAKEFILE}.old"); # Makefiles last
2945     push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
2946     push(@m, "  $self->{RM_RF} @otherfiles\n") if @otherfiles;
2947     push(@m, "  $attribs{POSTOP}\n")       if $attribs{POSTOP};
2948     join("", @m);
2949 }
2950
2951 =item replace_manpage_separator
2952
2953 Takes the name of a package, which may be a nested package, in the
2954 form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
2955
2956 =cut
2957
2958 sub replace_manpage_separator {
2959     my($self,$man) = @_;
2960         if ($^O eq 'uwin') {
2961                 $man =~ s,/+,.,g;
2962         } else {
2963                 $man =~ s,/+,::,g;
2964         }
2965     $man;
2966 }
2967
2968 =item static (o)
2969
2970 Defines the static target.
2971
2972 =cut
2973
2974 sub static {
2975 # --- Static Loading Sections ---
2976
2977     my($self) = shift;
2978     '
2979 ## $(INST_PM) has been moved to the all: target.
2980 ## It remains here for awhile to allow for old usage: "make static"
2981 #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
2982 static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
2983         '.$self->{NOECHO}.'$(NOOP)
2984 ';
2985 }
2986
2987 =item static_lib (o)
2988
2989 Defines how to produce the *.a (or equivalent) files.
2990
2991 =cut
2992
2993 sub static_lib {
2994     my($self) = @_;
2995 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
2996 #    return '' unless $self->needs_linking(); #might be because of a subdir
2997
2998     return '' unless $self->has_link_code;
2999
3000     my(@m);
3001     push(@m, <<'END');
3002 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
3003         $(RM_RF) $@
3004 END
3005     # If this extension has it's own library (eg SDBM_File)
3006     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
3007     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
3008
3009     push @m,
3010 q{      $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
3011         $(CHMOD) $(PERM_RWX) $@
3012         }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
3013 };
3014     # Old mechanism - still available:
3015     push @m,
3016 "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
3017 }       if $self->{PERL_SRC} && $self->{EXTRALIBS};
3018     push @m, "\n";
3019
3020     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
3021     join('', "\n",@m);
3022 }
3023
3024 =item staticmake (o)
3025
3026 Calls makeaperl.
3027
3028 =cut
3029
3030 sub staticmake {
3031     my($self, %attribs) = @_;
3032     my(@static);
3033
3034     my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
3035
3036     # And as it's not yet built, we add the current extension
3037     # but only if it has some C code (or XS code, which implies C code)
3038     if (@{$self->{C}}) {
3039         @static = $self->catfile($self->{INST_ARCHLIB},
3040                                  "auto",
3041                                  $self->{FULLEXT},
3042                                  "$self->{BASEEXT}$self->{LIB_EXT}"
3043                                 );
3044     }
3045
3046     # Either we determine now, which libraries we will produce in the
3047     # subdirectories or we do it at runtime of the make.
3048
3049     # We could ask all subdir objects, but I cannot imagine, why it
3050     # would be necessary.
3051
3052     # Instead we determine all libraries for the new perl at
3053     # runtime.
3054     my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
3055
3056     $self->makeaperl(MAKE       => $self->{MAKEFILE},
3057                      DIRS       => \@searchdirs,
3058                      STAT       => \@static,
3059                      INCL       => \@perlinc,
3060                      TARGET     => $self->{MAP_TARGET},
3061                      TMP        => "",
3062                      LIBPERL    => $self->{LIBPERL_A}
3063                     );
3064 }
3065
3066 =item subdir_x (o)
3067
3068 Helper subroutine for subdirs
3069
3070 =cut
3071
3072 sub subdir_x {
3073     my($self, $subdir) = @_;
3074     my(@m);
3075     qq{
3076
3077 subdirs ::
3078         $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
3079
3080 };
3081 }
3082
3083 =item subdirs (o)
3084
3085 Defines targets to process subdirectories.
3086
3087 =cut
3088
3089 sub subdirs {
3090 # --- Sub-directory Sections ---
3091     my($self) = shift;
3092     my(@m,$dir);
3093     # This method provides a mechanism to automatically deal with
3094     # subdirectories containing further Makefile.PL scripts.
3095     # It calls the subdir_x() method for each subdirectory.
3096     foreach $dir (@{$self->{DIR}}){
3097         push(@m, $self->subdir_x($dir));
3098 ####    print "Including $dir subdirectory\n";
3099     }
3100     if (@m){
3101         unshift(@m, "
3102 # The default clean, realclean and test targets in this Makefile
3103 # have automatically been given entries for each subdir.
3104
3105 ");
3106     } else {
3107         push(@m, "\n# none")
3108     }
3109     join('',@m);
3110 }
3111
3112 =item test (o)
3113
3114 Defines the test targets.
3115
3116 =cut
3117
3118 sub test {
3119 # --- Test and Installation Sections ---
3120
3121     my($self, %attribs) = @_;
3122     my $tests = $attribs{TESTS};
3123     if (!$tests && -d 't') {
3124         $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
3125     }
3126     # note: 'test.pl' name is also hardcoded in init_dirscan()
3127     my(@m);
3128     push(@m,"
3129 TEST_VERBOSE=0
3130 TEST_TYPE=test_\$(LINKTYPE)
3131 TEST_FILE = test.pl
3132 TEST_FILES = $tests
3133 TESTDB_SW = -d
3134
3135 testdb :: testdb_\$(LINKTYPE)
3136
3137 test :: \$(TEST_TYPE)
3138 ");
3139     push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
3140                  @{$self->{DIR}}));
3141     push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
3142         unless $tests or -f "test.pl" or @{$self->{DIR}};
3143     push(@m, "\n");
3144
3145     push(@m, "test_dynamic :: pure_all\n");
3146     push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
3147     push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
3148     push(@m, "\n");
3149
3150     push(@m, "testdb_dynamic :: pure_all\n");
3151     push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
3152     push(@m, "\n");
3153
3154     # Occasionally we may face this degenerate target:
3155     push @m, "test_ : test_dynamic\n\n";
3156
3157     if ($self->needs_linking()) {
3158         push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
3159         push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
3160         push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
3161         push(@m, "\n");
3162         push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
3163         push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
3164         push(@m, "\n");
3165     } else {
3166         push @m, "test_static :: test_dynamic\n";
3167         push @m, "testdb_static :: testdb_dynamic\n";
3168     }
3169     join("", @m);
3170 }
3171
3172 =item test_via_harness (o)
3173
3174 Helper method to write the test targets
3175
3176 =cut
3177
3178 sub test_via_harness {
3179     my($self, $perl, $tests) = @_;
3180     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3181     "\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";
3182 }
3183
3184 =item test_via_script (o)
3185
3186 Other helper method for test.
3187
3188 =cut
3189
3190 sub test_via_script {
3191     my($self, $perl, $script) = @_;
3192     $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3193     qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
3194 };
3195 }
3196
3197 =item tool_autosplit (o)
3198
3199 Defines a simple perl call that runs autosplit. May be deprecated by
3200 pm_to_blib soon.
3201
3202 =cut
3203
3204 sub tool_autosplit {
3205 # --- Tool Sections ---
3206
3207     my($self, %attribs) = @_;
3208     my($asl) = "";
3209     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
3210     q{
3211 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
3212 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
3213 };
3214 }
3215
3216 =item tools_other (o)
3217
3218 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
3219 the Makefile. Also defines the perl programs MKPATH,
3220 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
3221
3222 =cut
3223
3224 sub tools_other {
3225     my($self) = shift;
3226     my @m;
3227     my $bin_sh = $Config{sh} || '/bin/sh';
3228     push @m, qq{
3229 SHELL = $bin_sh
3230 };
3231
3232     for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
3233         push @m, "$_ = $self->{$_}\n";
3234     }
3235
3236     push @m, q{
3237 # The following is a portable way to say mkdir -p
3238 # To see which directories are created, change the if 0 to if 1
3239 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
3240
3241 # This helps us to minimize the effect of the .exists files A yet
3242 # better solution would be to have a stable file in the perl
3243 # distribution with a timestamp of zero. But this solution doesn't
3244 # need any changes to the core distribution and works with older perls
3245 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
3246 };
3247
3248
3249     return join "", @m if $self->{PARENT};
3250
3251     push @m, q{
3252 # Here we warn users that an old packlist file was found somewhere,
3253 # and that they should call some uninstall routine
3254 WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
3255 -e 'print "WARNING: I have found an old package in\n";' \\
3256 -e 'print "\t$$ARGV[0].\n";' \\
3257 -e 'print "Please make sure the two installations are not conflicting\n";'
3258
3259 UNINST=0
3260 VERBINST=1
3261
3262 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
3263 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
3264
3265 DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
3266 -e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", shift, ">";' \
3267 -e 'print "=over 4";' \
3268 -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
3269 -e 'print "=back";'
3270
3271 UNINSTALL =   $(PERL) -MExtUtils::Install \
3272 -e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
3273 -e 'print " packlist above carefully.\n  There may be errors. Remove the";' \
3274 -e 'print " appropriate files manually.\n  Sorry for the inconveniences.\n"'
3275 };
3276
3277     return join "", @m;
3278 }
3279
3280 =item tool_xsubpp (o)
3281
3282 Determines typemaps, xsubpp version, prototype behaviour.
3283
3284 =cut
3285
3286 sub tool_xsubpp {
3287     my($self) = shift;
3288     return "" unless $self->needs_linking;
3289     my($xsdir)  = $self->catdir($self->{PERL_LIB},"ExtUtils");
3290     my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3291     if( $self->{TYPEMAPS} ){
3292         my $typemap;
3293         foreach $typemap (@{$self->{TYPEMAPS}}){
3294                 if( ! -f  $typemap ){
3295                         warn "Typemap $typemap not found.\n";
3296                 }
3297                 else{
3298                         push(@tmdeps,  $typemap);
3299                 }
3300         }
3301     }
3302     push(@tmdeps, "typemap") if -f "typemap";
3303     my(@tmargs) = map("-typemap $_", @tmdeps);
3304     if( exists $self->{XSOPT} ){
3305         unshift( @tmargs, $self->{XSOPT} );
3306     }
3307
3308
3309     my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
3310
3311     # What are the correct thresholds for version 1 && 2 Paul?
3312     if ( $xsubpp_version > 1.923 ){
3313         $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3314     } else {
3315         if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3316             print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3317         Your version of xsubpp is $xsubpp_version and cannot handle this.
3318         Please upgrade to a more recent version of xsubpp.
3319 };
3320         } else {
3321             $self->{XSPROTOARG} = "";
3322         }
3323     }
3324
3325     my $xsubpp = $self->{CAPI} ? "xsubpp -object_capi" : "xsubpp";
3326
3327     return qq{
3328 XSUBPPDIR = $xsdir
3329 XSUBPP = \$(XSUBPPDIR)/$xsubpp
3330 XSPROTOARG = $self->{XSPROTOARG}
3331 XSUBPPDEPS = @tmdeps
3332 XSUBPPARGS = @tmargs
3333 };
3334 };
3335
3336 sub xsubpp_version
3337 {
3338     my($self,$xsubpp) = @_;
3339     return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
3340
3341     my ($version) ;
3342
3343     # try to figure out the version number of the xsubpp on the system
3344
3345     # first try the -v flag, introduced in 1.921 & 2.000a2
3346
3347     return "" unless $self->needs_linking;
3348
3349     my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3350     print "Running $command\n" if $Verbose >= 2;
3351     $version = `$command` ;
3352     warn "Running '$command' exits with status " . ($?>>8) if $?;
3353     chop $version ;
3354
3355     return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
3356
3357     # nope, then try something else
3358
3359     my $counter = '000';
3360     my ($file) = 'temp' ;
3361     $counter++ while -e "$file$counter"; # don't overwrite anything
3362     $file .= $counter;
3363
3364     open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3365     print F <<EOM ;
3366 MODULE = fred PACKAGE = fred
3367
3368 int
3369 fred(a)
3370         int     a;
3371 EOM
3372
3373     close F ;
3374
3375     $command = "$self->{PERL} $xsubpp $file 2>&1";
3376     print "Running $command\n" if $Verbose >= 2;
3377     my $text = `$command` ;
3378     warn "Running '$command' exits with status " . ($?>>8) if $?;
3379     unlink $file ;
3380
3381     # gets 1.2 -> 1.92 and 2.000a1
3382     return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/  ;
3383
3384     # it is either 1.0 or 1.1
3385     return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3386
3387     # none of the above, so 1.0
3388     return $Xsubpp_Version = "1.0" ;
3389 }
3390
3391 =item top_targets (o)
3392
3393 Defines the targets all, subdirs, config, and O_FILES
3394
3395 =cut
3396
3397 sub top_targets {
3398 # --- Target Sections ---
3399
3400     my($self) = shift;
3401     my(@m);
3402     push @m, '
3403 #all :: config $(INST_PM) subdirs linkext manifypods
3404 ';
3405
3406     push @m, '
3407 all :: pure_all manifypods
3408         '.$self->{NOECHO}.'$(NOOP)
3409
3410           unless $self->{SKIPHASH}{'all'};
3411     
3412     push @m, '
3413 pure_all :: config pm_to_blib subdirs linkext
3414         '.$self->{NOECHO}.'$(NOOP)
3415
3416 subdirs :: $(MYEXTLIB)
3417         '.$self->{NOECHO}.'$(NOOP)
3418
3419 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3420         '.$self->{NOECHO}.'$(NOOP)
3421
3422 config :: $(INST_ARCHAUTODIR)/.exists
3423         '.$self->{NOECHO}.'$(NOOP)
3424
3425 config :: $(INST_AUTODIR)/.exists
3426         '.$self->{NOECHO}.'$(NOOP)
3427 ';
3428
3429     push @m, qq{
3430 config :: Version_check
3431         $self->{NOECHO}\$(NOOP)
3432
3433 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
3434
3435     push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3436
3437     if (%{$self->{MAN1PODS}}) {
3438         push @m, qq[
3439 config :: \$(INST_MAN1DIR)/.exists
3440         $self->{NOECHO}\$(NOOP)
3441
3442 ];
3443         push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
3444     }
3445     if (%{$self->{MAN3PODS}}) {
3446         push @m, qq[
3447 config :: \$(INST_MAN3DIR)/.exists
3448         $self->{NOECHO}\$(NOOP)
3449
3450 ];
3451         push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
3452     }
3453
3454     push @m, '
3455 $(O_FILES): $(H_FILES)
3456 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
3457
3458     push @m, q{
3459 help:
3460         perldoc ExtUtils::MakeMaker
3461 };
3462
3463     push @m, q{
3464 Version_check:
3465         }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3466                 -MExtUtils::MakeMaker=Version_check \
3467                 -e "Version_check('$(MM_VERSION)')"
3468 };
3469
3470     join('',@m);
3471 }
3472
3473 =item writedoc
3474
3475 Obsolete, deprecated method. Not used since Version 5.21.
3476
3477 =cut
3478
3479 sub writedoc {
3480 # --- perllocal.pod section ---
3481     my($self,$what,$name,@attribs)=@_;
3482     my $time = localtime;
3483     print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3484     print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3485     print "\n\n=back\n\n";
3486 }
3487
3488 =item xs_c (o)
3489
3490 Defines the suffix rules to compile XS files to C.
3491
3492 =cut
3493
3494 sub xs_c {
3495     my($self) = shift;
3496     return '' unless $self->needs_linking();
3497     '
3498 .xs.c:
3499         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
3500 ';
3501 }
3502
3503 =item xs_cpp (o)
3504
3505 Defines the suffix rules to compile XS files to C++.
3506
3507 =cut
3508
3509 sub xs_cpp {
3510     my($self) = shift;
3511     return '' unless $self->needs_linking();
3512     '
3513 .xs.cpp:
3514         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
3515 ';
3516 }
3517
3518 =item xs_o (o)
3519
3520 Defines suffix rules to go from XS to object files directly. This is
3521 only intended for broken make implementations.
3522
3523 =cut
3524
3525 sub xs_o {      # many makes are too dumb to use xs_c then c_o
3526     my($self) = shift;
3527     return '' unless $self->needs_linking();
3528     '
3529 .xs$(OBJ_EXT):
3530         $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
3531         $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
3532 ';
3533 }
3534
3535 =item perl_archive
3536
3537 This is internal method that returns path to libperl.a equivalent
3538 to be linked to dynamic extensions. UNIX does not have one but OS2
3539 and Win32 do.
3540
3541 =cut 
3542
3543 sub perl_archive
3544 {
3545  return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos";
3546  return "";
3547 }
3548
3549 =item export_list
3550
3551 This is internal method that returns name of a file that is
3552 passed to linker to define symbols to be exported.
3553 UNIX does not have one but OS2 and Win32 do.
3554
3555 =cut 
3556
3557 sub export_list
3558 {
3559  return "";
3560 }
3561
3562
3563 1;
3564
3565 =back
3566
3567 =head1 SEE ALSO
3568
3569 L<ExtUtils::MakeMaker>
3570
3571 =cut
3572
3573 __END__