ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/staticperl/perl/lib/ExtUtils/MM_Unix.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:11 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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