1 package ExtUtils::MakeMaker;
3 $Version = 4.086; # Last edited 9 Mar 1995 by Andy Dougherty
12 @EXPORT = qw(&WriteMakefile &mkbootstrap &mksymlists $Verbose);
13 @EXPORT_OK = qw($Version %att %skip %Recognized_Att_Keys
14 @MM_Sections %MM_Sections
15 &help &lsdir &neatvalue);
17 $Is_VMS = $Config{'osname'} eq 'VMS';
18 require ExtUtils::MM_VMS if $Is_VMS;
22 $Version = $Version;# avoid typo warning
29 ExtUtils::MakeMaker - create an extension Makefile
33 C<use ExtUtils::MakeMaker;>
35 C<WriteMakefile( ATTRIBUTE =E<gt> VALUE [, ...] );>
39 This utility is designed to write a Makefile for an extension module
40 from a Makefile.PL. It is based on the Makefile.SH model provided by
41 Andy Dougherty and the perl5-porters.
43 It splits the task of generating the Makefile into several subroutines
44 that can be individually overridden. Each subroutine returns the text
45 it wishes to have written to the Makefile.
47 MakeMaker.pm uses the architecture specific information from
48 Config.pm. In addition the extension may contribute to the C<%Config>
49 hash table of Config.pm by supplying hints files in a C<hints/>
50 directory. The hints files are expected to be named like their
51 counterparts in C<PERL_SRC/hints>, but with an C<.pl> file name
52 extension (eg. C<next_3_2.sh>). They are simply C<eval>ed by MakeMaker
53 and can be used to execute commands as well as to include special
54 variables. If there is no hintsfile for the actual system, but for
55 some previous releases of the same operating system, the latest one of
58 =head2 Default Makefile Behaviour
60 The automatically generated Makefile enables the user of the extension
65 make test # optionally set TEST_VERBOSE=1
66 make install # See below
68 The Makefile to be produced may be altered by adding arguments of the
69 form C<KEY=VALUE>. If the user wants to have the extension installed
70 into a directory different from C<$Config{"installprivlib"}> it can be
73 perl Makefile.PL INST_LIB=~/myperllib INST_EXE=~/bin
75 Note, that in this example MakeMaker does the tilde expansion for you
76 and INST_ARCHLIB is set to either C<INST_LIB/$Config{"osname"}> if
77 that directory exists and otherwise to INST_LIB.
79 Other interesting targets in the generated Makefile are
81 make config # to check if the Makefile is up-to-date
82 make clean # delete local temporary files (Makefile gets renamed)
83 make realclean # delete all derived files (including installed files)
84 make distclean # produce a gzipped file ready for shipping
86 The macros in the produced Makefile may be overridden on the command
87 line to the make call as in the following example:
89 make INST_LIB=/some/where INST_ARCHLIB=/some/where INST_EXE=/u/k/bin
91 Note, that this is a solution provided by C<make> in general, so tilde
92 expansion will probably not be available and INST_ARCHLIB will not be
93 set automatically when INST_LIB is given as argument.
95 The generated Makefile does not set any permissions. The installer has
96 to decide, which umask should be in effect.
98 =head2 Special case C<make install>
100 The I<install> target of the generated Makefile is for system
101 administrators only that have writing permissions on the
102 system-specific directories $Config{installprivlib},
103 $Config{installarchlib}, and $Config{installbin}. This works, because
104 C<make> alone in fact puts all relevant files into directories that
105 are named by the macros INST_LIB, INST_ARCHLIB, and INST_EXE. All
106 three default to ./blib if you are not building below the perl source
107 directory. C<make install> is just a recursive call to C<make> with
108 the three relevant parameters set accordingly to the system-wide
111 C<make install> per default writes some documentation of what has been
112 done into the file C<$Config{'installarchlib'}/perllocal.pod>. This is
113 an experimental feature. It can be bypassed by calling C<make
116 Users that do not have privileges on the system but want to install
117 the relevant files of the module into their private library or binary
118 directories do not call C<make install>. In priciple they have the
121 # case: trust the module
122 perl Makefile.PL INST_LIB=~/perllib INST_EXE=~/bin
128 # case: want to run tests before installation
132 make INST_LIB=/some/where INST_ARCHLIB=/foo/bar INST_EXE=/somebin
134 (C<make test> is not necessarily supported for all modules.)
136 =head2 Support to Link a new Perl Binary
138 An extension that is built with the above steps is ready to use on
139 systems supporting dynamic loading. On systems that do not support
140 dynamic loading, any newly created extension has to be linked together
141 with the available ressources. MakeMaker supports the linking process
142 by creating appropriate targets in the Makefile whenever an extension
143 is built. You can invoke the corresponding section of the makefile with
147 That produces a new perl binary in the current directory with all
148 extensions linked in that can be found in INST_ARCHLIB and
151 The binary can be installed into the directory where perl normally
152 resides on your machine with
156 To produce a perl binary with a different name than C<perl>, either say
158 perl Makefile.PL MAP_TARGET=myperl
165 make myperl MAP_TARGET=myperl
166 make inst_perl MAP_TARGET=myperl
168 In any case you will be prompted with the correct invocation of the
169 C<inst_perl> target that installs the new binary into
170 $Config{'installbin'}.
172 Note, that there is a C<makeaperl> scipt in the perl distribution,
173 that supports the linking of a new perl binary in a similar fashion,
174 but with more options.
176 C<make inst_perl> per default writes some documentation of what has been
177 done into the file C<$Config{'installarchlib'}/perllocal.pod>. This
178 can be bypassed by calling C<make pure_inst_perl>.
180 Warning: the inst_perl: target is rather mighty and will probably
181 overwrite your existing perl binary. Use with care!
183 =head2 Determination of Perl Library and Installation Locations
185 MakeMaker needs to know, or to guess, where certain things are
186 located. Especially INST_LIB and INST_ARCHLIB (where to install files
187 into), PERL_LIB and PERL_ARCHLIB (where to read existing modules
188 from), and PERL_INC (header files and C<libperl*.*>).
190 Extensions may be built either using the contents of the perl source
191 directory tree or from an installed copy of the perl library.
193 If an extension is being built below the C<ext/> directory of the perl
194 source then MakeMaker will set PERL_SRC automatically (e.g., C<../..>).
195 If PERL_SRC is defined then other variables default to the following:
198 PERL_LIB = PERL_SRC/lib
199 PERL_ARCHLIB = PERL_SRC/lib
201 INST_ARCHLIB = PERL_ARCHLIB
203 If an extension is being built away from the perl source then MakeMaker
204 will leave PERL_SRC undefined and default to using the installed copy
205 of the perl library. The other variables default to the following:
207 PERL_INC = $archlib/CORE
209 PERL_ARCHLIB = $archlib
211 INST_ARCHLIB = ./blib
213 If perl has not yet been installed then PERL_SRC can be defined on the
214 command line as shown in the previous section.
216 =head2 Useful Default Makefile Macros
218 FULLEXT = Pathname for extension directory (eg DBD/Oracle).
220 BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
222 ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
224 PERL_LIB = Directory where we read the perl library files
226 PERL_ARCHLIB = Same as above for architecture dependent files
228 INST_LIB = Directory where we put library files of this extension
229 while building it. If we are building below PERL_SRC/ext
230 we default to PERL_SRC/lib, else we default to ./blib.
232 INST_ARCHLIB = Same as above for architecture dependent files
234 INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)>
236 INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)>
238 INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)>
240 =head2 Customizing The Generated Makefile
242 If the Makefile generated does not fit your purpose you can change it
243 using the mechanisms described below.
245 =head2 Using Attributes (and Parameters)
247 The following attributes can be specified as arguments to WriteMakefile()
248 or as NAME=VALUE pairs on the command line:
250 This description is not yet documented; you can get at the description
253 C<perl Makefile.PL help> (if you already have a basic Makefile.PL)
257 C<perl -e 'use ExtUtils::MakeMaker qw(&help); &help;'>
259 =head2 Overriding MakeMaker Methods
261 If you cannot achieve the desired Makefile behaviour by specifying
262 attributes you may define private subroutines in the Makefile.PL.
263 Each subroutines returns the text it wishes to have written to
264 the Makefile. To override a section of the Makefile you can
267 sub MY::c_o { "new literal text" }
269 or you can edit the default by saying something like:
271 sub MY::c_o { $_=MM->c_o; s/old text/new text/; $_ }
273 If you still need a different solution, try to develop another
274 subroutine, that fits your needs and submit the diffs to
275 F<perl5-porters@nicoh.com> or F<comp.lang.perl> as appropriate.
280 # We allow extension-specific hints files. If we find one we act as if Config.pm
281 # had read the contents
283 # First we look for the best hintsfile we have
285 my($hint)="$Config{'osname'}_$Config{'osvers'}";
288 opendir DIR, "hints";
289 while (defined ($_ = readdir DIR)) {
291 next unless s/\.pl$//;
292 next unless /^$Config{'osname'}/;
293 # Don't trust a hintfile for a later OS version:
302 return unless @goodhints; # There was no hintsfile
303 # the last one in lexical ordering is our choice:
304 $hint=(reverse sort @goodhints)[0];
306 # execute the hintsfile:
307 open HINTS, "hints/$hint.pl";
308 @goodhints = <HINTS>;
310 eval join('',@goodhints);
313 # Setup dummy package:
314 # MY exists for overriding methods to be defined within
315 unshift(@MY::ISA, qw(MM));
317 # Dummy package MM inherits actual methods from OS-specific
318 # default packages. We use this intermediate package so
319 # MY->func() can call MM->func() and get the proper
320 # default routine without having to know under what OS
322 unshift(@MM::ISA, $Is_VMS ? qw(ExtUtils::MM_VMS MM_Unix) : qw(MM_Unix));
324 $Attrib_Help = <<'END';
325 NAME: Perl module name for this extension (DBD::Oracle)
326 This will default to the directory name but should
327 be explicitly defined in the Makefile.PL.
329 DISTNAME: Your name for distributing the package (by tar file)
330 This defaults to NAME above.
332 VERSION: Your version number for distributing the package.
333 This defaults to 0.1.
335 INST_LIB: Perl library directory to install the module into.
336 INST_ARCHLIB: Perl architecture-dependent library to install into
337 (defaults to INST_LIB)
339 PERL_LIB: Directory containing the Perl library to use.
340 PERL_SRC: Directory containing the Perl source code
341 (use of this should be avoided, it may be undefined)
343 INC: Include file dirs eg: '-I/usr/5include -I/path/to/inc'
344 DEFINE: something like "-DHAVE_UNISTD_H"
345 OBJECT: List of object files, defaults to '$(BASEEXT).o',
346 but can be a long string containing all object files,
347 e.g. "tkpBind.o tkpButton.o tkpCanvas.o"
348 MYEXTLIB: If the extension links to a library that it builds
349 set this to the name of the library (see SDBM_File)
351 LIBS: An anonymous array of alternative library specifications
352 to be searched for (in order) until at least one library
354 'LIBS' => [ "-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs" ]
355 Mind, that any element of the array contains a complete
356 set of arguments for the ld command. So do not specify
357 'LIBS' => ["-ltcl", "-ltk", "-lX11" ], #wrong
358 See ODBM_File/Makefile.PL for an example, where an
359 array is needed. If you specify a scalar as in
360 'LIBS' => "-ltcl -ltk -lX11"
361 MakeMaker will turn it into an array with one element.
363 LDFROM: defaults to "$(OBJECT)" and is used in the ld command
364 to specify what files to link/load from
365 (also see dynamic_lib below for how to specify ld flags)
367 DIR: Ref to array of subdirectories containing Makefile.PLs
368 e.g. [ 'sdbm' ] in ext/SDBM_File
370 PMLIBDIRS: Ref to array of subdirectories containing library files.
371 Defaults to [ 'lib', $(BASEEXT) ]. The directories will
372 be scanned and any files they contain will
373 be installed in the corresponding location in the library.
374 A MY::libscan() function can be used to alter the behaviour.
375 Defining PM in the Makefile.PL will override PMLIBDIRS.
377 PM: Hashref of .pm files and *.pl files to be installed.
378 e.g. { 'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm' }
379 By default this will include *.pm and *.pl. If a lib directory
380 exists and is not listed in DIR (above) then any *.pm and
381 *.pl files it contains will also be included by default.
382 Defining PM in the Makefile.PL will override PMLIBDIRS.
384 XS: Hashref of .xs files. MakeMaker will default this.
385 e.g. { 'name_of_file.xs' => 'name_of_file.c' }
386 The .c files will automatically be included in the list
387 of files deleted by a make clean.
389 C: Ref to array of *.c file names. Initialised from a directory scan
390 and the values portion of the XS attribute hash. This is not
391 currently used by MakeMaker but may be handy in Makefile.PLs.
393 H: Ref to array of *.h file names. Similar to C: above.
395 EXE_FILES: Ref to array of executable files. The files will be copied to
396 the INST_EXE directory. The installed files will be deleted
399 INST_EXE: Directory, where executable scripts should be installed. Defaults
400 to "./blib", just to have a dummy location during testing.
401 C<make install> will set INST_EXE to $Config{'installbin'}.
403 LINKTYPE: =>'static' or 'dynamic' (default unless usedl=undef in config.sh)
404 Should only be used to force static linking (also see linkext below).
406 DL_FUNCS: Hashref of symbol names for routines to be made available as
407 universal symbols. Each key/value pair consists of the package
408 name and an array of routine names in that package. Used only
409 under AIX (export lists) and VMS (linker options) at present.
410 The routine names supplied will be expanded in the same way
411 as XSUB names are expanded by the XS() macro.
412 Defaults to { "$(NAME)" => [ "boot_$(NAME)" ] }.
413 (e.g. { "RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
414 "NetconfigPtr" => [ 'DESTROY'] } )
416 DL_VARS: Array of symbol names for variables to be made available as
417 universal symbols. Used only under AIX (export lists) and VMS
418 (linker options) at present. Defaults to [].
419 (e.g. [ qw( Foo_version Foo_numstreams Foo_tree ) ])
421 CONFIG: =>[qw(archname manext)] defines ARCHNAME & MANEXT from config.sh
422 SKIP: =>[qw(name1 name2)] skip (do not write) sections of the Makefile
424 MAP_TARGET: If it is intended, that a new perl binary be produced, this variable
425 may hold a name for that binary. Defaults to C<perl>
427 LIBPERL_A: The filename of the perllibrary that will be used together
428 with this extension. Defaults to C<libperl.a>.
433 Additional lowercase attributes can be used to pass parameters to the
434 methods which implement that part of the Makefile. These are not
437 installpm: {SPLITLIB => '$(INST_LIB)' (default) or '$(INST_ARCHLIB)'}
438 linkext: {LINKTYPE => 'static', 'dynamic' or ''}
439 dynamic_lib: {ARMAYBE => 'ar', OTHERLDFLAGS => '...'}
440 clean: {FILES => "*.xyz foo"}
441 realclean: {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
442 distclean: {TARNAME=>'MyTarFile', TARFLAGS=>'cvfF', COMPRESS=>'gzip'}
443 tool_autosplit: {MAXLEN => 8}
446 sub help {print $Attrib_Help;}
448 @MM_Sections_spec = (
449 'post_initialize' => {},
450 'const_config' => {},
452 'const_loadlibs' => {},
454 'tool_autosplit' => {},
457 'post_constants' => {},
483 %MM_Sections = @MM_Sections_spec; # looses section ordering
484 @MM_Sections = grep(!ref, @MM_Sections_spec); # keeps order
486 %Recognized_Att_Keys = %MM_Sections; # All sections are valid keys.
487 foreach(split(/\n/,$Attrib_Help)){
489 next unless m/^\s*(\w+):\s*(.*)/;
490 $Recognized_Att_Keys{$1} = $2;
491 print "Attribute '$1' => '$2'\n" if ($Verbose >= 2);
499 if ($section eq 'dynamic') {
500 print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets "
501 . "in skipped section 'dynamic_bs'\n"
502 if $skip{'dynamic_bs'} && $Verbose;
503 print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets "
504 . "in skipped section 'dynamic_lib'\n"
505 if $skip{'dynamic_lib'} && $Verbose;
507 if ($section eq 'dynamic_lib') {
508 print STDOUT "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on "
509 . "targets in skipped section 'dynamic_bs'\n"
510 if $skip{'dynamic_bs'} && $Verbose;
512 if ($section eq 'static') {
513 print STDOUT "Warning (non-fatal): Target 'static' depends on targets "
514 . "in skipped section 'static_lib'\n"
515 if $skip{'static_lib'} && $Verbose;
517 return 'skipped' if $skip{$section};
526 print STDOUT "MakeMaker" if $Verbose;
528 parse_args(\%att, @ARGV);
529 my(%initial_att) = %att; # record initial attributes
533 print STDOUT "Writing Makefile for $att{NAME}";
538 unlink("Makefile", "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : '');
539 open MAKE, ">MakeMaker.tmp" or die "Unable to open MakeMaker.tmp: $!";
540 select MAKE; $|=1; select STDOUT;
542 print MAKE "# This Makefile is for the $att{NAME} extension to perl.\n#";
543 print MAKE "# It was generated automatically by MakeMaker version $Version from the contents";
544 print MAKE "# of Makefile.PL. Don't edit this file, edit Makefile.PL instead.";
545 print MAKE "#\n# ANY CHANGES MADE HERE WILL BE LOST! \n#";
546 print MAKE "# MakeMaker Parameters: ";
547 foreach $key (sort keys %initial_att){
548 my($v) = neatvalue($initial_att{$key});
550 print MAKE "# $key => $v";
553 # build hash for SKIP to make testing easy
554 %skip = map( ($_,1), @{$att{'SKIP'} || []});
556 foreach $section ( @MM_Sections ){
557 print "Processing Makefile '$section' section" if ($Verbose >= 2);
558 my($skipit) = skipcheck($section);
560 print MAKE "\n# --- MakeMaker $section section $skipit.";
562 my(%a) = %{$att{$section} || {}};
563 print MAKE "\n# --- MakeMaker $section section:";
564 print MAKE "# ",%a if $Verbose;
565 print(MAKE MY->nicetext(MY->$section( %a )));
570 print MAKE "\n# Full list of MakeMaker attribute values:";
571 foreach $key (sort keys %att){
572 my($v) = neatvalue($att{$key});
574 print MAKE "# $key => $v";
578 print MAKE "\n# End.";
580 my($finalname) = $Is_VMS ? "Descrip.MMS" : "Makefile";
581 rename("MakeMaker.tmp", $finalname);
583 chmod 0644, $finalname;
584 system("$Config{'eunicefix'} $finalname") unless $Config{'eunicefix'} eq ":";
591 parse_args(\%att, @ARGV);
597 parse_args(\%att, @ARGV);
602 my($attr, @args) = @_;
604 unless (m/(.*?)=(.*)/){
605 help(),exit 1 if m/^help$/;
606 ++$Verbose if m/^verb/;
609 my($name, $value) = ($1, $2);
610 if ($value =~ m/^~(\w+)?/){ # tilde with optional username
611 my($home) = ($1) ? (getpwnam($1))[7] : (getpwuid($>))[7];
612 $value =~ s/^~(\w+)?/$home/;
614 $$attr{$name} = $value;
616 # catch old-style 'potential_libs' and inform user how to 'upgrade'
617 if (defined $$attr{'potential_libs'}){
618 my($msg)="'potential_libs' => '$$attr{potential_libs}' should be";
619 if ($$attr{'potential_libs'}){
620 print STDOUT "$msg changed to:\n\t'LIBS' => ['$$attr{potential_libs}']\n";
622 print STDOUT "$msg deleted.\n";
624 $$attr{LIBS} = [$$attr{'potential_libs'}];
625 delete $$attr{'potential_libs'};
627 # catch old-style 'ARMAYBE' and inform user how to 'upgrade'
628 if (defined $$attr{'ARMAYBE'}){
629 my($armaybe) = $$attr{'ARMAYBE'};
630 print STDOUT "ARMAYBE => '$armaybe' should be changed to:\n",
631 "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n";
632 my(%dl) = %{$$attr{'dynamic_lib'} || {}};
633 $$attr{'dynamic_lib'} = { %dl, ARMAYBE => $armaybe};
634 delete $$attr{'ARMAYBE'};
636 if (defined $$attr{'LDTARGET'}){
637 print STDOUT "LDTARGET should be changed to LDFROM\n";
638 $$attr{'LDFROM'} = $$attr{'LDTARGET'};
639 delete $$attr{'LDTARGET'};
641 foreach(sort keys %{$attr}){
642 print STDOUT " $_ => ".neatvalue($$attr{$_}) if ($Verbose);
643 print STDOUT "'$_' is not a known MakeMaker parameter name.\n"
644 unless exists $Recognized_Att_Keys{$_};
651 return "undef" unless defined $v;
653 return "'$v'" unless $t;
654 return "[ ".join(', ',map("'$_'",@$v))." ]" if ($t eq 'ARRAY');
655 return "$v" unless $t eq 'HASH';
657 push(@m,"$key=>".neatvalue($val)) while (($key,$val) = each %$v);
658 return "{ ".join(', ',@m)." }";
662 # ------ Define the MakeMaker default methods in package MM_Unix ------
671 Exporter::import('ExtUtils::MakeMaker',
672 qw(%att %skip %Recognized_Att_Keys $Verbose));
674 # These attributes cannot be overridden externally
675 @Other_Att_Keys{qw(EXTRALIBS BSLOADLIBS LDLOADLIBS)} = (1) x 3;
677 if ($Is_VMS = $Config{'osname'} eq 'VMS') {
678 require VMS::Filespec;
679 import VMS::Filespec 'vmsify';
684 # Find out directory name. This may contain the extension name.
685 my($pwd) = fastcwd(); # from Cwd.pm
687 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
689 # *Real* information: where did we get these two from? ...
690 $inc_config_dir = dirname($INC{'Config.pm'});
691 $inc_carp_dir = dirname($INC{'Carp.pm'});
693 # Typically PERL_* and INST_* will be identical but that need
694 # not be the case (e.g., installing into project libraries etc).
696 # Perl Macro: With source No source
697 # PERL_LIB ../../lib /usr/local/lib/perl5
698 # PERL_ARCHLIB ../../lib /usr/local/lib/perl5/sun4-sunos
699 # PERL_SRC ../.. (undefined)
701 # INST Macro: Locally Publically
702 # INST_LIB ../../lib ./blib
703 # INST_ARCHLIB ../../lib ./blib
705 unless ($att{PERL_SRC}){
706 foreach(qw(../.. ../../.. ../../../..)){
707 ($att{PERL_SRC}=$_, last) if -f "$_/config.sh";
710 unless ($att{PERL_SRC}){
711 # we should also consider $ENV{PERL5LIB} here
712 $att{PERL_LIB} = $Config{'privlib'} unless $att{PERL_LIB};
713 $att{PERL_ARCHLIB} = $Config{'archlib'} unless $att{PERL_ARCHLIB};
714 $att{PERL_INC} = "$att{PERL_ARCHLIB}/CORE"; # wild guess for now
715 die "Unable to locate Perl source. Try setting PERL_SRC in Makefile.PL or on command line.\n"
716 unless (-f "$att{PERL_INC}/perl.h");
717 print STDOUT "Using header files found in $att{PERL_INC}" if $Verbose;
719 $att{PERL_LIB} = "$att{PERL_SRC}/lib" unless $att{PERL_LIB};
720 $att{PERL_ARCHLIB} = $att{PERL_LIB};
721 $att{PERL_INC} = $att{PERL_SRC};
724 # INST_LIB typically pre-set if building an extension after
725 # perl has been built and installed. Setting INST_LIB allows
726 # you to build directly into privlib and avoid installperl.
727 unless ($att{INST_LIB}){
728 if (defined $att{PERL_SRC}) {
729 $att{INST_LIB} = $att{PERL_LIB};
731 $att{INST_LIB} = "$pwd/blib";
734 # Try to work out what INST_ARCHLIB should be if not set:
735 unless ($att{INST_ARCHLIB}){
737 "$pwd/blib" => "$pwd/blib", # our private build lib
738 $att{PERL_LIB} => $att{PERL_ARCHLIB},
739 $Config{'privlib'} => $Config{'archlib'},
740 $Config{'installprivlib'} => $Config{'installarchlib'},
741 $inc_carp_dir => $inc_config_dir,
743 $att{INST_ARCHLIB} = $archmap{$att{INST_LIB}};
744 unless($att{INST_ARCHLIB}){
745 # Oh dear, we'll have to default it and warn the user
746 my($archname) = $Config{'archname'};
747 if (-d "$att{INST_LIB}/$archname"){
748 $att{INST_ARCHLIB} = "$att{INST_LIB}/$archname";
749 print STDOUT "Defaulting INST_ARCHLIB to INST_LIB/$archname\n";
751 $att{INST_ARCHLIB} = $att{INST_LIB};
752 print STDOUT "Warning: Defaulting INST_ARCHLIB to INST_LIB ",
753 "(not architecture independent).\n";
756 $att{INST_EXE} = "./blib" unless $att{INST_EXE};
757 $att{MAP_TARGET} = "perl" unless $att{MAP_TARGET};
758 $att{LIBPERL_A} = $Is_VMS ? 'libperl.olb' : 'libperl.a'
759 unless $att{LIBPERL_A};
762 # make a few simple checks
763 die "PERL_LIB ($att{PERL_LIB}) is not a perl library directory"
764 unless (-f "$att{PERL_LIB}/Exporter.pm");
766 # --- Initialize Module Name and Paths
768 # NAME = The perl module name for this extension (eg DBD::Oracle).
769 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
770 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
771 # ROOTEXT = Directory part of FULLEXT with leading /.
772 unless($att{NAME}){ # we have to guess our name
775 $name =~ s:.*?([^.\]]+)\]:$1: unless ($name =~ s:.*[.\[]ext\.(.*)\]:$1:i);
776 ($att{NAME}=$name) =~ s#[.\]]#::#g;
778 $name =~ s:.*/:: unless ($name =~ s:^.*/ext/::);
779 ($att{NAME} =$name) =~ s#/#::#g;
782 ($att{FULLEXT} =$att{NAME}) =~ s#::#/#g ; #eg. BSD/Foo/Socket
783 ($att{BASEEXT} =$att{NAME}) =~ s#.*::##; #eg. Socket
784 ($att{ROOTEXT} =$att{FULLEXT}) =~ s#/?\Q$att{BASEEXT}\E$## ; # eg. /BSD/Foo
785 $att{ROOTEXT} = ($Is_VMS ? '' : '/') . $att{ROOTEXT} if $att{ROOTEXT};
787 ($att{DISTNAME}=$att{NAME}) =~ s#(::)#-#g unless $att{DISTNAME};
788 $att{VERSION} = "0.1" unless $att{VERSION};
791 # --- Initialize Perl Binary Locations
793 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
794 # will be working versions of perl 5. miniperl has priority over perl
795 # for PERL to ensure that $(PERL) is usable while building ./ext/*
796 $att{'PERL'} = MY->find_perl(5.0, [ qw(miniperl perl) ],
797 [ grep defined $_, $att{PERL_SRC}, split(":", $ENV{PATH}), $Config{'bin'} ], $Verbose )
798 unless ($att{'PERL'} && -x $att{'PERL'});
800 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
801 ($att{'FULLPERL'} = $att{'PERL'}) =~ s/miniperl/perl/
802 unless ($att{'FULLPERL'} && -x $att{'FULLPERL'});
805 $att{'PERL'} = 'MCR ' . vmsify($att{'PERL'});
806 $att{'FULLPERL'} = 'MCR ' . vmsify($att{'FULLPERL'});
811 sub init_dirscan { # --- File and Directory Lists (.xs .pm etc)
813 my($name, %dir, %xs, %c, %h, %ignore);
814 local(%pm); #the sub in find() has to see this hash
815 $ignore{'test.pl'} = 1;
816 $ignore{'makefile.pl'} = 1 if $Is_VMS;
817 foreach $name (lsdir(".")){
818 next if ($name =~ /^\./ or $ignore{$name});
820 $dir{$name} = $name if (-f "$name/Makefile.PL");
821 } elsif ($name =~ /\.xs$/){
822 my($c); ($c = $name) =~ s/\.xs$/.c/;
825 } elsif ($name =~ /\.c$/){
827 } elsif ($name =~ /\.h$/){
829 } elsif ($name =~ /\.p[ml]$/){
830 $pm{$name} = "\$(INST_LIBDIR)/$name";
834 # Some larger extensions often wish to install a number of *.pm/pl
835 # files into the library in various locations.
837 # The attribute PMLIBDIRS holds an array reference which lists
838 # subdirectories which we should search for library files to
839 # install. PMLIBDIRS defaults to [ 'lib', $att{BASEEXT} ].
840 # We recursively search through the named directories (skipping
841 # any which don't exist or contain Makefile.PL files).
843 # For each *.pm or *.pl file found MY->libscan() is called with
844 # the default installation path in $_. The return value of libscan
845 # defines the actual installation location.
846 # The default libscan function simply returns $_.
847 # The file is skipped if libscan returns false.
849 # The default installation location passed to libscan in $_ is:
851 # ./*.pm => $(INST_LIBDIR)/*.pm
852 # ./xyz/... => $(INST_LIBDIR)/xyz/...
853 # ./lib/... => $(INST_LIB)/...
855 # In this way the 'lib' directory is seen as the root of the actual
856 # perl library whereas the others are relative to INST_LIBDIR
857 # (which includes ROOTEXT). This is a subtle distinction but one
858 # that's important for nested modules.
860 $att{PMLIBDIRS} = [ 'lib', $att{BASEEXT} ] unless $att{PMLIBDIRS};
862 #only existing directories that aren't in $dir are allowed
863 @{$att{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$att{PMLIBDIRS}};
865 if (@{$att{PMLIBDIRS}}){
866 print "Searching PMLIBDIRS: @{$att{PMLIBDIRS}}"
868 use File::Find; # try changing to require !
869 File::Find::find(sub {
870 # We now allow any file in PMLIBDIRS to be installed. nTk needs that, and
871 # we should allow it.
872 # return unless m/\.p[ml]$/;
873 return if -d $_; # anything else that Can't be copied?
874 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
876 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^lib/::);
877 local($_) = "$prefix/$striplibpath";
878 my($inst) = MY->libscan();
879 print "libscan($path) => '$inst'" if ($Verbose >= 2);
882 }, @{$att{PMLIBDIRS}});
885 $att{DIR} = [sort keys %dir] unless $att{DIRS};
886 $att{XS} = \%xs unless $att{XS};
887 $att{PM} = \%pm unless $att{PM};
888 $att{C} = [sort keys %c] unless $att{C};
889 my(@o_files) = @{$att{C}};
890 my($sufx) = $Is_VMS ? '.obj' : '.o';
891 $att{O_FILES} = [grep s/\.c$/$sufx/, @o_files] ;
892 $att{H} = [sort keys %h] unless $att{H};
897 return undef if m:/RCS/: ;
901 sub init_others { # --- Initialize Other Attributes
903 for $key (keys(%Recognized_Att_Keys), keys(%Other_Att_Keys)){
904 # avoid warnings for uninitialized vars
905 next if exists $att{$key};
909 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $att{'LIBS'}
910 # Lets look at $att{LIBS} carefully: It may be an anon array, a string or
911 # undefined. In any case we turn it into an anon array:
912 $att{LIBS}=[] unless $att{LIBS};
913 $att{LIBS}=[$att{LIBS}] if ref \$att{LIBS} eq SCALAR;
914 foreach ( @{$att{'LIBS'}} ){
915 s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
916 my(@libs) = MY->extliblist($_);
917 if ($libs[0] or $libs[1] or $libs[2]){
918 @att{EXTRALIBS, BSLOADLIBS, LDLOADLIBS} = @libs;
923 print STDOUT "CONFIG must be an array ref\n"
924 if ($att{CONFIG} and ref $att{CONFIG} ne 'ARRAY');
925 $att{CONFIG} = [] unless (ref $att{CONFIG});
926 push(@{$att{CONFIG}},
927 qw( cc libc ldflags lddlflags ccdlflags cccdlflags
928 ranlib so dlext dlsrc installprivlib installarchlib
930 push(@{$att{CONFIG}}, 'shellflags') if $Config{'shellflags'};
933 $att{OBJECT} = '$(BASEEXT).obj' unless $att{OBJECT};
934 $att{OBJECT} =~ s/[^,\s]\s+/, /g;
935 $att{OBJECT} =~ s/\n+/, /g;
936 $att{OBJECT} =~ s#\.o,#\.obj,#;
938 $att{OBJECT} = '$(BASEEXT).o' unless $att{OBJECT};
939 $att{OBJECT} =~ s/\n+/ \\\n\t/g;
941 $att{BOOTDEP} = (-f "$att{BASEEXT}_BS") ? "$att{BASEEXT}_BS" : "";
942 $att{LD} = ($Config{'ld'} || 'ld') unless $att{LD};
943 $att{LDFROM} = '$(OBJECT)' unless $att{LDFROM};
944 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
945 # the 'dynamic' section of MM. We don't have this problem with
946 # 'static', since we either must use it (%Config says we can't
947 # use dynamic loading) or the caller asked for it explicitly.
948 if (!$att{LINKTYPE}) {
949 $att{LINKTYPE} = grep(/dynamic/,@{$att{SKIP} || []})
951 : ($Config{'usedl'} ? 'dynamic' : 'static');
954 # These get overridden for VMS and maybe some other systems
956 $att{MAKEFILE} = "Makefile";
957 $att{RM_F} = "rm -f";
958 $att{RM_RF} = "rm -rf";
959 $att{TOUCH} = "touch";
966 my($dir, $regex) = @_;
968 opendir(DIR, $_[0] || ".") or die "opendir: $!";
971 @ls = grep(/$regex/, @ls) if $regex;
977 my($self, $ver, $names, $dirs, $trace) = @_;
980 print "Looking for perl $ver by these names: ";
982 print "in these dirs:";
985 foreach $dir (@$dirs){
986 next unless defined $dir; # $att{PERL_SRC} may be undefined
987 foreach $name (@$names){
988 print "Checking $dir/$name " if ($trace >= 2);
990 $name .= ".exe" unless -x "$dir/$name";
992 next unless -x "$dir/$name";
993 print "Executing $dir/$name" if ($trace);
996 my($vmscmd) = 'MCR ' . vmsify("$dir/$name");
997 $out = `$vmscmd -e "require $ver; print ""VER_OK\n"""`;
999 $out = `$dir/$name -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1001 return "$dir/$name" if $out =~ /VER_OK/;
1004 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1005 0; # false and not empty
1009 sub post_initialize{
1019 DISTNAME = $att{DISTNAME}
1020 VERSION = $att{VERSION}
1022 # In which library should we install this extension?
1023 # This is typically the same as PERL_LIB.
1024 # (also see INST_LIBDIR and relationship to ROOTEXT)
1025 INST_LIB = $att{INST_LIB}
1026 INST_ARCHLIB = $att{INST_ARCHLIB}
1027 INST_EXE = $att{INST_EXE}
1029 # Perl library to use when building the extension
1030 PERL_LIB = $att{PERL_LIB}
1031 PERL_ARCHLIB = $att{PERL_ARCHLIB}
1032 LIBPERL_A = $att{LIBPERL_A}
1035 # Define I_PERL_LIBS to include the required -Ipaths
1036 # To be cute we only include PERL_ARCHLIB if different
1037 # To be portable we add quotes for VMS
1038 my(@i_perl_libs) = qw{-I$(PERL_ARCHLIB) -I$(PERL_LIB)};
1039 shift(@i_perl_libs) if ($att{PERL_ARCHLIB} eq $att{PERL_LIB});
1041 push @m, "I_PERL_LIBS = \"".join('" "',@i_perl_libs)."\"\n";
1043 push @m, "I_PERL_LIBS = ".join(' ',@i_perl_libs)."\n";
1047 # Where is the perl source code located?
1048 PERL_SRC = $att{PERL_SRC}\n" if $att{PERL_SRC};
1051 # Perl header files (will eventually be under PERL_LIB)
1052 PERL_INC = $att{PERL_INC}
1055 FULLPERL = $att{'FULLPERL'}
1058 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
1059 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
1060 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
1061 FULLEXT = $att{FULLEXT}
1062 BASEEXT = $att{BASEEXT}
1063 ROOTEXT = $att{ROOTEXT}
1067 DEFINE = $att{DEFINE}
1068 OBJECT = $att{OBJECT}
1069 LDFROM = $att{LDFROM}
1070 LINKTYPE = $att{LINKTYPE}
1072 # Handy lists of source code files:
1073 XS_FILES= ".join(" \\\n\t", sort keys %{$att{XS}})."
1074 C_FILES = ".join(" \\\n\t", @{$att{C}})."
1075 O_FILES = ".join(" \\\n\t", @{$att{O_FILES}})."
1076 H_FILES = ".join(" \\\n\t", @{$att{H}})."
1082 .PHONY: all config static dynamic test linkext
1084 # This extension may link to it's own library (see SDBM_File)
1085 MYEXTLIB = $att{MYEXTLIB}
1087 # Where is the Config information that we are using/depend on
1088 CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
1092 # Where to put things:
1093 INST_LIBDIR = $(INST_LIB)$(ROOTEXT)
1094 INST_ARCHLIBDIR = $(INST_ARCHLIB)$(ROOTEXT)
1096 INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
1097 INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
1101 INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT).a
1102 INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(BASEEXT).$(DLEXT)
1103 INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
1104 INST_PM = '.join(" \\\n\t", sort values %{$att{PM}}).'
1112 my($self,$libperl)=@_;
1113 $libperl or $libperl = $att{LIBPERL_A} || "libperl.a" ;
1114 # This is implemented in the same manner as extliblist,
1115 # e.g., do both and compare results during the transition period.
1116 my($cc,$ccflags,$optimize,$large,$split, $shflags)
1117 = @Config{qw(cc ccflags optimize large split shellflags)};
1118 $shflags = '' unless $shflags;
1119 my($prog, $old, $uc, $perltype);
1121 chop($old = `cd $att{PERL_SRC}; sh $shflags ./cflags $libperl $att{BASEEXT}.c 2>/dev/null`)
1127 DE => '-DDEBUGGING -DEMBED',
1128 M => '-DEMBED -DMULTIPLICITY',
1129 DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
1132 if ($libperl =~ /libperl(\w*)\.a/){
1135 $uc = ""; # avoid warning
1137 $perltype = $map{$uc} ? $map{$uc} : "";
1145 ( $name = $att{NAME} . "_cflags" ) =~ s/:/_/g ;
1146 if ($prog = $Config{$name}) {
1147 # Expand hints for this extension via the shell
1148 print STDOUT "Processing $name hint:\n" if $Verbose;
1150 ccflags=\"$ccflags\"
1151 optimize=\"$optimize\"
1152 perltype=\"$perltype\"
1153 optdebug=\"$optdebug\"
1158 echo ccflags=\$ccflags
1159 echo optimize=\$optimize
1160 echo perltype=\$perltype
1161 echo optdebug=\$optdebug
1168 if ($line =~ /(.*?)=\s*(.*)\s*$/){
1170 print STDOUT " $1 = $2" if $Verbose;
1172 print STDOUT "Unrecognised result from hint: '$line'\n";
1175 ( $cc,$ccflags,$perltype,$optdebug,$optimize,$large,$split )=@cflags{
1176 qw( cc ccflags perltype optdebug optimize large split)};
1180 $optimize = $optdebug;
1183 my($new) = "$cc -c $ccflags $optimize $perltype $large $split";
1184 if (defined($old) and $new ne $old) {
1185 print STDOUT "Warning (non-fatal): cflags evaluation in MakeMaker differs from shell output\n"
1186 ." package: $att{NAME}\n"
1189 ." Using 'old' set.\n"
1190 ."Please notify perl5-porters\@nicoh.com\n";
1192 my($cccmd)=($old) ? $old : $new;
1197 # --- Constants Sections ---
1201 push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
1203 foreach $m (@{$att{'CONFIG'}}){
1204 next if $once_only{$m};
1205 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1206 unless exists $Config{$m};
1207 push @m, "\U$m\E = $Config{$m}\n";
1216 # $att{NAME} might depend on some other libraries:
1217 # (These comments may need revising:)
1219 # Dependent libraries can be linked in one of three ways:
1221 # 1. (For static extensions) by the ld command when the perl binary
1222 # is linked with the extension library. See EXTRALIBS below.
1224 # 2. (For dynamic extensions) by the ld command when the shared
1225 # object is built/linked. See LDLOADLIBS below.
1227 # 3. (For dynamic extensions) by the DynaLoader when the shared
1228 # object is loaded. See BSLOADLIBS below.
1230 # EXTRALIBS = List of libraries that need to be linked with when
1231 # linking a perl binary which includes this extension
1232 # Only those libraries that actually exist are included.
1233 # These are written to a file and used when linking perl.
1235 # LDLOADLIBS = List of those libraries which can or must be linked into
1236 # the shared library when created using ld. These may be
1237 # static or dynamic libraries.
1239 # BSLOADLIBS = List of those libraries that are needed but can be
1240 # linked in dynamically at run time on this platform.
1241 # SunOS/Solaris does not need this because ld records
1242 # the information (from LDLOADLIBS) into the object file.
1243 # This list is used to create a .bs (bootstrap) file.
1245 EXTRALIBS = $att{'EXTRALIBS'}
1246 LDLOADLIBS = $att{'LDLOADLIBS'}
1247 BSLOADLIBS = $att{'BSLOADLIBS'}
1252 # --- Tool Sections ---
1255 my($self, %attribs) = @_;
1257 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
1259 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
1260 AUTOSPLITFILE = $(PERL) $(I_PERL_LIBS) -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
1266 my($xsdir) = '$(PERL_LIB)/ExtUtils';
1267 # drop back to old location if xsubpp is not in new location yet
1268 $xsdir = '$(PERL_SRC)/ext' unless (-f "$att{PERL_LIB}/ExtUtils/xsubpp");
1269 my(@tmdeps) = ('$(XSUBPPDIR)/typemap');
1270 push(@tmdeps, "typemap") if -f "typemap";
1271 my(@tmargs) = map("-typemap $_", @tmdeps);
1274 XSUBPP = \$(XSUBPPDIR)/xsubpp
1275 XSUBPPDEPS = @tmdeps
1276 XSUBPPARGS = @tmargs
1291 # The following is a portable way to say mkdir -p
1292 MKPATH = $(PERL) -wle '$$"="/"; foreach $$p (@ARGV){ next if -d $$p; my(@p); foreach(split(/\//,$$p)){ push(@p,$$_); next if -d "@p/"; print "mkdir @p"; mkdir("@p",0777)||die $$! }} exit 0;'
1302 # --- Translation Sections ---
1308 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $(INC) $*.c
1316 $(PERL) $(XSUBPP) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
1320 sub xs_o { # many makes are too dumb to use xs_c then c_o
1323 $(PERL) $(XSUBPP) $(XSUBPPARGS) $*.xs >xstmp.c && mv xstmp.c $*.c
1324 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $(INC) $*.c
1329 # --- Target Sections ---
1334 all :: config linkext $(INST_PM)
1337 config :: '.$att{MAKEFILE}.'
1338 @ $(MKPATH) $(INST_LIBDIR) $(INST_ARCHAUTODIR)
1342 $(O_FILES): $(H_FILES)
1343 ' if @{$att{O_FILES} || []} && @{$att{H} || []};
1348 my($self, %attribs) = @_;
1349 # LINKTYPE => static or dynamic
1350 my($linktype) = $attribs{LINKTYPE} || '$(LINKTYPE)';
1352 linkext :: $linktype
1358 my($self,%attribs) = @_;
1360 return '' if ($Config{'osname'} ne 'aix');
1362 my($funcs) = $attribs{DL_FUNCS} || $att{DL_FUNCS} || {};
1363 my($vars) = $attribs{DL_VARS} || $att{DL_VARS} || [];
1367 dynamic :: $att{BASEEXT}.exp
1369 ") unless $skip{'dynamic'};
1372 static :: $att{BASEEXT}.exp
1374 ") unless $skip{'static'};
1377 $att{BASEEXT}.exp: Makefile.PL
1378 ",' $(PERL) $(I_PERL_LIBS) -e \'use ExtUtils::MakeMaker; \\
1379 mksymlists(DL_FUNCS => ',
1380 %$funcs ? neatvalue($funcs) : '""',', DL_VARS => ',
1381 @$vars ? neatvalue($vars) : '""', ", NAME => \"$att{NAME}\")'
1387 # --- Dynamic Loading Sections ---
1391 # $(INST_PM) has been moved to the all: target.
1392 # It remains here for awhile to allow for old usage: "make dynamic"
1393 dynamic :: '.$att{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
1399 my($self, %attribs) = @_;
1401 BOOTSTRAP = '."$att{BASEEXT}.bs".'
1403 # As MakeMaker mkbootstrap might not write a file (if none is required)
1404 # we use touch to prevent make continually trying to remake it.
1405 # The DynaLoader only reads a non-empty file.
1406 $(BOOTSTRAP): '."$att{MAKEFILE} $att{BOOTDEP}".'
1407 @ echo "Running mkbootstrap for $(NAME) ($(BSLOADLIBS))"
1408 @ $(PERL) $(I_PERL_LIBS) \
1409 -e \'use ExtUtils::MakeMaker; &mkbootstrap("$(BSLOADLIBS)");\' \
1410 INST_LIB=$(INST_LIB) INST_ARCHLIB=$(INST_ARCHLIB) PERL_SRC=$(PERL_SRC) NAME=$(NAME)
1411 @ $(TOUCH) $(BOOTSTRAP)
1413 $(INST_BOOT): $(BOOTSTRAP)
1414 @ '.$att{RM_RF}.' $(INST_BOOT)
1415 -'.$att{CP}.' $(BOOTSTRAP) $(INST_BOOT)
1421 my($self, %attribs) = @_;
1422 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
1423 my($armaybe) = $attribs{ARMAYBE} || $att{ARMAYBE} || ":";
1424 my($ldfrom) = '$(LDFROM)';
1425 my($osname) = $Config{'osname'};
1426 $armaybe = 'ar' if ($osname eq 'dec_osf' and $armaybe eq ':');
1429 # This section creates the dynamically loadable $(INST_DYNAMIC)
1430 # from $(OBJECT) and possibly $(MYEXTLIB).
1431 ARMAYBE = '.$armaybe.'
1432 OTHERLDFLAGS = '.$otherldflags.'
1434 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
1435 @ $(MKPATH) $(INST_ARCHAUTODIR)
1437 if ($armaybe ne ':'){
1439 push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
1440 push(@m,' $(RANLIB) '."$ldfrom\n");
1442 $ldfrom = "-all $ldfrom -none" if ($osname eq 'dec_osf');
1443 push(@m,' $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
1444 ' $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS)'."\n");
1449 # --- Static Loading Sections ---
1453 # $(INST_PM) has been moved to the all: target.
1454 # It remains here for awhile to allow for old usage: "make static"
1455 static :: '.$att{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
1463 $(INST_STATIC): $(OBJECT) $(MYEXTLIB)
1464 @ $(MKPATH) $(INST_ARCHAUTODIR)
1466 # If this extension has it's own library (eg SDBM_File)
1467 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
1468 push(@m, " $att{CP} \$(MYEXTLIB) \$\@\n") if $att{MYEXTLIB};
1471 ar cr $@ $(OBJECT) && $(RANLIB) $@
1472 @echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
1475 # Old mechanism - still available:
1477 push(@m, <<'END') if $att{PERL_SRC};
1478 @ echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
1485 my($self, %attribs) = @_;
1486 # By default .pm files are split into the architecture independent
1487 # library. This is a good thing. If a specific module requires that
1488 # it's .pm files are split into the architecture specific library
1489 # then it should use: installpm => {SPLITLIB=>'$(INST_ARCHLIB)'}
1490 # Note that installperl currently interferes with this (Config.pm)
1491 # User can disable split by saying: installpm => {SPLITLIB=>''}
1492 my($splitlib) = '$(INST_LIB)'; # NOT arch specific by default
1493 $splitlib = $attribs{SPLITLIB} if exists $attribs{SPLITLIB};
1495 foreach $dist (sort keys %{$att{PM}}){
1496 my($inst) = $att{PM}->{$dist};
1497 push(@m, "\n# installpm: $dist => $inst, splitlib=$splitlib\n");
1498 push(@m, MY->installpm_x($dist, $inst, $splitlib));
1504 sub installpm_x { # called by installpm per file
1505 my($self, $dist, $inst, $splitlib) = @_;
1506 my($instdir) = $inst =~ m|(.*)/|;
1509 $inst: $dist Makefile
1510 ".' @ '.$att{RM_F}.' $@
1511 @ $(MKPATH) '.$instdir.'
1512 '."$att{CP} $dist".' $@
1514 push(@m, "\t\@\$(AUTOSPLITFILE) \$@ $splitlib/auto\n")
1515 if ($splitlib and $inst =~ m/\.pm$/);
1520 return "" unless $att{EXE_FILES} && ref $att{EXE_FILES} eq "ARRAY";
1521 my(@m, $from, $to, %fromto, @to);
1522 for $from (@{$att{EXE_FILES}}) {
1523 local($_)= '$(INST_EXE)/' . basename($from);
1524 $to = MY->exescan();
1525 print "exescan($from) => '$to'" if ($Verbose >=2);
1528 @to = values %fromto;
1530 EXE_FILES = @{$att{EXE_FILES}}
1538 while (($from,$to) = each %fromto) {
1540 $to: $from $att{MAKEFILE}
1550 # --- Sub-directory Sections ---
1554 # This method provides a mechanism to automatically deal with
1555 # subdirectories containing further Makefile.PL scripts.
1556 # It calls the subdir_x() method for each subdirectory.
1557 foreach(<*/Makefile.PL>){
1558 s:/Makefile\.PL$:: ;
1559 print "Including $_ subdirectory" if ($Verbose);
1560 push(@m, MY->subdir_x($_));
1564 # The default clean, realclean and test targets in this Makefile
1565 # have automatically been given entries for each subdir.
1570 push(@m, "\n# none")
1575 sub runsubdirpl{ # Experimental! See subdir_x section
1576 my($self,$subdir) = @_;
1577 chdir($subdir) or die "chdir($subdir): $!";
1578 ExtUtils::MakeMaker::check_hints();
1579 require "Makefile.PL";
1583 my($self, $subdir) = @_;
1585 # The intention is that the calling Makefile.PL should define the
1586 # $(SUBDIR_MAKEFILE_PL_ARGS) make macro to contain whatever
1587 # information needs to be passed down to the other Makefile.PL scripts.
1588 # If this does not suit your needs you'll need to write your own
1589 # MY::subdir_x() method to override this one.
1591 config :: $subdir/$att{MAKEFILE}
1592 cd $subdir ; \$(MAKE) config INST_LIB=\$(INST_LIB) INST_ARCHLIB=\$(INST_ARCHLIB) \\
1593 INST_EXE=\$(INST_EXE) LINKTYPE=\$(LINKTYPE) LIBPERL_A=\$(LIBPERL_A) \$(SUBDIR_MAKEFILE_PL_ARGS)
1595 $subdir/$att{MAKEFILE}: $subdir/Makefile.PL \$(CONFIGDEP)
1596 }.' @echo "Rebuilding $@ ..."
1597 $(PERL) $(I_PERL_LIBS) \\
1598 -e "use ExtUtils::MakeMaker; MM->runsubdirpl(qw('.$subdir.'))" \\
1599 INST_LIB=$(INST_LIB) INST_ARCHLIB=$(INST_ARCHLIB) \\
1600 INST_EXE=$(INST_EXE) LINKTYPE=\$(LINKTYPE) LIBPERL_A=$(LIBPERL_A) $(SUBDIR_MAKEFILE_PL_ARGS)
1601 @echo "Rebuild of $@ complete."
1605 cd $subdir ; \$(MAKE) all LINKTYPE=\$(LINKTYPE)
1611 # --- Cleanup and Distribution Sections ---
1614 my($self, %attribs) = @_;
1617 # Delete temporary files but do not touch installed files. We don\'t delete
1618 # the Makefile here so a later make realclean still has a makefile to use.
1622 # clean subdirectories first
1623 push(@m, map("\t-cd $_ && test -f $att{MAKEFILE} && \$(MAKE) clean\n",@{$att{DIR}}));
1624 my(@otherfiles) = values %{$att{XS}}; # .c files from *.xs files
1625 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
1626 push(@otherfiles, "./blib");
1627 push(@m, " -$att{RM_RF} *~ t/*~ *.o *.a mon.out core so_locations "
1628 ."\$(BOOTSTRAP) \$(BASEEXT).bso \$(BASEEXT).exp @otherfiles\n");
1629 # See realclean and ext/utils/make_ext for usage of Makefile.old
1630 push(@m, " -$att{MV} $att{MAKEFILE} $att{MAKEFILE}.old 2>/dev/null\n");
1631 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1636 my($self, %attribs) = @_;
1639 # Delete temporary files (via clean) and also delete installed files
1640 realclean purge :: clean
1642 # realclean subdirectories first (already cleaned)
1643 $sub = "\t-cd %s && test -f %s && \$(MAKE) %s realclean\n";
1644 foreach(@{$att{DIR}}){
1645 push(@m, sprintf($sub,$_,"$att{MAKEFILE}.old","-f $att{MAKEFILE}.old"));
1646 push(@m, sprintf($sub,$_,"$att{MAKEFILE}",''));
1648 push(@m, " $att{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
1649 push(@m, " $att{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
1650 push(@m, " $att{RM_F} \$(INST_STATIC) \$(INST_PM)\n");
1651 my(@otherfiles) = ($att{MAKEFILE},
1652 "$att{MAKEFILE}.old"); # Makefiles last
1653 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
1654 push(@m, " $att{RM_RF} @otherfiles\n") if @otherfiles;
1655 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
1661 my($self, %attribs) = @_;
1662 # VERSION should be sanitised before use as a file name
1663 my($tarname) = $attribs{TARNAME} || '$(DISTNAME)-$(VERSION)';
1664 my($tarflags) = $attribs{TARFLAGS} || 'cvf';
1665 my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip
1666 my($preop) = $attribs{PREOP} || '@:'; # e.g., update MANIFEST
1667 my($postop) = $attribs{POSTOP} || '@:';
1668 my($mkfiles) = join(' ', map("$_/$att{MAKEFILE} $_/$att{MAKEFILE}.old", ".", @{$att{DIR}}));
1673 cd ..; tar $tarflags $tarname.tar \$(BASEEXT)
1674 cd ..; $compress $tarname.tar
1680 # --- Test and Installation Sections ---
1683 my($self, %attribs) = @_;
1684 my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
1691 push(@m, <<"END") if $tests;
1692 \$(FULLPERL) -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
1694 push(@m, <<'END') if -f "test.pl";
1695 $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) test.pl
1697 push(@m, map("\tcd $_ && test -f $att{MAKEFILE} && \$(MAKE) test LINKTYPE=\$(LINKTYPE)\n",
1699 push(@m, "\t\@echo 'No tests defined for \$(NAME) extension.'\n") unless @m > 1;
1705 my($self, %attribs) = @_;
1709 @ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \\
1710 -e 'use ExtUtils::MakeMaker; MM->writedoc("Module", "$(NAME)", \\
1711 "LINKTYPE=$(LINKTYPE)", "VERSION=$(VERSION)", "EXE_FILES=$(EXE_FILES)")'
1715 install :: pure_install doc_install
1719 # install subdirectories first
1720 push(@m, map("\tcd $_ && test -f $att{MAKEFILE} && \$(MAKE) install\n",@{$att{DIR}}));
1722 push(@m, "\t: perl5.000 and MM pre 3.8 autosplit into INST_ARCHLIB, we delete these old files here
1723 $att{RM_F} $Config{'installarchlib'}/auto/\$(FULLEXT)/*.al
1724 $att{RM_F} $Config{'installarchlib'}/auto/\$(FULLEXT)/*.ix
1725 \$(MAKE) INST_LIB=$Config{'installprivlib'} INST_ARCHLIB=$Config{'installarchlib'} INST_EXE=$Config{'installbin'}
1732 '# Phony target to force checking subdirectories.
1741 PERL_HDRS = $(PERL_INC)/EXTERN.h $(PERL_INC)/INTERN.h \
1742 $(PERL_INC)/XSUB.h $(PERL_INC)/av.h $(PERL_INC)/cop.h \
1743 $(PERL_INC)/cv.h $(PERL_INC)/dosish.h $(PERL_INC)/embed.h \
1744 $(PERL_INC)/form.h $(PERL_INC)/gv.h $(PERL_INC)/handy.h \
1745 $(PERL_INC)/hv.h $(PERL_INC)/keywords.h $(PERL_INC)/mg.h \
1746 $(PERL_INC)/op.h $(PERL_INC)/opcode.h $(PERL_INC)/patchlevel.h \
1747 $(PERL_INC)/perl.h $(PERL_INC)/perly.h $(PERL_INC)/pp.h \
1748 $(PERL_INC)/proto.h $(PERL_INC)/regcomp.h $(PERL_INC)/regexp.h \
1749 $(PERL_INC)/scope.h $(PERL_INC)/sv.h $(PERL_INC)/unixish.h \
1750 $(PERL_INC)/util.h $(PERL_INC)/config.h
1752 $(OBJECT) : $(PERL_HDRS)
1756 # Check for unpropogated config.sh changes. Should never happen.
1757 # We do NOT just update config.h because that is not sufficient.
1758 # An out of date config.h is not fatal but complains loudly!
1759 $(PERL_INC)/config.h: $(PERL_SRC)/config.sh
1760 -@echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
1762 $(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
1763 @echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
1764 cd $(PERL_SRC); $(MAKE) lib/Config.pm
1765 ') if $att{PERL_SRC};
1767 push(@m, join(" ", values %{$att{XS}})." : \$(XSUBPPDEPS)\n")
1774 # We do not know what target was originally specified so we
1775 # must force a manual rerun to be sure. But as it should only
1776 # happen very rarely it is not a significant problem.
1778 $(OBJECT) : '.$att{MAKEFILE}.'
1780 # We take a very conservative approach here, but it\'s worth it.
1781 # We move Makefile to Makefile.old here to avoid gnu make looping.
1782 '.$att{MAKEFILE}.': Makefile.PL $(CONFIGDEP)
1783 @echo "Makefile out-of-date with respect to $?"
1784 @echo "Cleaning current config before rebuilding Makefile..."
1785 -@mv '."$att{MAKEFILE} $att{MAKEFILE}.old".'
1786 -$(MAKE) -f '.$att{MAKEFILE}.'.old clean >/dev/null 2>&1 || true
1787 $(PERL) $(I_PERL_LIBS) Makefile.PL
1788 @echo "Now you must rerun make."; false
1797 # --- Make-A-Perl section ---
1800 my($self, %attribs) = @_;
1802 my(%searchdirs)=($att{PERL_ARCHLIB} => 1, $att{INST_ARCHLIB} => 1);
1803 my(@searchdirs)=keys %searchdirs;
1804 # And as it's not yet built, we add the current extension
1805 my(@static)="$att{INST_ARCHLIB}/auto/$att{FULLEXT}/$att{BASEEXT}.a";
1806 my(@perlinc) = ($att{INST_ARCHLIB}, $att{INST_LIB}, $att{PERL_ARCHLIB}, $att{PERL_LIB});
1807 MY->makeaperl('MAKE' => $att{MAKEFILE},
1808 'DIRS' => \@searchdirs,
1810 'INCL' => \@perlinc,
1811 'TARGET' => $att{MAP_TARGET},
1813 'LIBPERL' => $att{LIBPERL_A}
1818 my($self, %attribs) = @_;
1819 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1820 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1822 my($cccmd, $linkcmd);
1824 # This emulates cflags to get the compiler invocation...
1825 $cccmd = MY->const_cccmd($libperl);
1826 $cccmd =~ s/^CCCMD\s*=\s*//;
1828 $cccmd =~ s/\s/ -I$att{PERL_INC} /;
1829 $cccmd .= " $Config{'cccdlflags'}" if ($Config{'d_shrplib'});
1831 # The front matter of the linkcommand...
1832 $linkcmd = join ' ', $Config{'cc'},
1833 grep($_, @Config{qw(large split ldflags ccdlflags)});
1834 $linkcmd =~ s/\s+/ /g;
1836 # Which *.a files could we make use of...
1838 File::Find::find(sub {
1839 return unless m/\.a$/;
1840 return if m/^libperl/;
1841 $static{fastcwd() . "/" . $_}++;
1842 }, grep( -d $_, @{$searchdirs || []}) );
1844 # We trust that what has been handed in as argument, will be buildable
1845 $static = [] unless $static;
1846 @static{@{$static}} = (1) x @{$static};
1848 $extra = [] unless $extra && ref $extra eq 'ARRAY';
1849 for (sort keys %static) {
1851 $_ = dirname($_) . "/extralibs.ld";
1852 push @$extra, "`cat $_`";
1855 grep(s/^/-I/, @$perlinc);
1857 $target = "perl" unless $target;
1858 $tmp = "." unless $tmp;
1861 # --- MakeMaker makeaperl section ---
1862 MAP_TARGET = $target
1863 FULLPERL = $att{'FULLPERL'}
1864 MAP_LINKCMD = $linkcmd
1865 MAP_PERLINC = @{$perlinc}
1867 join(" ", sort keys %static), "
1868 MAP_EXTRA = @{$extra}
1869 MAP_PRELIBS = $Config{'libs'} $Config{'cryptlib'}
1872 unless (-f $libperl || -f ($libperl = "$Config{'installarchlib'}/CORE/$libperl")){
1873 print STDOUT "Warning: $libperl not found";
1878 if (defined $att{PERL_SRC}) {
1879 $libperl = "$att{PERL_SRC}/libperl.a";
1880 } elsif ( -f ( $libperl = "$Config{'installarchlib'}/CORE/libperl.a" )) {
1882 print STDOUT "Warning: $libperl not found";
1887 MAP_LIBPERL = $libperl
1891 \$(MAP_TARGET): $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC)
1892 \$(MAP_LINKCMD) -o \$\@ $tmp/perlmain.o \$(MAP_LIBPERL) \$(MAP_STATIC) \$(MAP_EXTRA) \$(MAP_PRELIBS)
1893 @ echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
1894 @ echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
1895 @ echo 'To remove the intermediate files say'
1896 @ echo ' make -f $makefilename map_clean'
1898 $tmp/perlmain.o: $tmp/perlmain.c
1900 push @m, "\tcd $tmp && $cccmd perlmain.c\n";
1903 $tmp/perlmain.c: $makefilename}, q{
1905 @ $(FULLPERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
1906 writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
1910 # We write MAP_EXTRA outside the perl program to have it eval'd by the shell
1913 @ $(FULLPERL) -e 'use ExtUtils::MakeMaker; MM->writedoc("Perl binary", \\
1914 "$(MAP_TARGET)", "MAP_STATIC=$(MAP_STATIC)", \\
1915 "MAP_EXTRA=@ARGV", "MAP_LIBPERL=$(MAP_LIBPERL)")' -- $(MAP_EXTRA)
1919 inst_perl: pure_inst_perl doc_inst_perl
1921 pure_inst_perl: \$(MAP_TARGET)
1922 $att{CP} \$(MAP_TARGET) $Config{'installbin'}/\$(MAP_TARGET)
1924 realclean :: map_clean
1927 $att{RM_F} $tmp/perlmain.o $tmp/perlmain.c $makefilename
1933 # --- Determine libraries to use and how to use them ---
1936 my($self, $potential_libs)=@_;
1937 return ("", "", "") unless $potential_libs;
1938 print STDOUT "Potential libraries are '$potential_libs':" if $Verbose;
1940 my($so) = $Config{'so'};
1941 my($libs) = $Config{'libs'};
1943 # compute $extralibs, $bsloadlibs and $ldloadlibs from
1945 # this is a rewrite of Andy Dougherty's extliblist in perl
1946 # its home is in <distribution>/ext/util
1948 my(@searchpath); # from "-L/path" entries in $potential_libs
1949 my(@libpath) = split " ", $Config{'libpth'};
1950 my(@ldloadlibs, @bsloadlibs, @extralibs);
1951 my($fullname, $thislib, $thispth, @fullname);
1952 my($pwd) = fastcwd(); # from Cwd.pm
1955 foreach $thislib (split ' ', $potential_libs){
1957 # Handle possible linker path arguments.
1958 if ($thislib =~ s/^(-[LR])//){ # save path flag type
1960 unless (-d $thislib){
1961 print STDOUT "$ptype$thislib ignored, directory does not exist\n"
1965 if ($thislib !~ m|^/|) {
1966 print STDOUT "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
1967 $thislib = "$pwd/$thislib";
1969 push(@searchpath, $thislib);
1970 push(@extralibs, "$ptype$thislib");
1971 push(@ldloadlibs, "$ptype$thislib");
1975 # Handle possible library arguments.
1976 unless ($thislib =~ s/^-l//){
1977 print STDOUT "Unrecognized argument in LIBS ignored: '$thislib'\n";
1982 foreach $thispth (@searchpath, @libpath){
1984 # Try to find the full name of the library. We need this to
1985 # determine whether it's a dynamically-loadable library or not.
1986 # This tends to be subject to various os-specific quirks.
1987 # For gcc-2.6.2 on linux (March 1995), DLD can not load
1988 # .sa libraries, with the exception of libm.sa, so we
1989 # deliberately skip them.
1990 if (@fullname=<${thispth}/lib${thislib}.${so}.[0-9]*>){
1991 $fullname=$fullname[-1]; #ATTN: 10 looses against 9!
1992 } elsif (-f ($fullname="$thispth/lib$thislib.$so")
1993 && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
1994 } elsif (-f ($fullname="$thispth/lib${thislib}_s.a")
1995 && ($thislib .= "_s") ){ # we must explicitly ask for _s version
1996 } elsif (-f ($fullname="$thispth/lib$thislib.a")){
1997 } elsif (-f ($fullname="$thispth/Slib$thislib.a")){
1999 print STDOUT "$thislib not found in $thispth" if $Verbose;
2002 print STDOUT "'-l$thislib' found at $fullname" if $Verbose;
2006 # Now update library lists
2008 # what do we know about this library...
2009 my $is_dyna = ($fullname !~ /\.a$/);
2010 my $in_perl = ($libs =~ /\B-l${thislib}\b/s);
2012 # Do not add it into the list if it is already linked in
2013 # with the main perl executable.
2014 # We have to special-case the NeXT, because all the math is also in libsys_s
2015 unless ( $in_perl || ($Config{'osname'} eq 'next' && $thislib eq 'm') ){
2016 push(@extralibs, "-l$thislib");
2020 # We might be able to load this archive file dynamically
2021 if ( $Config{'dlsrc'} =~ /dl_next|dl_dld/){
2022 # We push -l$thislib instead of $fullname because
2023 # it avoids hardwiring a fixed path into the .bs file.
2024 # mkbootstrap will automatically add dl_findfile() to
2025 # the .bs file if it sees a name in the -l format.
2026 # USE THIS, when dl_findfile() is fixed:
2027 # push(@bsloadlibs, "-l$thislib");
2028 # OLD USE WAS while checking results against old_extliblist
2029 push(@bsloadlibs, "$fullname");
2032 # For SunOS4, do not add in this shared library if
2033 # it is already linked in the main perl executable
2034 push(@ldloadlibs, "-l$thislib")
2035 unless ($in_perl and $Config{'osname'} eq 'sunos');
2037 push(@ldloadlibs, "-l$thislib");
2040 last; # found one here so don't bother looking further
2042 print STDOUT "Warning (non-fatal): No library found for -l$thislib" unless $found_lib>0;
2044 return ('','','') unless $found;
2045 ("@extralibs", "@bsloadlibs", "@ldloadlibs");
2049 # --- Write a DynaLoader bootstrap file if required
2053 =head1 USEFUL SUBROUTINES
2055 =head2 mkbootstrap()
2057 Make a bootstrap file for use by this system's DynaLoader. It
2058 typically gets called from an extension Makefile.
2060 There is no C<*.bs> file supplied with the extension. Instead a
2061 C<*_BS> file which has code for the special cases, like posix for
2062 berkeley db on the NeXT.
2064 This file will get parsed, and produce a maybe empty
2065 C<@DynaLoader::dl_resolve_using> array for the current architecture.
2066 That will be extended by $BSLOADLIBS, which was computed by Andy's
2067 extliblist script. If this array still is empty, we do nothing, else
2068 we write a .bs file with an C<@DynaLoader::dl_resolve_using> array, but
2069 without any C<if>s, because there is no longer a need to deal with
2072 The C<*_BS> file can put some code into the generated C<*.bs> file by placing
2073 it in C<$bscode>. This is a handy 'escape' mechanism that may prove
2074 useful in complex situations.
2076 If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
2077 mkbootstrap will automatically add a dl_findfile() call to the
2078 generated C<*.bs> file.
2082 my($self, @bsloadlibs)=@_;
2084 @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
2086 print STDOUT " bsloadlibs=@bsloadlibs\n" if $Verbose;
2088 # We need DynaLoader here because we and/or the *_BS file may
2089 # call dl_findfile(). We don't say `use' here because when
2090 # first building perl extensions the DynaLoader will not have
2091 # been built when MakeMaker gets first used.
2095 init_main() unless defined $att{'BASEEXT'};
2097 rename "$att{BASEEXT}.bs", "$att{BASEEXT}.bso";
2099 if (-f "$att{BASEEXT}_BS"){
2100 $_ = "$att{BASEEXT}_BS";
2101 package DynaLoader; # execute code as if in DynaLoader
2102 local($osname, $dlsrc) = (); # avoid warnings
2103 ($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
2110 if ($Config{'dlsrc'} =~ /^dl_dld/){
2112 push(@dl_resolve_using, dl_findfile('-lc'));
2115 my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
2118 open BS, ">$att{BASEEXT}.bs"
2119 or die "Unable to open $att{BASEEXT}.bs: $!";
2120 print STDOUT "Writing $att{BASEEXT}.bs\n";
2121 print STDOUT " containing: @all" if $Verbose;
2122 print BS "# $att{BASEEXT} DynaLoader bootstrap file for $Config{'osname'} architecture.\n";
2123 print BS "# Do not edit this file, changes will be lost.\n";
2124 print BS "# This file was automatically generated by the\n";
2125 print BS "# mkbootstrap routine in ExtUtils/MakeMaker.pm.\n";
2126 print BS "\@DynaLoader::dl_resolve_using = ";
2127 # If @all contains names in the form -lxxx or -Lxxx then it's asking for
2128 # runtime library location so we automatically add a call to dl_findfile()
2129 if (" @all" =~ m/ -[lLR]/){
2130 print BS " dl_findfile(qw(\n @all\n ));\n";
2132 print BS " qw(@all);\n";
2134 # write extra code if *_BS says so
2135 print BS $DynaLoader::bscode if $DynaLoader::bscode;
2144 # only AIX requires a symbol list at this point
2145 # (so does VMS, but that's handled by the MM_VMS package)
2146 return '' unless $Config{'osname'} eq 'aix';
2148 init_main(@ARGV) unless defined $att{'BASEEXT'};
2149 if (! $att{DL_FUNCS}) {
2151 ($bootfunc = $att{NAME}) =~ s/\W/_/g;
2152 $att{DL_FUNCS} = {$att{BASEEXT} => ["boot_$bootfunc"]};
2154 rename "$att{BASEEXT}.exp", "$att{BASEEXT}.exp_old";
2156 open(EXP,">$att{BASEEXT}.exp") or die $!;
2157 print EXP join("\n",@{$att{DL_VARS}}) if $att{DL_VARS};
2158 foreach $pkg (keys %{$att{DL_FUNCS}}) {
2159 (my($prefix) = $pkg) =~ s/\W/_/g;
2160 foreach $func (@{$att{DL_FUNCS}->{$pkg}}) {
2161 $func = "XS_${prefix}_$func" unless $func =~ /^boot_/;
2162 print EXP "$func\n";
2168 # --- Output postprocessing section ---
2169 #nicetext is included to make VMS support easier
2170 sub nicetext { # Just return the input - no action needed
2171 my($self,$text) = @_;
2175 # --- perllocal.pod section ---
2177 my($self,$what,$name,@attribs)=@_;
2178 -w $Config{'installarchlib'} or die "No write permission to $Config{'installarchlib'}";
2179 my($localpod) = "$Config{'installarchlib'}/perllocal.pod";
2182 print "Appending installation info to $localpod\n";
2183 open POD, ">>$localpod" or die "Couldn't open $localpod";
2185 print "Writing new file $localpod\n";
2186 open POD, ">$localpod" or die "Couldn't open $localpod";
2187 print POD "=head1 NAME
2189 perllocal - locally installed modules and perl binaries
2190 \n=head1 HISTORY OF LOCAL INSTALLATIONS
2195 chop($time = ctime(time));
2196 print POD "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
2197 print POD join "\n\n=item *\n\n", map("C<$_>",@attribs);
2198 print POD "\n\n=back\n\n";
2204 Andy Dougherty F<E<lt>doughera@lafcol.lafayette.eduE<gt>>, Andreas
2205 Koenig F<E<lt>k@franz.ww.TU-Berlin.DEE<gt>>, Tim Bunce
2206 F<E<lt>Tim.Bunce@ig.co.ukE<gt>>. VMS support by Charles Bailey
2207 F<E<lt>bailey@HMIVAX.HUMGEN.UPENN.EDUE<gt>>.
2209 =head1 MODIFICATION HISTORY
2211 v1, August 1994; by Andreas Koenig. Based on Andy Dougherty's Makefile.SH.
2212 v2, September 1994 by Tim Bunce.
2213 v3.0 October 1994 by Tim Bunce.
2214 v3.1 November 11th 1994 by Tim Bunce.
2215 v3.2 November 18th 1994 by Tim Bunce.
2216 v3.3 November 27th 1994 by Andreas Koenig.
2217 v3.4 December 7th 1994 by Andreas Koenig and Tim Bunce.
2218 v3.5 December 15th 1994 by Tim Bunce.
2219 v3.6 December 15th 1994 by Tim Bunce.
2220 v3.7 December 30th 1994 By Tim Bunce
2221 v3.8 January 17th 1995 By Andreas Koenig and Tim Bunce
2222 v3.9 January 19th 1995 By Tim Bunce
2223 v3.10 January 23rd 1995 By Tim Bunce
2224 v3.11 January 24th 1995 By Andreas Koenig
2225 v4.00 January 24th 1995 By Tim Bunce
2226 v4.01 January 25th 1995 By Tim Bunce
2227 v4.02 January 29th 1995 By Andreas Koenig
2228 v4.03 January 30th 1995 By Andreas Koenig
2229 v4.04 Februeary 5th 1995 By Andreas Koenig
2230 v4.05 February 8th 1995 By Andreas Koenig
2231 v4.06 February 10th 1995 By Andreas Koenig
2233 Cleaning up the new interface. Suggestion to freeze now until 5.001.
2235 v4.061 February 12th 1995 By Andreas Koenig
2237 Fixes of some my() declarations and of @extra computing in makeaperl().
2239 v4.08 - 4.085 February 14th-21st 1995 by Andreas Koenig
2241 Introduces EXE_FILES and INST_EXE for installing executable scripts
2242 and fixes documentation to reflect the new variable.
2244 Introduces the automated documentation of the installation history. Every
2248 add some documentation to the file C<$installarchlib/perllocal.pod>.
2249 This is done by the writedoc() routine in the MM_Unix class. The
2250 documentation is rudimentary until we find an agreement, what
2251 information is supposed to go into the pod.
2253 Added ability to specify the another name than C<perl> for a new binary.
2255 Both C<make perl> and C<makeaperl> now prompt the user, how to install
2256 the new binary after the build.
2258 Reduced noise during the make.
2260 Variable LIBPERL_A enables indirect setting of the switches -DEMBED,
2261 -DDEBUGGING and -DMULTIPLICITY in the same way as done by cflags.
2263 old_extliblist() code deleted, new_extliblist() renamed to extliblist().
2265 Improved algorithm in extliblist, that returns ('','','') if no
2266 library has been found, even if a -L directory has been found.
2268 Fixed a bug that didn't allow lib/ directory work as documented.
2270 Allowed C<make test TEST_VERBOSE=1>
2272 v4.086 March 9 1995 by Andy Dougherty
2274 Fixed some AIX buglets. Fixed DLD support for Linux with gcc 2.6.2.
2278 MakeMaker development work still to be done:
2280 Needs more complete documentation.
2282 Add a html: target when there has been found a general solution to
2283 installing html files.
2287 # the following keeps AutoSplit happy
2288 package ExtUtils::MakeMaker;