1 package ExtUtils::MM_Unix;
5 use File::Basename qw(basename dirname fileparse);
8 use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos
9 $Verbose %pm %static $Xsubpp_Version);
11 $VERSION = substr q$Revision: 1.118 $, 10;
12 # $Id: MM_Unix.pm,v 1.118 1997/08/01 09:42:52 k Exp $
14 Exporter::import('ExtUtils::MakeMaker',
15 qw( $Verbose &neatvalue));
17 $Is_OS2 = $^O eq 'os2';
18 $Is_Mac = $^O eq 'MacOS';
19 $Is_Win32 = $^O eq 'MSWin32';
20 $Is_Dos = $^O eq 'dos';
22 if ($Is_VMS = $^O eq 'VMS') {
23 require VMS::Filespec;
24 import VMS::Filespec qw( &vmsify );
29 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
33 C<require ExtUtils::MM_Unix;>
37 The methods provided by this package are designed to be used in
38 conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
39 Makefile, it creates one or more objects that inherit their methods
40 from a package C<MM>. MM itself doesn't provide any methods, but it
41 ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
42 specific packages take the responsibility for all the methods provided
43 by MM_Unix. We are trying to reduce the number of the necessary
44 overrides by defining rather primitive operations within
47 If you are going to write a platform specific MM package, please try
48 to limit the necessary overrides to primitive methods, and if it is not
49 possible to do so, let's work out how to achieve that gain.
51 If you are overriding any of these methods in your Makefile.PL (in the
52 MY class), please report that to the makemaker mailing list. We are
53 trying to minimize the necessary method overrides and switch to data
54 driven Makefile.PLs wherever possible. In the long run less methods
55 will be overridable via the MY class.
59 The following description of methods is still under
60 development. Please refer to the code for not suitably documented
61 sections and complain loudly to the makemaker mailing list.
63 Not all of the methods below are overridable in a
64 Makefile.PL. Overridable methods are marked as (o). All methods are
65 overridable by a platform specific MM_*.pm file (See
66 L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
68 =head2 Preloaded methods
74 No physical check on the filesystem, but a logical cleanup of a
75 path. On UNIX eliminated successive slashes and successive "/.".
81 $path =~ s|/+|/|g ; # xx////xx -> xx/xx
82 $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
83 $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx
84 $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx
90 Concatenate two or more directory names to form a complete path ending
91 with a directory. But remove the trailing slash from the resulting
92 string, because it doesn't look good, isn't necessary and confuses
93 OS2. Of course, if this is the root directory, don't cut off the
104 # append a slash to each argument unless it has one there
105 $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
107 $self->canonpath(join('', @args));
112 Concatenate one or more directory names and a filename to form a
113 complete path ending with a filename
120 return $self->canonpath($file) unless @_;
121 my $dir = $self->catdir(@_);
123 $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
125 return $self->canonpath($dir.$file);
130 Returns a string representing of the current directory. "." on UNIX.
140 Returns a string representing of the root directory. "/" on UNIX.
150 Returns a string representing of the parent directory. ".." on UNIX.
158 sub ExtUtils::MM_Unix::c_o ;
159 sub ExtUtils::MM_Unix::clean ;
160 sub ExtUtils::MM_Unix::const_cccmd ;
161 sub ExtUtils::MM_Unix::const_config ;
162 sub ExtUtils::MM_Unix::const_loadlibs ;
163 sub ExtUtils::MM_Unix::constants ;
164 sub ExtUtils::MM_Unix::depend ;
165 sub ExtUtils::MM_Unix::dir_target ;
166 sub ExtUtils::MM_Unix::dist ;
167 sub ExtUtils::MM_Unix::dist_basics ;
168 sub ExtUtils::MM_Unix::dist_ci ;
169 sub ExtUtils::MM_Unix::dist_core ;
170 sub ExtUtils::MM_Unix::dist_dir ;
171 sub ExtUtils::MM_Unix::dist_test ;
172 sub ExtUtils::MM_Unix::dlsyms ;
173 sub ExtUtils::MM_Unix::dynamic ;
174 sub ExtUtils::MM_Unix::dynamic_bs ;
175 sub ExtUtils::MM_Unix::dynamic_lib ;
176 sub ExtUtils::MM_Unix::exescan ;
177 sub ExtUtils::MM_Unix::export_list ;
178 sub ExtUtils::MM_Unix::extliblist ;
179 sub ExtUtils::MM_Unix::file_name_is_absolute ;
180 sub ExtUtils::MM_Unix::find_perl ;
181 sub ExtUtils::MM_Unix::fixin ;
182 sub ExtUtils::MM_Unix::force ;
183 sub ExtUtils::MM_Unix::guess_name ;
184 sub ExtUtils::MM_Unix::has_link_code ;
185 sub ExtUtils::MM_Unix::init_dirscan ;
186 sub ExtUtils::MM_Unix::init_main ;
187 sub ExtUtils::MM_Unix::init_others ;
188 sub ExtUtils::MM_Unix::install ;
189 sub ExtUtils::MM_Unix::installbin ;
190 sub ExtUtils::MM_Unix::libscan ;
191 sub ExtUtils::MM_Unix::linkext ;
192 sub ExtUtils::MM_Unix::lsdir ;
193 sub ExtUtils::MM_Unix::macro ;
194 sub ExtUtils::MM_Unix::makeaperl ;
195 sub ExtUtils::MM_Unix::makefile ;
196 sub ExtUtils::MM_Unix::manifypods ;
197 sub ExtUtils::MM_Unix::maybe_command ;
198 sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
199 sub ExtUtils::MM_Unix::needs_linking ;
200 sub ExtUtils::MM_Unix::nicetext ;
201 sub ExtUtils::MM_Unix::parse_version ;
202 sub ExtUtils::MM_Unix::pasthru ;
203 sub ExtUtils::MM_Unix::path ;
204 sub ExtUtils::MM_Unix::perl_archive;
205 sub ExtUtils::MM_Unix::perl_script ;
206 sub ExtUtils::MM_Unix::perldepend ;
207 sub ExtUtils::MM_Unix::pm_to_blib ;
208 sub ExtUtils::MM_Unix::post_constants ;
209 sub ExtUtils::MM_Unix::post_initialize ;
210 sub ExtUtils::MM_Unix::postamble ;
211 sub ExtUtils::MM_Unix::ppd ;
212 sub ExtUtils::MM_Unix::prefixify ;
213 sub ExtUtils::MM_Unix::processPL ;
214 sub ExtUtils::MM_Unix::realclean ;
215 sub ExtUtils::MM_Unix::replace_manpage_separator ;
216 sub ExtUtils::MM_Unix::static ;
217 sub ExtUtils::MM_Unix::static_lib ;
218 sub ExtUtils::MM_Unix::staticmake ;
219 sub ExtUtils::MM_Unix::subdir_x ;
220 sub ExtUtils::MM_Unix::subdirs ;
221 sub ExtUtils::MM_Unix::test ;
222 sub ExtUtils::MM_Unix::test_via_harness ;
223 sub ExtUtils::MM_Unix::test_via_script ;
224 sub ExtUtils::MM_Unix::tool_autosplit ;
225 sub ExtUtils::MM_Unix::tool_xsubpp ;
226 sub ExtUtils::MM_Unix::tools_other ;
227 sub ExtUtils::MM_Unix::top_targets ;
228 sub ExtUtils::MM_Unix::writedoc ;
229 sub ExtUtils::MM_Unix::xs_c ;
230 sub ExtUtils::MM_Unix::xs_o ;
231 sub ExtUtils::MM_Unix::xsubpp_version ;
233 package ExtUtils::MM_Unix;
243 =head2 SelfLoaded methods
249 Defines the suffix rules to compile different flavors of C files to
255 # --- Translation Sections ---
258 return '' unless $self->needs_linking();
262 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
266 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
267 ' if $^O ne 'os2' and $^O ne 'MSWin32' and $^O ne 'dos'; #Case-specific
270 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
273 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
276 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
283 Does very much the same as the cflags script in the perl
284 distribution. It doesn't return the whole compiler command line, but
285 initializes all of its parts. The const_cccmd method then actually
286 returns the definition of the CCCMD macro which uses these parts.
293 my($self,$libperl)=@_;
294 return $self->{CFLAGS} if $self->{CFLAGS};
295 return '' unless $self->needs_linking();
297 my($prog, $uc, $perltype, %cflags);
298 $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
299 $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
301 @cflags{qw(cc ccflags optimize large split shellflags)}
302 = @Config{qw(cc ccflags optimize large split shellflags)};
305 $cflags{shellflags} ||= '';
310 DE => '-DDEBUGGING -DEMBED',
311 M => '-DEMBED -DMULTIPLICITY',
312 DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
315 if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
318 $uc = ""; # avoid warning
320 $perltype = $map{$uc} ? $map{$uc} : "";
328 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
329 if ($prog = $Config::Config{$name}) {
330 # Expand hints for this extension via the shell
331 print STDOUT "Processing $name hint:\n" if $Verbose;
332 my(@o)=`cc=\"$cflags{cc}\"
333 ccflags=\"$cflags{ccflags}\"
334 optimize=\"$cflags{optimize}\"
335 perltype=\"$cflags{perltype}\"
336 optdebug=\"$cflags{optdebug}\"
337 large=\"$cflags{large}\"
338 split=\"$cflags{'split'}\"
341 echo ccflags=\$ccflags
342 echo optimize=\$optimize
343 echo perltype=\$perltype
344 echo optdebug=\$optdebug
351 if ($line =~ /(.*?)=\s*(.*)\s*$/){
353 print STDOUT " $1 = $2\n" if $Verbose;
355 print STDOUT "Unrecognised result from hint: '$line'\n";
361 $cflags{optimize} = $optdebug;
364 for (qw(ccflags optimize perltype large split)) {
365 $cflags{$_} =~ s/^\s+//;
366 $cflags{$_} =~ s/\s+/ /g;
367 $cflags{$_} =~ s/\s+$//;
368 $self->{uc $_} ||= $cflags{$_}
371 return $self->{CFLAGS} = qq{
372 CCFLAGS = $self->{CCFLAGS}
373 OPTIMIZE = $self->{OPTIMIZE}
374 PERLTYPE = $self->{PERLTYPE}
375 LARGE = $self->{LARGE}
376 SPLIT = $self->{SPLIT}
383 Defines the clean target.
388 # --- Cleanup and Distribution Sections ---
390 my($self, %attribs) = @_;
393 # Delete temporary files but do not touch installed files. We don\'t delete
394 # the Makefile here so a later make realclean still has a makefile to use.
398 # clean subdirectories first
399 for $dir (@{$self->{DIR}}) {
400 push @m, "\t-cd $dir && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) clean\n";
403 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
404 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
405 push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
406 perlmain.c mon.out core so_locations pm_to_blib
407 *~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
408 $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
411 push @m, "\t-$self->{RM_RF} @otherfiles\n";
412 # See realclean and ext/utils/make_ext for usage of Makefile.old
414 "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old \$(DEV_NULL)\n");
416 "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
420 =item const_cccmd (o)
422 Returns the full compiler call for C programs and stores the
423 definition in CONST_CCCMD.
428 my($self,$libperl)=@_;
429 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
430 return '' unless $self->needs_linking();
431 return $self->{CONST_CCCMD} =
432 q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
433 $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
434 $(XS_DEFINE_VERSION)};
437 =item const_config (o)
439 Defines a couple of constants in the Makefile that are imported from
445 # --- Constants Sections ---
449 push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
450 push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
452 foreach $m (@{$self->{CONFIG}}){
453 # SITE*EXP macros are defined in &constants; avoid duplicates here
454 next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
455 push @m, "\U$m\E = ".$self->{uc $m}."\n";
461 =item const_loadlibs (o)
463 Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
464 L<ExtUtils::Liblist> for details.
470 return "" unless $self->needs_linking;
473 # $self->{NAME} might depend on some other libraries:
474 # See ExtUtils::Liblist for details
479 EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
481 next unless defined $self->{$tmp};
482 push @m, "$tmp = $self->{$tmp}\n";
489 Initializes lots of constants and .SUFFIXES and .PHONY
499 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
500 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
501 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
502 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
503 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
504 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
505 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
506 PERL_INC PERL FULLPERL
509 next unless defined $self->{$tmp};
510 push @m, "$tmp = $self->{$tmp}\n";
514 VERSION_MACRO = VERSION
515 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
516 XS_VERSION_MACRO = XS_VERSION
517 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
521 MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
522 MM_VERSION = $ExtUtils::MakeMaker::VERSION
526 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
527 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
528 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
529 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
530 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
534 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
537 next unless defined $self->{$tmp};
538 push @m, "$tmp = $self->{$tmp}\n";
542 # Handy lists of source code files:
543 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
544 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
545 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
546 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
547 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
548 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
552 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
554 next unless defined $self->{$tmp};
555 push @m, "$tmp = $self->{$tmp}\n";
559 .NO_CONFIG_REC: Makefile
560 } if $ENV{CLEARCASE_ROOT};
562 # why not q{} ? -- emacs
564 # work around a famous dec-osf make(1) feature(?):
567 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
569 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
570 # some make implementations will delete the Makefile when we rebuild it. Because
571 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
572 # does so. Our milage may vary.
573 # .PRECIOUS: Makefile # seems to be not necessary anymore
575 .PHONY: all config static dynamic test linkext manifest
577 # Where is the Config information that we are using/depend on
578 CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
581 my @parentdir = split(/::/, $self->{PARENT_NAME});
583 # Where to put things:
584 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
585 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
587 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
588 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
591 if ($self->has_link_code()) {
593 INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
594 INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
595 INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
605 $tmp = $self->export_list;
609 $tmp = $self->perl_archive;
615 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
617 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
621 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
623 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
631 Same as macro for the depend attribute.
636 my($self,%attribs) = @_;
638 while (($key,$val) = each %attribs){
639 last unless defined $key;
640 push @m, "$key: $val\n";
647 Takes an array of directories that need to exist and returns a
648 Makefile entry for a .exists file in these directories. Returns
649 nothing, if the entry has already been processed. We're helpless
650 though, if the same directory comes as $(FOO) _and_ as "bar". Both of
651 them get an entry, that's why we use "::".
656 # --- Make-Directories section (internal method) ---
657 # dir_target(@array) returns a Makefile entry for the file .exists in each
658 # named directory. Returns nothing, if the entry has already been processed.
659 # We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
660 # Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
661 # prerequisite, because there has to be one, something that doesn't change
664 my($self,@dirs) = @_;
665 my(@m,$dir,$targdir);
666 foreach $dir (@dirs) {
667 my($src) = $self->catfile($self->{PERL_INC},'perl.h');
668 my($targ) = $self->catfile($dir,'.exists');
669 # catfile may have adapted syntax of $dir to target OS, so...
670 if ($Is_VMS) { # Just remove file name; dirspec is often in macro
671 ($targdir = $targ) =~ s:/?\.exists$::;
673 else { # while elsewhere we expect to see the dir separator in $targ
674 $targdir = dirname($targ);
676 next if $self->{DIR_TARGET}{$self}{$targdir}++;
679 $self->{NOECHO}\$(MKPATH) $targdir
680 $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
683 -$self->{NOECHO}\$(CHMOD) 755 $targdir
691 Defines a lot of macros for distribution support.
696 my($self, %attribs) = @_;
699 # VERSION should be sanitised before use as a file name
700 my($version) = $attribs{VERSION} || '$(VERSION)';
701 my($name) = $attribs{NAME} || '$(DISTNAME)';
702 my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar
703 my($tarflags) = $attribs{TARFLAGS} || 'cvf';
704 my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck!
705 my($zipflags) = $attribs{ZIPFLAGS} || '-r';
706 my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip
707 my($suffix) = $attribs{SUFFIX} || '.Z'; # eg .gz
708 my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip"
709 my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
710 my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
712 my($to_unix) = $attribs{TO_UNIX} || ($Is_OS2
714 . '$(TEST_F) tmp.zip && $(RM) tmp.zip;'
715 . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip'
716 : "$self->{NOECHO}\$(NOOP)");
718 my($ci) = $attribs{CI} || 'ci -u';
719 my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
720 my($dist_cp) = $attribs{DIST_CP} || 'best';
721 my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
724 DISTVNAME = ${name}-$version
736 RCS_LABEL = $rcs_label
738 DIST_DEFAULT = $dist_default
743 =item dist_basics (o)
745 Defines the targets distclean, distcheck, skipcheck, manifest.
753 distclean :: realclean distcheck
758 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=fullcheck \\
764 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=skipcheck \\
770 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\
778 Defines a check in target for RCS.
787 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
788 -e "@all = keys %{ maniread() };" \\
789 -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
790 -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
797 Defeines the targets dist, tardist, zipdist, uutardist, shdist
805 dist : $(DIST_DEFAULT)
806 }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
807 -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
809 tardist : $(DISTVNAME).tar$(SUFFIX)
811 zipdist : $(DISTVNAME).zip
813 $(DISTVNAME).tar$(SUFFIX) : distdir
816 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
817 $(RM_RF) $(DISTVNAME)
818 $(COMPRESS) $(DISTVNAME).tar
821 $(DISTVNAME).zip : distdir
823 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
824 $(RM_RF) $(DISTVNAME)
827 uutardist : $(DISTVNAME).tar$(SUFFIX)
828 uuencode $(DISTVNAME).tar$(SUFFIX) \\
829 $(DISTVNAME).tar$(SUFFIX) > \\
830 $(DISTVNAME).tar$(SUFFIX)_uu
834 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
835 $(RM_RF) $(DISTVNAME)
843 Defines the scratch directory target that will hold the distribution
844 before tar-ing (or shar-ing).
853 $(RM_RF) $(DISTVNAME)
854 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
855 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
862 Defines a target that produces the distribution in the
863 scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
873 cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
874 cd $(DISTVNAME) && $(MAKE)
875 cd $(DISTVNAME) && $(MAKE) test
882 Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
888 my($self,%attribs) = @_;
890 return '' unless ($^O eq 'aix' && $self->needs_linking() );
892 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
893 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
897 dynamic :: $self->{BASEEXT}.exp
899 ") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
902 static :: $self->{BASEEXT}.exp
904 ") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
907 $self->{BASEEXT}.exp: Makefile.PL
908 ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
909 Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
910 neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
918 Defines the dynamic target.
923 # --- Dynamic Loading Sections ---
927 ## $(INST_PM) has been moved to the all: target.
928 ## It remains here for awhile to allow for old usage: "make dynamic"
929 #dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
930 dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
931 '.$self->{NOECHO}.'$(NOOP)
937 Defines targets for bootstrap files.
942 my($self, %attribs) = @_;
945 ' unless $self->has_link_code();
948 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
950 # As Mkbootstrap might not write a file (if none is required)
951 # we use touch to prevent make continually trying to remake it.
952 # The DynaLoader only reads a non-empty file.
953 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
954 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
955 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
956 -MExtUtils::Mkbootstrap \
957 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
958 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
961 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
962 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
963 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
968 =item dynamic_lib (o)
970 Defines how to produce the *.so (or equivalent) files.
975 my($self, %attribs) = @_;
976 return '' unless $self->needs_linking(); #might be because of a subdir
978 return '' unless $self->has_link_code;
980 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
981 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
982 my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
983 my($ldfrom) = '$(LDFROM)';
984 $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
987 # This section creates the dynamically loadable $(INST_DYNAMIC)
988 # from $(OBJECT) and possibly $(MYEXTLIB).
989 ARMAYBE = '.$armaybe.'
990 OTHERLDFLAGS = '.$otherldflags.'
991 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
993 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
995 if ($armaybe ne ':'){
996 $ldfrom = 'tmp$(LIB_EXT)';
997 push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
998 push(@m,' $(RANLIB) '."$ldfrom\n");
1000 $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
1002 # Brain dead solaris linker does not use LD_RUN_PATH?
1003 # This fixes dynamic extensions which need shared libs
1005 $ldrun = join ' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}
1006 if ($^O eq 'solaris');
1008 push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom.
1009 ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
1014 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1020 Deprecated method. Use libscan instead.
1025 my($self,$path) = @_;
1031 Called by init_others, and calls ext ExtUtils::Liblist. See
1032 L<ExtUtils::Liblist> for details.
1037 my($self,$libs) = @_;
1038 require ExtUtils::Liblist;
1039 $self->ext($libs, $Verbose);
1042 =item file_name_is_absolute
1044 Takes as argument a path and returns true, if it is an absolute path.
1048 sub file_name_is_absolute {
1049 my($self,$file) = @_;
1051 $file =~ m{^([a-z]:)?[\\/]}i ;
1060 Finds the executables PERL and FULLPERL
1065 my($self, $ver, $names, $dirs, $trace) = @_;
1068 print "Looking for perl $ver by these names:
1074 foreach $dir (@$dirs){
1075 next unless defined $dir; # $self->{PERL_SRC} may be undefined
1076 foreach $name (@$names){
1078 if ($self->file_name_is_absolute($name)) { # /foo/bar
1080 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1081 $abs = $self->catfile($dir, $name);
1083 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1085 print "Checking $abs\n" if ($trace >= 2);
1086 next unless $self->maybe_command($abs);
1087 print "Executing $abs\n" if ($trace >= 2);
1088 $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1089 if ($val =~ /VER_OK/) {
1090 print "Using PERL=$abs\n" if $trace;
1092 } elsif ($trace >= 2) {
1093 print "Result: `$val'\n";
1097 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1098 0; # false and not empty
1103 =head2 Methods to actually produce chunks of text for the Makefile
1105 The methods here are called for each MakeMaker object in the order
1106 specified by @ExtUtils::MakeMaker::MM_Sections.
1112 Inserts the sharpbang or equivalent magic number to a script
1116 sub fixin { # stolen from the pink Camel book, more or less
1117 my($self,@files) = @_;
1118 my($does_shbang) = $Config::Config{'sharpbang'} =~ /^\s*\#\!/;
1119 my($file,$interpreter);
1120 for $file (@files) {
1123 open(FIXIN, $file) or Carp::croak "Can't process '$file': $!";
1125 chomp(my $line = <FIXIN>);
1126 next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
1127 # Now figure out the interpreter name.
1128 my($cmd,$arg) = split ' ', $line, 2;
1131 # Now look (in reverse) for interpreter in absolute PATH (unless perl).
1132 if ($cmd eq "perl") {
1133 if ($Config{startperl} =~ m,^\#!.*/perl,) {
1134 $interpreter = $Config{startperl};
1135 $interpreter =~ s,^\#!,,;
1137 $interpreter = $Config{perlpath};
1140 my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
1143 foreach $dir (@absdirs) {
1144 if ($self->maybe_command($cmd)) {
1145 warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
1146 $interpreter = $self->catfile($dir,$cmd);
1150 # Figure out how to invoke interpreter on this machine.
1154 print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
1155 # this is probably value-free on DOSISH platforms
1157 $shb .= "$Config{'sharpbang'}$interpreter";
1158 $shb .= ' ' . $arg if defined $arg;
1162 eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
1163 if 0; # not running under some shell
1164 } unless $Is_Win32; # this won't work on win32, so don't
1166 warn "Can't find $cmd in PATH, $file unchanged"
1171 unless ( open(FIXOUT,">$file.new") ) {
1172 warn "Can't create new $file: $!\n";
1175 my($dev,$ino,$mode) = stat FIXIN;
1176 $mode = 0755 unless $dev;
1179 # Print out the new #! line (or equivalent).
1182 print FIXOUT $shb, <FIXIN>;
1185 # can't rename open files on some DOSISH platforms
1186 unless ( rename($file, "$file.bak") ) {
1187 warn "Can't rename $file to $file.bak: $!";
1190 unless ( rename("$file.new", $file) ) {
1191 warn "Can't rename $file.new to $file: $!";
1192 unless ( rename("$file.bak", $file) ) {
1193 warn "Can't rename $file.bak back to $file either: $!";
1194 warn "Leaving $file renamed as $file.bak\n";
1200 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1201 system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
1213 '# Phony target to force checking subdirectories.
1215 '.$self->{NOECHO}.'$(NOOP)
1221 Guess the name of this package by examining the working directory's
1222 name. MakeMaker calls this only if the developer has not supplied a
1232 my $name = basename(cwd());
1233 $name =~ s|[\-_][\d\.\-]+$||; # this is new with MM 5.00, we
1234 # strip minus or underline
1235 # followed by a float or some such
1236 print "Warning: Guessing NAME [$name] from current directory name.\n";
1242 Returns true if C, XS, MYEXTLIB or similar objects exist within this
1243 object that need a compiler. Does not descend into subdirectories as
1244 needs_linking() does.
1250 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1251 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1252 $self->{HAS_LINK_CODE} = 1;
1255 return $self->{HAS_LINK_CODE} = 0;
1260 Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
1264 sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
1266 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1267 local(%pm); #the sub in find() has to see this hash
1268 $ignore{'test.pl'} = 1;
1269 $ignore{'makefile.pl'} = 1 if $Is_VMS;
1270 foreach $name ($self->lsdir($self->curdir)){
1271 next if $name =~ /\#/;
1272 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1273 next unless $self->libscan($name);
1275 next if -l $name; # We do not support symlinks at all
1276 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
1277 } elsif ($name =~ /\.xs$/){
1278 my($c); ($c = $name) =~ s/\.xs$/.c/;
1281 } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
1283 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
1284 } elsif ($name =~ /\.h$/i){
1286 } elsif ($name =~ /\.(p[ml]|pod)$/){
1287 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
1288 } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
1289 ($pl_files{$name} = $name) =~ s/\.PL$// ;
1290 } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
1291 $name ne 'test.pl') { # case-insensitive filesystem
1292 ($pl_files{$name} = $name) =~ s/\.pl$// ;
1296 # Some larger extensions often wish to install a number of *.pm/pl
1297 # files into the library in various locations.
1299 # The attribute PMLIBDIRS holds an array reference which lists
1300 # subdirectories which we should search for library files to
1301 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1302 # recursively search through the named directories (skipping any
1303 # which don't exist or contain Makefile.PL files).
1305 # For each *.pm or *.pl file found $self->libscan() is called with
1306 # the default installation path in $_[1]. The return value of
1307 # libscan defines the actual installation location. The default
1308 # libscan function simply returns the path. The file is skipped
1309 # if libscan returns false.
1311 # The default installation location passed to libscan in $_[1] is:
1313 # ./*.pm => $(INST_LIBDIR)/*.pm
1314 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1315 # ./lib/... => $(INST_LIB)/...
1317 # In this way the 'lib' directory is seen as the root of the actual
1318 # perl library whereas the others are relative to INST_LIBDIR
1319 # (which includes PARENT_NAME). This is a subtle distinction but one
1320 # that's important for nested modules.
1322 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1323 unless $self->{PMLIBDIRS};
1325 #only existing directories that aren't in $dir are allowed
1327 # Avoid $_ wherever possible:
1328 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1329 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1331 @{$self->{PMLIBDIRS}} = ();
1332 foreach $pmlibdir (@pmlibdirs) {
1333 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1336 if (@{$self->{PMLIBDIRS}}){
1337 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1340 File::Find::find(sub {
1342 if ($_ eq "CVS" || $_ eq "RCS"){
1343 $File::Find::prune = 1;
1348 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1349 my($striplibpath,$striplibname);
1350 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
1351 ($striplibname,$striplibpath) = fileparse($striplibpath);
1352 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1353 local($_) = $inst; # for backwards compatibility
1354 $inst = $self->libscan($inst);
1355 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1356 return unless $inst;
1358 }, @{$self->{PMLIBDIRS}});
1361 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1362 $self->{XS} = \%xs unless $self->{XS};
1363 $self->{PM} = \%pm unless $self->{PM};
1364 $self->{C} = [sort keys %c] unless $self->{C};
1365 my(@o_files) = @{$self->{C}};
1366 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
1367 $self->{H} = [sort keys %h] unless $self->{H};
1368 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1370 # Set up names of manual pages to generate from pods
1371 if ($self->{MAN1PODS}) {
1372 } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
1373 $self->{MAN1PODS} = {};
1375 my %manifypods = ();
1376 if ( exists $self->{EXE_FILES} ) {
1377 foreach $name (@{$self->{EXE_FILES}}) {
1378 # use FileHandle ();
1379 # my $fh = new FileHandle;
1382 # if ($fh->open("<$name")) {
1383 if (open(FH,"<$name")) {
1386 if (/^=head1\s+\w+/) {
1394 # If it doesn't exist yet, we assume, it has pods in it
1398 $manifypods{$name} =
1399 $self->catfile('$(INST_MAN1DIR)',
1400 basename($name).'.$(MAN1EXT)');
1404 $self->{MAN1PODS} = \%manifypods;
1406 if ($self->{MAN3PODS}) {
1407 } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
1408 $self->{MAN3PODS} = {};
1410 my %manifypods = (); # we collect the keys first, i.e. the files
1411 # we have to convert to pod
1412 foreach $name (keys %{$self->{PM}}) {
1413 if ($name =~ /\.pod$/ ) {
1414 $manifypods{$name} = $self->{PM}{$name};
1415 } elsif ($name =~ /\.p[ml]$/ ) {
1416 # use FileHandle ();
1417 # my $fh = new FileHandle;
1420 # $fh->open("<$name");
1421 if (open(FH,"<$name")) {
1424 if (/^=head1\s+\w+/) {
1435 $manifypods{$name} = $self->{PM}{$name};
1440 # Remove "Configure.pm" and similar, if it's not the only pod listed
1441 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1442 foreach $name (keys %manifypods) {
1443 if ($name =~ /(config|setup).*\.pm/i) {
1444 delete $manifypods{$name};
1447 my($manpagename) = $name;
1448 unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
1449 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1451 $manpagename =~ s/\.p(od|m|l)$//;
1452 $manpagename = $self->replace_manpage_separator($manpagename);
1453 $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
1455 $self->{MAN3PODS} = \%manifypods;
1461 Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1462 PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
1463 PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
1464 LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
1471 # --- Initialize Module Name and Paths
1473 # NAME = Foo::Bar::Oracle
1474 # FULLEXT = Foo/Bar/Oracle
1476 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1477 # PARENT_NAME = Foo::Bar
1479 ### ($self->{FULLEXT} =
1480 ### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1481 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1484 # Copied from DynaLoader:
1486 my(@modparts) = split(/::/,$self->{NAME});
1487 my($modfname) = $modparts[-1];
1489 # Some systems have restrictions on files names for DLL's etc.
1490 # mod2fname returns appropriate file base name (typically truncated)
1491 # It may also edit @modparts if required.
1492 if (defined &DynaLoader::mod2fname) {
1493 $modfname = &DynaLoader::mod2fname(\@modparts);
1496 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
1498 if (defined &DynaLoader::mod2fname) {
1499 # As of 5.001m, dl_os2 appends '_'
1500 $self->{DLBASE} = $modfname;
1502 $self->{DLBASE} = '$(BASEEXT)';
1506 ### ROOTEXT deprecated from MM 5.32
1507 ### ($self->{ROOTEXT} =
1508 ### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1509 ### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1512 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1514 # *Real* information: where did we get these two from? ...
1515 my $inc_config_dir = dirname($INC{'Config.pm'});
1516 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1518 unless ($self->{PERL_SRC}){
1520 foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
1522 -f $self->catfile($dir,"config.sh")
1524 -f $self->catfile($dir,"perl.h")
1526 -f $self->catfile($dir,"lib","Exporter.pm")
1528 $self->{PERL_SRC}=$dir ;
1533 if ($self->{PERL_SRC}){
1534 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1535 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
1536 $self->{PERL_INC} = ($Is_Win32) ? $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
1538 # catch a situation that has occurred a few times in the past:
1540 -s $self->catfile($self->{PERL_SRC},'cflags')
1544 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1551 You cannot build extensions below the perl source tree after executing
1552 a 'make clean' in the perl source tree.
1554 To rebuild extensions distributed with the perl source you should
1555 simply Configure (to include those extensions) and then build perl as
1556 normal. After installing perl the source tree can be deleted. It is
1557 not needed for building extensions by running 'perl Makefile.PL'
1558 usually without extra arguments.
1560 It is recommended that you unpack and build additional extensions away
1561 from the perl source tree.
1565 # we should also consider $ENV{PERL5LIB} here
1566 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1567 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1568 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1570 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1572 Error: Unable to locate installed Perl libraries or Perl source code.
1574 It is recommended that you install perl in a standard location before
1575 building extensions. Some precompiled versions of perl do not contain
1576 these header files, so you cannot build extensions. In such a case,
1577 please build and install your perl from a fresh perl distribution. It
1578 usually solves this kind of problem.
1580 \(You get this message, because MakeMaker could not find "$perl_h"\)
1583 # print STDOUT "Using header files found in $self->{PERL_INC}\n"
1584 # if $Verbose && $self->needs_linking();
1588 # We get SITELIBEXP and SITEARCHEXP directly via
1589 # Get_from_Config. When we are running standard modules, these
1590 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1591 # set it to "site". I prefer that INSTALLDIRS be set from outside
1593 $self->{INSTALLDIRS} ||= "site";
1595 # INST_LIB typically pre-set if building an extension after
1596 # perl has been built and installed. Setting INST_LIB allows
1597 # you to build directly into, say $Config::Config{privlibexp}.
1598 unless ($self->{INST_LIB}){
1601 ##### XXXXX We have to change this nonsense
1603 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1604 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1606 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1609 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1610 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1612 # We need to set up INST_LIBDIR before init_libscan() for VMS
1613 my @parentdir = split(/::/, $self->{PARENT_NAME});
1614 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1615 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1616 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1617 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1619 # INST_EXE is deprecated, should go away March '97
1620 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1621 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1623 # The user who requests an installation directory explicitly
1624 # should not have to tell us a architecture installation directory
1625 # as well. We look if a directory exists that is named after the
1626 # architecture. If not we take it as a sign that it should be the
1627 # same as the requested installation directory. Otherwise we take
1629 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1631 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1632 my $lib = "install$libpair->{l}";
1634 my $Arch = uc "install$libpair->{a}";
1635 if( $self->{$Lib} && ! $self->{$Arch} ){
1636 my($ilib) = $Config{$lib};
1637 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1639 $self->prefixify($Arch,$ilib,$self->{$Lib});
1641 unless (-d $self->{$Arch}) {
1642 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1643 $self->{$Arch} = $self->{$Lib};
1645 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1649 # we have to look at the relation between $Config{prefix} and the
1650 # requested values. We're going to set the $Config{prefix} part of
1651 # all the installation path variables to literally $(PREFIX), so
1652 # the user can still say make PREFIX=foo
1653 my($configure_prefix) = $Config{'prefix'};
1654 $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
1655 $self->{PREFIX} ||= $configure_prefix;
1658 my($install_variable,$search_prefix,$replace_prefix);
1660 # The rule, taken from Configure, is that if prefix contains perl,
1662 # perlprefix/lib/ INSTALLPRIVLIB
1663 # perlprefix/lib/pod/
1664 # perlprefix/lib/site_perl/ INSTALLSITELIB
1665 # perlprefix/bin/ INSTALLBIN
1666 # perlprefix/man/ INSTALLMAN1DIR
1668 # prefix/lib/perl5/ INSTALLPRIVLIB
1669 # prefix/lib/perl5/pod/
1670 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1671 # prefix/bin/ INSTALLBIN
1672 # prefix/lib/perl5/man/ INSTALLMAN1DIR
1674 $replace_prefix = qq[\$\(PREFIX\)];
1675 for $install_variable (qw/
1679 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1681 $search_prefix = $configure_prefix =~ /perl/ ?
1682 $self->catdir($configure_prefix,"lib") :
1683 $self->catdir($configure_prefix,"lib","perl5");
1685 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1686 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1687 $self->catdir($self->{LIB},$Config{'archname'});
1689 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1690 $self->catdir(qq[\$\(PREFIX\)],"lib") :
1691 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
1692 for $install_variable (qw/
1698 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1701 $search_prefix = $configure_prefix =~ /perl/ ?
1702 $self->catdir($configure_prefix,"man") :
1703 $self->catdir($configure_prefix,"lib","perl5","man");
1704 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1705 $self->catdir(qq[\$\(PREFIX\)],"man") :
1706 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
1707 for $install_variable (qw/
1711 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1714 # Now we head at the manpages. Maybe they DO NOT want manpages
1716 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1717 unless defined $self->{INSTALLMAN1DIR};
1718 unless (defined $self->{INST_MAN1DIR}){
1719 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1720 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1722 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1725 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1727 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1728 unless defined $self->{INSTALLMAN3DIR};
1729 unless (defined $self->{INST_MAN3DIR}){
1730 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1731 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1733 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1736 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1739 # Get some stuff out of %Config if we haven't yet done so
1740 print STDOUT "CONFIG must be an array ref\n"
1741 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1742 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1743 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1744 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1746 foreach $m (@{$self->{CONFIG}}){
1747 next if $once_only{$m};
1748 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1749 unless exists $Config::Config{$m};
1750 $self->{uc $m} ||= $Config::Config{$m};
1754 # This is too dangerous:
1755 # if ($^O eq "next") {
1756 # $self->{AR} = "libtool";
1757 # $self->{AR_STATIC_ARGS} = "-o";
1759 # But I leave it as a placeholder
1761 $self->{AR_STATIC_ARGS} ||= "cr";
1763 # These should never be needed
1764 $self->{LD} ||= 'ld';
1765 $self->{OBJ_EXT} ||= '.o';
1766 $self->{LIB_EXT} ||= '.a';
1768 $self->{MAP_TARGET} ||= "perl";
1770 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1772 # make a simple check if we find Exporter
1773 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1774 (Exporter.pm not found)"
1775 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1776 $self->{NAME} eq "ExtUtils::MakeMaker";
1778 # Determine VERSION and VERSION_FROM
1779 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1780 if ($self->{VERSION_FROM}){
1781 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1782 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1786 if ($self->{VERSION}) {
1787 $self->{VERSION} =~ s/^\s+//;
1788 $self->{VERSION} =~ s/\s+$//;
1791 $self->{VERSION} ||= "0.10";
1792 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1795 # Graham Barr and Paul Marquess had some ideas how to ensure
1796 # version compatibility between the *.pm file and the
1797 # corresponding *.xs file. The bottomline was, that we need an
1798 # XS_VERSION macro that defaults to VERSION:
1799 $self->{XS_VERSION} ||= $self->{VERSION};
1801 # --- Initialize Perl Binary Locations
1803 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
1804 # will be working versions of perl 5. miniperl has priority over perl
1805 # for PERL to ensure that $(PERL) is usable while building ./ext/*
1806 my ($component,@defpath);
1807 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
1808 push @defpath, $component if defined $component;
1811 $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
1812 \@defpath, $Verbose );
1813 # don't check if perl is executable, maybe they have decided to
1814 # supply switches with perl
1816 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
1817 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
1818 unless ($self->{FULLPERL});
1823 Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
1824 OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
1825 MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1829 sub init_others { # --- Initialize Other Attributes
1832 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
1833 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
1834 # undefined. In any case we turn it into an anon array:
1836 # May check $Config{libs} too, thus not empty.
1837 $self->{LIBS}=[''] unless $self->{LIBS};
1839 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
1840 $self->{LD_RUN_PATH} = "";
1842 foreach $libs ( @{$self->{LIBS}} ){
1843 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
1844 my(@libs) = $self->extliblist($libs);
1845 if ($libs[0] or $libs[1] or $libs[2]){
1846 # LD_RUN_PATH now computed by ExtUtils::Liblist
1847 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
1852 if ( $self->{OBJECT} ) {
1853 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
1855 # init_dirscan should have found out, if we have C files
1856 $self->{OBJECT} = "";
1857 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1859 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
1860 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
1861 $self->{PERLMAINCC} ||= '$(CC)';
1862 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1864 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
1865 # the 'dynamic' section of MM. We don't have this problem with
1866 # 'static', since we either must use it (%Config says we can't
1867 # use dynamic loading) or the caller asked for it explicitly.
1868 if (!$self->{LINKTYPE}) {
1869 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
1871 : ($Config::Config{usedl} ? 'dynamic' : 'static');
1874 # These get overridden for VMS and maybe some other systems
1875 $self->{NOOP} ||= '$(SHELL) -c true';
1876 $self->{FIRST_MAKEFILE} ||= "Makefile";
1877 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
1878 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
1879 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
1880 $self->{RM_F} ||= "rm -f";
1881 $self->{RM_RF} ||= "rm -rf";
1882 $self->{TOUCH} ||= "touch";
1883 $self->{TEST_F} ||= "test -f";
1884 $self->{CP} ||= "cp";
1885 $self->{MV} ||= "mv";
1886 $self->{CHMOD} ||= "chmod";
1887 $self->{UMASK_NULL} ||= "umask 0";
1888 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1893 Defines the install target.
1898 my($self, %attribs) = @_;
1902 install :: all pure_install doc_install
1904 install_perl :: all pure_perl_install doc_perl_install
1906 install_site :: all pure_site_install doc_site_install
1908 install_ :: install_site
1909 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1911 pure_install :: pure_$(INSTALLDIRS)_install
1913 doc_install :: doc_$(INSTALLDIRS)_install
1914 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1916 pure__install : pure_site_install
1917 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1919 doc__install : doc_site_install
1920 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1922 pure_perl_install ::
1923 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1924 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1925 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1926 $(INST_LIB) $(INSTALLPRIVLIB) \
1927 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
1928 $(INST_BIN) $(INSTALLBIN) \
1929 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1930 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1931 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1932 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1933 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1936 pure_site_install ::
1937 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1938 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
1939 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
1940 $(INST_LIB) $(INSTALLSITELIB) \
1941 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
1942 $(INST_BIN) $(INSTALLBIN) \
1943 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1944 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1945 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1946 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1947 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1950 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
1951 "Module" "$(NAME)" \
1952 "installed into" "$(INSTALLPRIVLIB)" \
1953 LINKTYPE "$(LINKTYPE)" \
1954 VERSION "$(VERSION)" \
1955 EXE_FILES "$(EXE_FILES)" \
1956 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1959 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
1960 "Module" "$(NAME)" \
1961 "installed into" "$(INSTALLSITELIB)" \
1962 LINKTYPE "$(LINKTYPE)" \
1963 VERSION "$(VERSION)" \
1964 EXE_FILES "$(EXE_FILES)" \
1965 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1970 uninstall :: uninstall_from_$(INSTALLDIRS)dirs
1972 uninstall_from_perldirs ::
1974 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1976 uninstall_from_sitedirs ::
1978 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
1984 =item installbin (o)
1986 Defines targets to install EXE_FILES.
1992 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1993 return "" unless @{$self->{EXE_FILES}};
1994 my(@m, $from, $to, %fromto, @to);
1995 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
1996 for $from (@{$self->{EXE_FILES}}) {
1997 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
1998 local($_) = $path; # for backwards compatibility
1999 $to = $self->libscan($path);
2000 print "libscan($from) => '$to'\n" if ($Verbose >=2);
2003 @to = values %fromto;
2005 EXE_FILES = @{$self->{EXE_FILES}}
2008 ? q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2009 -e "system qq[pl2bat.bat ].shift"
2010 } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \
2011 -e "MY->fixin(shift)"
2014 $self->{NOECHO}\$(NOOP)
2020 while (($from,$to) = each %fromto) {
2021 last unless defined $from;
2022 my $todir = dirname($to);
2024 $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . "
2025 $self->{NOECHO}$self->{RM_F} $to
2026 $self->{CP} $from $to
2035 Takes a path to a file that is found by init_dirscan and returns false
2036 if we don't want to include this file in the library. Mainly used to
2037 exclude RCS, CVS, and SCCS directories from installation.
2044 my($self,$path) = @_;
2045 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
2051 Defines the linkext target which in turn defines the LINKTYPE.
2056 my($self, %attribs) = @_;
2057 # LINKTYPE => static or dynamic or ''
2058 my($linktype) = defined $attribs{LINKTYPE} ?
2059 $attribs{LINKTYPE} : '$(LINKTYPE)';
2061 linkext :: $linktype
2062 $self->{NOECHO}\$(NOOP)
2068 Takes as arguments a directory name and a regular expression. Returns
2069 all entries in the directory that match the regular expression.
2075 my($dir, $regex) = @_;
2077 my $dh = new DirHandle;
2078 $dh->open($dir || ".") or return ();
2081 @ls = grep(/$regex/, @ls) if $regex;
2087 Simple subroutine to insert the macros defined by the macro attribute
2093 my($self,%attribs) = @_;
2095 while (($key,$val) = each %attribs){
2096 last unless defined $key;
2097 push @m, "$key = $val\n";
2104 Called by staticmake. Defines how to write the Makefile to produce a
2107 By default the Makefile produced includes all the static extensions in
2108 the perl library. (Purified versions of library files, e.g.,
2109 DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
2114 my($self, %attribs) = @_;
2115 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2116 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
2119 # --- MakeMaker makeaperl section ---
2120 MAP_TARGET = $target
2121 FULLPERL = $self->{FULLPERL}
2123 return join '', @m if $self->{PARENT};
2125 my($dir) = join ":", @{$self->{DIR}};
2127 unless ($self->{MAKEAPERL}) {
2129 $(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2130 $(MAKE) -f $(MAKE_APERL_FILE) $@
2132 $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2133 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2134 }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2135 Makefile.PL DIR=}, $dir, q{ \
2136 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2137 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
2143 push @m, " \\\n\t\t$_";
2145 # push @m, map( " \\\n\t\t$_", @ARGV );
2153 my($cccmd, $linkcmd, $lperl);
2156 $cccmd = $self->const_cccmd($libperl);
2157 $cccmd =~ s/^CCCMD\s*=\s*//;
2158 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
2159 $cccmd .= " $Config::Config{cccdlflags}"
2160 if ($Config::Config{useshrplib} eq 'true');
2161 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
2163 # The front matter of the linkcommand...
2164 $linkcmd = join ' ', "\$(CC)",
2165 grep($_, @Config{qw(large split ldflags ccdlflags)});
2166 $linkcmd =~ s/\s+/ /g;
2167 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
2169 # Which *.a files could we make use of...
2172 File::Find::find(sub {
2173 return unless m/\Q$self->{LIB_EXT}\E$/;
2174 return if m/^libperl/;
2175 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2176 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
2178 if( exists $self->{INCLUDE_EXT} ){
2183 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2187 # Throw away anything not explicitly marked for inclusion.
2188 # DynaLoader is implied.
2189 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2195 return unless $found;
2197 elsif( exists $self->{EXCLUDE_EXT} ){
2201 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2205 # Throw away anything explicitly marked for exclusion
2206 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2207 return if( $xx eq $excl );
2211 # don't include the installed version of this extension. I
2212 # leave this line here, although it is not necessary anymore:
2213 # I patched minimod.PL instead, so that Miniperl.pm won't
2214 # enclude duplicates
2216 # Once the patch to minimod.PL is in the distribution, I can
2218 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
2220 $static{cwd() . "/" . $_}++;
2221 }, grep( -d $_, @{$searchdirs || []}) );
2223 # We trust that what has been handed in as argument, will be buildable
2224 $static = [] unless $static;
2225 @static{@{$static}} = (1) x @{$static};
2227 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2228 for (sort keys %static) {
2229 next unless /\Q$self->{LIB_EXT}\E$/;
2230 $_ = dirname($_) . "/extralibs.ld";
2234 grep(s/^/-I/, @{$perlinc || []});
2236 $target = "perl" unless $target;
2237 $tmp = "." unless $tmp;
2239 # MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2240 # regenerate the Makefiles, MAP_STATIC and the dependencies for
2241 # extralibs.all are computed correctly
2243 MAP_LINKCMD = $linkcmd
2244 MAP_PERLINC = @{$perlinc || []}
2246 join(" \\\n\t", reverse sort keys %static), "
2248 MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib}
2251 if (defined $libperl) {
2252 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2254 unless ($libperl && -f $lperl) { # Ilya's code...
2255 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2256 $libperl ||= "libperl$self->{LIB_EXT}";
2257 $libperl = "$dir/$libperl";
2258 $lperl ||= "libperl$self->{LIB_EXT}";
2259 $lperl = "$dir/$lperl";
2261 if (! -f $libperl and ! -f $lperl) {
2262 # We did not find a static libperl. Maybe there is a shared one?
2263 if ($^O eq 'solaris' or $^O eq 'sunos') {
2264 $lperl = $libperl = "$dir/$Config::Config{libperl}";
2265 # SUNOS ld does not take the full path to a shared library
2266 $libperl = '' if $^O eq 'sunos';
2270 print STDOUT "Warning: $libperl not found
2271 If you're going to build a static perl binary, make sure perl is installed
2272 otherwise ignore this warning\n"
2273 unless (-f $lperl || defined($self->{PERL_SRC}));
2277 MAP_LIBPERL = $libperl
2281 \$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2282 $self->{NOECHO}$self->{RM_F} \$\@
2283 $self->{NOECHO}\$(TOUCH) \$\@
2287 foreach $catfile (@$extra){
2288 push @m, "\tcat $catfile >> \$\@\n";
2290 # SUNOS ld does not take the full path to a shared library
2291 my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
2293 # Brain dead solaris linker does not use LD_RUN_PATH?
2294 # This fixes dynamic extensions which need shared libs
2295 my $ldfrom = ($^O eq 'solaris')?
2296 join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
2299 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
2300 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom $llibperl \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
2301 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2302 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2303 $self->{NOECHO}echo 'To remove the intermediate files say'
2304 $self->{NOECHO}echo ' make -f $makefilename map_clean'
2306 $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2308 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
2311 $tmp/perlmain.c: $makefilename}, q{
2312 }.$self->{NOECHO}.q{echo Writing $@
2313 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
2314 -e "writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)" > $@t && $(MV) $@t $@
2317 push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain
2318 } if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
2323 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2324 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
2325 "Perl binary" "$(MAP_TARGET)" \
2326 MAP_STATIC "$(MAP_STATIC)" \
2327 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2328 MAP_LIBPERL "$(MAP_LIBPERL)" \
2329 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
2334 inst_perl: pure_inst_perl doc_inst_perl
2336 pure_inst_perl: $(MAP_TARGET)
2337 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
2342 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2350 Defines how to rewrite the Makefile.
2357 # We do not know what target was originally specified so we
2358 # must force a manual rerun to be sure. But as it should only
2359 # happen very rarely it is not a significant problem.
2361 $(OBJECT) : $(FIRST_MAKEFILE)
2362 ' if $self->{OBJECT};
2365 # We take a very conservative approach here, but it\'s worth it.
2366 # We move Makefile to Makefile.old here to avoid gnu make looping.
2367 }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2368 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2369 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
2370 -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2371 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
2372 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
2373 }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2374 }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <=="
2377 # To change behavior to :: would be nice, but would break Tk b9.02
2378 # so you find such a warning below the dist target.
2379 #}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2380 # }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
2386 =item manifypods (o)
2388 Defines targets and routines to translate the pods into manpages and
2389 put them into the INST_* directories.
2394 my($self, %attribs) = @_;
2395 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
2398 if (defined $self->{PERL_SRC}) {
2399 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2401 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
2403 unless ($self->perl_script($pod2man_exe)) {
2404 # No pod2man but some MAN3PODS to be installed
2407 Warning: I could not locate your pod2man program. Please make sure,
2408 your pod2man program is in your PATH before you execute 'make'
2411 $pod2man_exe = "-S pod2man";
2415 qq[POD2MAN_EXE = $pod2man_exe\n],
2416 q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
2417 -e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
2418 -e 'print "Manifying $$m{$$_}\n";' \\
2419 -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
2420 -e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
2422 push @m, "\nmanifypods : ";
2423 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
2426 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2427 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2428 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
2435 Returns true, if the argument is likely to be a command.
2440 my($self,$file) = @_;
2441 return $file if -x $file && ! -d $file;
2445 =item maybe_command_in_dirs
2447 method under development. Not yet used. Ask Ilya :-)
2451 sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2452 # Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2453 my($self, $names, $dirs, $trace, $ver) = @_;
2455 foreach $dir (@$dirs){
2456 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2457 foreach $name (@$names){
2459 if ($self->file_name_is_absolute($name)) { # /foo/bar
2461 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2462 $abs = $self->catfile($dir, $name);
2464 $abs = $self->catfile($self->curdir, $name);
2466 print "Checking $abs for $name\n" if ($trace >= 2);
2467 next unless $tryabs = $self->maybe_command($abs);
2468 print "Substituting $tryabs instead of $abs\n"
2469 if ($trace >= 2 and $tryabs ne $abs);
2472 print "Executing $abs\n" if ($trace >= 2);
2473 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2474 print "Using PERL=$abs\n" if $trace;
2477 } else { # Do not look for perl
2484 =item needs_linking (o)
2486 Does this module need linking? Looks into subdirectory objects (see
2487 also has_link_code())
2494 $caller = (caller(0))[3];
2495 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2496 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2497 if ($self->has_link_code or $self->{MAKEAPERL}){
2498 $self->{NEEDS_LINKING} = 1;
2501 foreach $child (keys %{$self->{CHILDREN}}) {
2502 if ($self->{CHILDREN}->{$child}->needs_linking) {
2503 $self->{NEEDS_LINKING} = 1;
2507 return $self->{NEEDS_LINKING} = 0;
2512 misnamed method (will have to be changed). The MM_Unix method just
2513 returns the argument without further processing.
2515 On VMS used to insure that colons marking targets are preceded by
2516 space - most Unix Makes don't need this, but it's necessary under VMS
2517 to distinguish the target delimiter from a colon appearing as part of
2523 my($self,$text) = @_;
2529 parse a file and return what you think is $VERSION in this file set to
2534 my($self,$parsefile) = @_;
2538 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2541 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2544 # next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
2545 next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
2547 package ExtUtils::MakeMaker::_version;
2556 $result = eval($eval);
2557 die "Could not eval '$eval' in $parsefile: $@" if $@;
2558 $result = "undef" unless defined $result;
2565 =item parse_abstract
2567 parse a file and return what you think is the ABSTRACT
2571 sub parse_abstract {
2572 my($self,$parsefile) = @_;
2576 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2578 my $package = $self->{DISTNAME};
2579 $package =~ s/-/::/;
2581 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2584 next unless /^($package\s-\s)(.*)/;
2587 # package ExtUtils::MakeMaker::_version;
2596 # $result = eval($eval);
2597 # die "Could not eval '$eval' in $parsefile: $@" if $@;
2598 # $result = "undef" unless defined $result;
2607 Defines the string that is passed to recursive make calls in
2617 my($sep) = $Is_VMS ? ',' : '';
2620 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
2621 push @pasthru, "$key=\"\$($key)\"";
2624 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
2630 Takes no argument, returns the environment variable PATH as an array.
2636 my $path_sep = ($Is_OS2 || $Is_Dos) ? ";" : ":";
2637 my $path = $ENV{PATH};
2638 $path =~ s:\\:/:g if $Is_OS2;
2639 my @path = split $path_sep, $path;
2640 foreach(@path) { $_ = '.' if $_ eq '' }
2646 Takes one argument, a file name, and returns the file name, if the
2647 argument is likely to be a perl script. On MM_Unix this is true for
2648 any ordinary, readable file.
2653 my($self,$file) = @_;
2654 return $file if -r $file && -f _;
2658 =item perldepend (o)
2660 Defines the dependency from all *.h files that come with the perl
2669 # Check for unpropogated config.sh changes. Should never happen.
2670 # We do NOT just update config.h because that is not sufficient.
2671 # An out of date config.h is not fatal but complains loudly!
2672 $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2673 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2675 $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2676 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2677 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2678 } if $self->{PERL_SRC};
2680 return join "", @m unless $self->needs_linking;
2684 $(PERL_INC)/EXTERN.h $(PERL_INC)/gv.h $(PERL_INC)/pp.h \
2685 $(PERL_INC)/INTERN.h $(PERL_INC)/handy.h $(PERL_INC)/proto.h \
2686 $(PERL_INC)/XSUB.h $(PERL_INC)/hv.h $(PERL_INC)/regcomp.h \
2687 $(PERL_INC)/av.h $(PERL_INC)/keywords.h $(PERL_INC)/regexp.h \
2688 $(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \
2689 $(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \
2690 $(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \
2691 $(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \
2692 $(PERL_INC)/embed.h $(PERL_INC)/perl.h \
2693 $(PERL_INC)/form.h $(PERL_INC)/perly.h
2695 $(OBJECT) : $(PERL_HDRS)
2696 } if $self->{OBJECT};
2698 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
2705 Defines target that creates a PPD (Perl Package Description) file
2706 for a binary distribution.
2713 if ($self->{ABSTRACT_FROM}){
2714 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
2715 Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n"
2717 my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3];
2718 push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n");
2720 push(@m, "\t\@\$(PERL) -e \"print qq{<SOFTPKG NAME=\\\"$self->{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}");
2721 push(@m, ". qq{\\t<TITLE>$self->{DISTNAME}</TITLE>\\n}");
2722 my $abstract = $self->{ABSTRACT};
2723 $abstract =~ s/</</g;
2724 $abstract =~ s/>/>/g;
2725 push(@m, ". qq{\\t<ABSTRACT>$abstract</ABSTRACT>\\n}");
2726 my ($author) = $self->{AUTHOR};
2727 $author =~ s/@/\\@/g;
2728 push(@m, ". qq{\\t<AUTHOR>$author</AUTHOR>\\n}");
2729 push(@m, ". qq{\\t<IMPLEMENTATION>\\n}");
2731 foreach $prereq (sort keys %{$self->{PREREQ_PM}}) {
2732 my $pre_req = $prereq;
2733 $pre_req =~ s/::/-/g;
2734 push(@m, ". qq{\\t\\t<DEPENDENCY NAME=\\\"$pre_req\\\" />\\n}");
2736 push(@m, ". qq{\\t\\t<OS NAME=\\\"\$(OSNAME)\\\" />\\n}");
2737 my ($bin_location) = $self->{BINARY_LOCATION};
2738 $bin_location =~ s/\\/\\\\/g;
2739 push(@m, ". qq{\\t\\t<CODEBASE HREF=\\\"$bin_location\\\" />\\n}");
2740 push(@m, ". qq{\\t</IMPLEMENTATION>\\n}");
2741 push(@m, ". qq{</SOFTPKG>\\n}\" > $self->{DISTNAME}.ppd");
2748 Defines target that copies all files in the hash PM to their
2749 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
2755 my($autodir) = $self->catdir('$(INST_LIB)','auto');
2757 pm_to_blib: $(TO_INST_PM)
2758 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
2759 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
2760 -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
2761 }.$self->{NOECHO}.q{$(TOUCH) $@
2765 =item post_constants (o)
2767 Returns an empty string per default. Dedicated to overrides from
2768 within Makefile.PL after all constants have been defined.
2777 =item post_initialize (o)
2779 Returns an empty string per default. Used in Makefile.PLs to add some
2780 chunk of text to the Makefile after the object is initialized.
2784 sub post_initialize {
2791 Returns an empty string. Can be used in Makefile.PLs to write some
2792 text to the Makefile at the end.
2803 Check a path variable in $self from %Config, if it contains a prefix,
2804 and replace it with another one.
2806 Takes as arguments an attribute name, a search prefix and a
2807 replacement prefix. Changes the attribute in the object.
2812 my($self,$var,$sprefix,$rprefix) = @_;
2813 $self->{uc $var} ||= $Config{lc $var};
2814 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
2815 $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
2820 Defines targets to run *.PL files.
2826 return "" unless $self->{PL_FILES};
2828 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
2830 all :: $self->{PL_FILES}->{$plfile}
2831 $self->{NOECHO}\$(NOOP)
2833 $self->{PL_FILES}->{$plfile} :: $plfile
2834 \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
2842 Defines the realclean target.
2847 my($self, %attribs) = @_;
2850 # Delete temporary files (via clean) and also delete installed files
2851 realclean purge :: clean
2853 # realclean subdirectories first (already cleaned)
2854 my $sub = "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
2855 foreach(@{$self->{DIR}}){
2856 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
2857 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
2859 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
2860 if( $self->has_link_code ){
2861 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
2862 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
2864 push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n");
2865 my(@otherfiles) = ($self->{MAKEFILE},
2866 "$self->{MAKEFILE}.old"); # Makefiles last
2867 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
2868 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
2869 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
2873 =item replace_manpage_separator
2875 Takes the name of a package, which may be a nested package, in the
2876 form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
2880 sub replace_manpage_separator {
2881 my($self,$man) = @_;
2888 Defines the static target.
2893 # --- Static Loading Sections ---
2897 ## $(INST_PM) has been moved to the all: target.
2898 ## It remains here for awhile to allow for old usage: "make static"
2899 #static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
2900 static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
2901 '.$self->{NOECHO}.'$(NOOP)
2905 =item static_lib (o)
2907 Defines how to produce the *.a (or equivalent) files.
2913 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
2914 # return '' unless $self->needs_linking(); #might be because of a subdir
2916 return '' unless $self->has_link_code;
2920 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
2923 # If this extension has it's own library (eg SDBM_File)
2924 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
2925 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
2928 q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
2930 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
2932 # Old mechanism - still available:
2934 "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
2935 } if $self->{PERL_SRC} && $self->{EXTRALIBS};
2938 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
2942 =item staticmake (o)
2949 my($self, %attribs) = @_;
2952 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
2954 # And as it's not yet built, we add the current extension
2955 # but only if it has some C code (or XS code, which implies C code)
2956 if (@{$self->{C}}) {
2957 @static = $self->catfile($self->{INST_ARCHLIB},
2960 "$self->{BASEEXT}$self->{LIB_EXT}"
2964 # Either we determine now, which libraries we will produce in the
2965 # subdirectories or we do it at runtime of the make.
2967 # We could ask all subdir objects, but I cannot imagine, why it
2968 # would be necessary.
2970 # Instead we determine all libraries for the new perl at
2972 my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
2974 $self->makeaperl(MAKE => $self->{MAKEFILE},
2975 DIRS => \@searchdirs,
2978 TARGET => $self->{MAP_TARGET},
2980 LIBPERL => $self->{LIBPERL_A}
2986 Helper subroutine for subdirs
2991 my($self, $subdir) = @_;
2996 $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
3003 Defines targets to process subdirectories.
3008 # --- Sub-directory Sections ---
3011 # This method provides a mechanism to automatically deal with
3012 # subdirectories containing further Makefile.PL scripts.
3013 # It calls the subdir_x() method for each subdirectory.
3014 foreach $dir (@{$self->{DIR}}){
3015 push(@m, $self->subdir_x($dir));
3016 #### print "Including $dir subdirectory\n";
3020 # The default clean, realclean and test targets in this Makefile
3021 # have automatically been given entries for each subdir.
3025 push(@m, "\n# none")
3032 Defines the test targets.
3037 # --- Test and Installation Sections ---
3039 my($self, %attribs) = @_;
3040 my $tests = $attribs{TESTS};
3041 if (!$tests && -d 't') {
3042 $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t';
3044 # note: 'test.pl' name is also hardcoded in init_dirscan()
3048 TEST_TYPE=test_\$(LINKTYPE)
3053 testdb :: testdb_\$(LINKTYPE)
3055 test :: \$(TEST_TYPE)
3057 push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
3059 push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
3060 unless $tests or -f "test.pl" or @{$self->{DIR}};
3063 push(@m, "test_dynamic :: pure_all\n");
3064 push(@m, $self->test_via_harness('$(FULLPERL)', '$(TEST_FILES)')) if $tests;
3065 push(@m, $self->test_via_script('$(FULLPERL)', '$(TEST_FILE)')) if -f "test.pl";
3068 push(@m, "testdb_dynamic :: pure_all\n");
3069 push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
3072 # Occasionally we may face this degenerate target:
3073 push @m, "test_ : test_dynamic\n\n";
3075 if ($self->needs_linking()) {
3076 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
3077 push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
3078 push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
3080 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
3081 push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
3084 push @m, "test_static :: test_dynamic\n";
3085 push @m, "testdb_static :: testdb_dynamic\n";
3090 =item test_via_harness (o)
3092 Helper method to write the test targets
3096 sub test_via_harness {
3097 my($self, $perl, $tests) = @_;
3098 $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3099 "\t$perl".q! -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
3102 =item test_via_script (o)
3104 Other helper method for test.
3108 sub test_via_script {
3109 my($self, $perl, $script) = @_;
3110 $perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
3111 qq{\t$perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
3115 =item tool_autosplit (o)
3117 Defines a simple perl call that runs autosplit. May be deprecated by
3122 sub tool_autosplit {
3123 # --- Tool Sections ---
3125 my($self, %attribs) = @_;
3127 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
3129 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
3130 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
3134 =item tools_other (o)
3136 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
3137 the Makefile. Also defines the perl programs MKPATH,
3138 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
3145 my $bin_sh = $Config{sh} || '/bin/sh';
3150 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
3151 push @m, "$_ = $self->{$_}\n";
3155 # The following is a portable way to say mkdir -p
3156 # To see which directories are created, change the if 0 to if 1
3157 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
3159 # This helps us to minimize the effect of the .exists files A yet
3160 # better solution would be to have a stable file in the perl
3161 # distribution with a timestamp of zero. But this solution doesn't
3162 # need any changes to the core distribution and works with older perls
3163 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
3167 return join "", @m if $self->{PARENT};
3170 # Here we warn users that an old packlist file was found somewhere,
3171 # and that they should call some uninstall routine
3172 WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
3173 -e 'print "WARNING: I have found an old package in\n";' \\
3174 -e 'print "\t$$ARGV[0].\n";' \\
3175 -e 'print "Please make sure the two installations are not conflicting\n";'
3180 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
3181 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
3183 DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
3184 -e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", shift, ">";' \
3185 -e 'print "=over 4";' \
3186 -e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
3189 UNINSTALL = $(PERL) -MExtUtils::Install \
3190 -e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
3191 -e 'print " packlist above carefully.\n There may be errors. Remove the";' \
3192 -e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"'
3198 =item tool_xsubpp (o)
3200 Determines typemaps, xsubpp version, prototype behaviour.
3206 return "" unless $self->needs_linking;
3207 my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
3208 my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3209 if( $self->{TYPEMAPS} ){
3211 foreach $typemap (@{$self->{TYPEMAPS}}){
3212 if( ! -f $typemap ){
3213 warn "Typemap $typemap not found.\n";
3216 push(@tmdeps, $typemap);
3220 push(@tmdeps, "typemap") if -f "typemap";
3221 my(@tmargs) = map("-typemap $_", @tmdeps);
3222 if( exists $self->{XSOPT} ){
3223 unshift( @tmargs, $self->{XSOPT} );
3227 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
3229 # What are the correct thresholds for version 1 && 2 Paul?
3230 if ( $xsubpp_version > 1.923 ){
3231 $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3233 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3234 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3235 Your version of xsubpp is $xsubpp_version and cannot handle this.
3236 Please upgrade to a more recent version of xsubpp.
3239 $self->{XSPROTOARG} = "";
3245 XSUBPP = \$(XSUBPPDIR)/xsubpp
3246 XSPROTOARG = $self->{XSPROTOARG}
3247 XSUBPPDEPS = @tmdeps
3248 XSUBPPARGS = @tmargs
3254 my($self,$xsubpp) = @_;
3255 return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
3259 # try to figure out the version number of the xsubpp on the system
3261 # first try the -v flag, introduced in 1.921 & 2.000a2
3263 return "" unless $self->needs_linking;
3265 my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3266 print "Running $command\n" if $Verbose >= 2;
3267 $version = `$command` ;
3268 warn "Running '$command' exits with status " . ($?>>8) if $?;
3271 return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
3273 # nope, then try something else
3275 my $counter = '000';
3276 my ($file) = 'temp' ;
3277 $counter++ while -e "$file$counter"; # don't overwrite anything
3280 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3282 MODULE = fred PACKAGE = fred
3291 $command = "$self->{PERL} $xsubpp $file 2>&1";
3292 print "Running $command\n" if $Verbose >= 2;
3293 my $text = `$command` ;
3294 warn "Running '$command' exits with status " . ($?>>8) if $?;
3297 # gets 1.2 -> 1.92 and 2.000a1
3298 return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
3300 # it is either 1.0 or 1.1
3301 return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3303 # none of the above, so 1.0
3304 return $Xsubpp_Version = "1.0" ;
3307 =item top_targets (o)
3309 Defines the targets all, subdirs, config, and O_FILES
3314 # --- Target Sections ---
3319 #all :: config $(INST_PM) subdirs linkext manifypods
3323 all :: pure_all manifypods
3324 '.$self->{NOECHO}.'$(NOOP)
3326 unless $self->{SKIPHASH}{'all'};
3329 pure_all :: config pm_to_blib subdirs linkext
3330 '.$self->{NOECHO}.'$(NOOP)
3332 subdirs :: $(MYEXTLIB)
3333 '.$self->{NOECHO}.'$(NOOP)
3335 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3336 '.$self->{NOECHO}.'$(NOOP)
3338 config :: $(INST_ARCHAUTODIR)/.exists
3339 '.$self->{NOECHO}.'$(NOOP)
3341 config :: $(INST_AUTODIR)/.exists
3342 '.$self->{NOECHO}.'$(NOOP)
3346 config :: Version_check
3347 $self->{NOECHO}\$(NOOP)
3349 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
3351 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3353 if (%{$self->{MAN1PODS}}) {
3355 config :: \$(INST_MAN1DIR)/.exists
3356 $self->{NOECHO}\$(NOOP)
3359 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
3361 if (%{$self->{MAN3PODS}}) {
3363 config :: \$(INST_MAN3DIR)/.exists
3364 $self->{NOECHO}\$(NOOP)
3367 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
3371 $(O_FILES): $(H_FILES)
3372 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
3376 perldoc ExtUtils::MakeMaker
3381 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3382 -MExtUtils::MakeMaker=Version_check \
3383 -e "Version_check('$(MM_VERSION)')"
3391 Obsolete, depecated method. Not used since Version 5.21.
3396 # --- perllocal.pod section ---
3397 my($self,$what,$name,@attribs)=@_;
3398 my $time = localtime;
3399 print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3400 print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3401 print "\n\n=back\n\n";
3406 Defines the suffix rules to compile XS files to C.
3412 return '' unless $self->needs_linking();
3415 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && $(MV) $*.tc $@
3421 Defines suffix rules to go from XS to object files directly. This is
3422 only intended for broken make implementations.
3426 sub xs_o { # many makes are too dumb to use xs_c then c_o
3428 return '' unless $self->needs_linking();
3431 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
3432 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
3438 This is internal method that returns path to libperl.a equivalent
3439 to be linked to dynamic extensions. UNIX does not have one but OS2
3451 This is internal method that returns name of a file that is
3452 passed to linker to define symbols to be exported.
3453 UNIX does not have one but OS2 and Win32 do.
3469 L<ExtUtils::MakeMaker>