home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / languages / perl_5 / !Perl / Lib / ExtUtils / pm / MakeMaker next >
Encoding:
Text File  |  1995-03-12  |  71.0 KB  |  2,292 lines

  1. package ExtUtils::MakeMaker;
  2.  
  3. $Version = 4.086; # Last edited 9 Mar 1995 by Andy Dougherty
  4.  
  5. use Config;
  6. check_hints();
  7. use Carp;
  8. use Cwd;
  9.  
  10. require Exporter;
  11. @ISA = qw(Exporter);
  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);
  16.  
  17. $Is_VMS = $Config{'osname'} eq 'VMS';
  18. require ExtUtils::MM_VMS if $Is_VMS;
  19.  
  20. use strict qw(refs);
  21.  
  22. $Version = $Version;# avoid typo warning
  23. $Verbose = 0;
  24. $^W=1;
  25.  
  26.  
  27. =head1 NAME
  28.  
  29. ExtUtils::MakeMaker - create an extension Makefile
  30.  
  31. =head1 SYNOPSIS
  32.  
  33. C<use ExtUtils::MakeMaker;>
  34.  
  35. C<WriteMakefile( ATTRIBUTE =E<gt> VALUE [, ...] );>
  36.  
  37. =head1 DESCRIPTION
  38.  
  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.
  42.  
  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.
  46.  
  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
  56. those is used.
  57.  
  58. =head2 Default Makefile Behaviour
  59.  
  60. The automatically generated Makefile enables the user of the extension
  61. to invoke
  62.  
  63.   perl Makefile.PL
  64.   make
  65.   make test # optionally set TEST_VERBOSE=1
  66.   make install # See below
  67.  
  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
  71. done by specifying
  72.  
  73.   perl Makefile.PL INST_LIB=~/myperllib INST_EXE=~/bin
  74.  
  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.
  78.  
  79. Other interesting targets in the generated Makefile are
  80.  
  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
  85.  
  86. The macros in the produced Makefile may be overridden on the command
  87. line to the make call as in the following example:
  88.  
  89.   make INST_LIB=/some/where INST_ARCHLIB=/some/where INST_EXE=/u/k/bin
  90.  
  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.
  94.  
  95. The generated Makefile does not set any permissions. The installer has
  96. to decide, which umask should be in effect.
  97.  
  98. =head2 Special case C<make install>
  99.  
  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
  109. defaults.
  110.  
  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
  114. pure_install>.
  115.  
  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
  119. choice to either say
  120.  
  121.     # case: trust the module
  122.     perl Makefile.PL INST_LIB=~/perllib INST_EXE=~/bin
  123.     make
  124.     make test
  125.  
  126. or
  127.  
  128.     # case: want to run tests before installation
  129.     perl Makefile.PL
  130.     make
  131.     make test
  132.     make INST_LIB=/some/where INST_ARCHLIB=/foo/bar INST_EXE=/somebin
  133.  
  134. (C<make test> is not necessarily supported for all modules.)
  135.  
  136. =head2 Support to Link a new Perl Binary
  137.  
  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
  144.  
  145.     make perl
  146.  
  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
  149. PERL_ARCHLIB.
  150.  
  151. The binary can be installed into the directory where perl normally
  152. resides on your machine with
  153.  
  154.     make inst_perl
  155.  
  156. To produce a perl binary with a different name than C<perl>, either say
  157.  
  158.     perl Makefile.PL MAP_TARGET=myperl
  159.     make myperl
  160.     make inst_perl
  161.  
  162. or say
  163.  
  164.     perl Makefile.PL
  165.     make myperl MAP_TARGET=myperl
  166.     make inst_perl MAP_TARGET=myperl
  167.  
  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'}.
  171.  
  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.
  175.  
  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>.
  179.  
  180. Warning: the inst_perl: target is rather mighty and will probably
  181. overwrite your existing perl binary. Use with care!
  182.  
  183. =head2 Determination of Perl Library and Installation Locations
  184.  
  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*.*>).
  189.  
  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.
  192.  
  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:
  196.  
  197.   PERL_INC     = PERL_SRC
  198.   PERL_LIB     = PERL_SRC/lib
  199.   PERL_ARCHLIB = PERL_SRC/lib
  200.   INST_LIB     = PERL_LIB
  201.   INST_ARCHLIB = PERL_ARCHLIB
  202.  
  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:
  206.  
  207.   PERL_INC     = $archlib/CORE
  208.   PERL_LIB     = $privlib
  209.   PERL_ARCHLIB = $archlib
  210.   INST_LIB     = ./blib
  211.   INST_ARCHLIB = ./blib
  212.  
  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.
  215.  
  216. =head2 Useful Default Makefile Macros
  217.  
  218. FULLEXT = Pathname for extension directory (eg DBD/Oracle).
  219.  
  220. BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
  221.  
  222. ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD)
  223.  
  224. PERL_LIB = Directory where we read the perl library files
  225.  
  226. PERL_ARCHLIB = Same as above for architecture dependent files
  227.  
  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.
  231.  
  232. INST_ARCHLIB = Same as above for architecture dependent files
  233.  
  234. INST_LIBDIR = C<$(INST_LIB)$(ROOTEXT)>
  235.  
  236. INST_AUTODIR = C<$(INST_LIB)/auto/$(FULLEXT)>
  237.  
  238. INST_ARCHAUTODIR = C<$(INST_ARCHLIB)/auto/$(FULLEXT)>
  239.  
  240. =head2 Customizing The Generated Makefile
  241.  
  242. If the Makefile generated does not fit your purpose you can change it
  243. using the mechanisms described below.
  244.  
  245. =head2 Using Attributes (and Parameters)
  246.  
  247. The following attributes can be specified as arguments to WriteMakefile()
  248. or as NAME=VALUE pairs on the command line:
  249.  
  250. This description is not yet documented; you can get at the description
  251. with the command
  252.  
  253. C<perl Makefile.PL help>    (if you already have a basic Makefile.PL)
  254.  
  255. or
  256.  
  257. C<perl -e 'use ExtUtils::MakeMaker qw(&help); &help;'>
  258.  
  259. =head2 Overriding MakeMaker Methods
  260.  
  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
  265. either say:
  266.  
  267.     sub MY::c_o { "new literal text" }
  268.  
  269. or you can edit the default by saying something like:
  270.  
  271.     sub MY::c_o { $_=MM->c_o; s/old text/new text/; $_ }
  272.  
  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.
  276.  
  277. =cut
  278.  
  279. sub check_hints {
  280.     # We allow extension-specific hints files. If we find one we act as if Config.pm
  281.     # had read the contents
  282.  
  283.     # First we look for the best hintsfile we have
  284.     my(@goodhints);
  285.     my($hint)="$Config{'osname'}_$Config{'osvers'}";
  286.     $hint =~ s/\./_/g;
  287.     $hint =~ s/_$//;
  288.     opendir DIR, "hints";
  289.     while (defined ($_ = readdir DIR)) {
  290.     next if /^\./;
  291.     next unless s/\.pl$//;
  292.     next unless /^$Config{'osname'}/;
  293.     # Don't trust a hintfile for a later OS version:
  294.     next if $_ gt $hint;
  295.     push @goodhints, $_;
  296.     if ($_ eq $hint){
  297.         @goodhints=$_;
  298.         last;
  299.     }
  300.     }
  301.     closedir DIR;
  302.     return unless @goodhints; # There was no hintsfile
  303.     # the last one in lexical ordering is our choice:
  304.     $hint=(reverse sort @goodhints)[0];
  305.  
  306.     # execute the hintsfile:
  307.     open HINTS, "hints/$hint.pl";
  308.     @goodhints = <HINTS>;
  309.     close HINTS;
  310.     eval join('',@goodhints);
  311. }
  312.  
  313. # Setup dummy package:
  314. # MY exists for overriding methods to be defined within
  315. unshift(@MY::ISA, qw(MM));
  316.  
  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
  321. # it's running.
  322. unshift(@MM::ISA, $Is_VMS ? qw(ExtUtils::MM_VMS MM_Unix) : qw(MM_Unix));
  323.  
  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.
  328.  
  329.  DISTNAME:    Your name for distributing the package (by tar file)
  330.         This defaults to NAME above.
  331.  
  332.  VERSION:    Your version number for distributing the package.
  333.         This defaults to 0.1.
  334.  
  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)
  338.  
  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)
  342.  
  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)
  350.  
  351.  LIBS:        An anonymous array of alternative library specifications
  352.         to be searched for (in order) until at least one library
  353.         is found.
  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.
  362.  
  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)
  366.  
  367.  DIR:        Ref to array of subdirectories containing Makefile.PLs
  368.         e.g. [ 'sdbm' ] in ext/SDBM_File
  369.  
  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.
  376.  
  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.
  383.  
  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.
  388.  
  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.
  392.  
  393.  H:        Ref to array of *.h file names. Similar to C: above.
  394.  
  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 
  397.         by a make realclean.
  398.  
  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'}.
  402.  
  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).
  405.  
  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'] } )
  415.  
  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 ) ])
  420.  
  421.  CONFIG:    =>[qw(archname manext)] defines ARCHNAME & MANEXT from config.sh
  422.  SKIP:      =>[qw(name1 name2)] skip (do not write) sections of the Makefile
  423.  
  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>
  426.  
  427.  LIBPERL_A:     The filename of the perllibrary that will be used together
  428.         with this extension. Defaults to C<libperl.a>.
  429.  
  430.  PERL:
  431.  FULLPERL:
  432.  
  433. Additional lowercase attributes can be used to pass parameters to the
  434. methods which implement that part of the Makefile. These are not
  435. normally required:
  436.  
  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}
  444. END
  445.  
  446. sub help {print $Attrib_Help;}
  447.  
  448. @MM_Sections_spec = (
  449.     'post_initialize'    => {},
  450.     'const_config'    => {},
  451.     'constants'        => {},
  452.     'const_loadlibs'    => {},
  453.     'const_cccmd'    => {},
  454.     'tool_autosplit'    => {},
  455.     'tool_xsubpp'    => {},
  456.     'tools_other'    => {},
  457.     'post_constants'    => {},
  458.     'c_o'        => {},
  459.     'xs_c'        => {},
  460.     'xs_o'        => {},
  461.     'top_targets'    => {},
  462.     'linkext'        => {},
  463.     'dlsyms'        => {},
  464.     'dynamic'        => {},
  465.     'dynamic_bs'    => {},
  466.     'dynamic_lib'    => {},
  467.     'static'        => {},
  468.     'static_lib'    => {},
  469.     'installpm'        => {},
  470.     'installbin'    => {},
  471.     'subdirs'        => {},
  472.     'clean'        => {},
  473.     'realclean'        => {},
  474.     'distclean'        => {},
  475.     'test'        => {},
  476.     'install'        => {},
  477.     'force'        => {},
  478.     'perldepend'    => {},
  479.     'makefile'        => {},
  480.     'postamble'        => {},
  481.     'staticmake'    => {},
  482. );
  483. %MM_Sections = @MM_Sections_spec; # looses section ordering
  484. @MM_Sections = grep(!ref, @MM_Sections_spec); # keeps order
  485.  
  486. %Recognized_Att_Keys = %MM_Sections; # All sections are valid keys.
  487. foreach(split(/\n/,$Attrib_Help)){
  488.     chomp;
  489.     next unless m/^\s*(\w+):\s*(.*)/;
  490.     $Recognized_Att_Keys{$1} = $2;
  491.     print "Attribute '$1' => '$2'\n" if ($Verbose >= 2);
  492. }
  493.  
  494. %att  = ();
  495. %skip = ();
  496.  
  497. sub skipcheck{
  498.     my($section) = @_;
  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;
  506.     }
  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;
  511.     }
  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;
  516.     }
  517.     return 'skipped' if $skip{$section};
  518.     return '';
  519. }
  520.  
  521.  
  522. sub WriteMakefile {
  523.     %att = @_;
  524.     local($\)="\n";
  525.  
  526.     print STDOUT "MakeMaker" if $Verbose;
  527.  
  528.     parse_args(\%att, @ARGV);
  529.     my(%initial_att) = %att; # record initial attributes
  530.  
  531.     MY->init_main();
  532.  
  533.     print STDOUT "Writing Makefile for $att{NAME}";
  534.  
  535.     MY->init_dirscan();
  536.     MY->init_others();
  537.  
  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;
  541.  
  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});
  549.     $v =~ tr/\n/ /s;
  550.     print MAKE "#    $key => $v";
  551.     }
  552.  
  553.     # build hash for SKIP to make testing easy
  554.     %skip = map( ($_,1), @{$att{'SKIP'} || []});
  555.  
  556.     foreach $section ( @MM_Sections ){
  557.     print "Processing Makefile '$section' section" if ($Verbose >= 2);
  558.     my($skipit) = skipcheck($section);
  559.     if ($skipit){
  560.         print MAKE "\n# --- MakeMaker $section section $skipit.";
  561.     } else {
  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 )));
  566.     }
  567.     }
  568.  
  569.     if ($Verbose){
  570.     print MAKE "\n# Full list of MakeMaker attribute values:";
  571.     foreach $key (sort keys %att){
  572.         my($v) = neatvalue($att{$key});
  573.         $v =~ tr/\n/ /s;
  574.         print MAKE "#    $key => $v";
  575.     }
  576.     }
  577.  
  578.     print MAKE "\n# End.";
  579.     close MAKE;
  580.     my($finalname) = $Is_VMS ? "Descrip.MMS" : "Makefile";
  581.     rename("MakeMaker.tmp", $finalname);
  582.  
  583.     chmod 0644, $finalname;
  584.     system("$Config{'eunicefix'} $finalname") unless $Config{'eunicefix'} eq ":";
  585.  
  586.     1;
  587. }
  588.  
  589.  
  590. sub mkbootstrap{
  591.     parse_args(\%att, @ARGV);
  592.     MY->mkbootstrap(@_);
  593. }
  594.  
  595. sub mksymlists{
  596.     %att = @_;
  597.     parse_args(\%att, @ARGV);
  598.     MY->mksymlists(@_);
  599. }
  600.  
  601. sub parse_args{
  602.     my($attr, @args) = @_;
  603.     foreach (@args){
  604.     unless (m/(.*?)=(.*)/){
  605.         help(),exit 1 if m/^help$/;
  606.         ++$Verbose if m/^verb/;
  607.         next;
  608.     }
  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/;
  613.     }
  614.     $$attr{$name} = $value;
  615.     }
  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";
  621.     } else {
  622.         print STDOUT "$msg deleted.\n";
  623.     }
  624.     $$attr{LIBS} = [$$attr{'potential_libs'}];
  625.     delete $$attr{'potential_libs'};
  626.     }
  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'};
  635.     }
  636.     if (defined $$attr{'LDTARGET'}){
  637.     print STDOUT "LDTARGET should be changed to LDFROM\n";
  638.     $$attr{'LDFROM'} = $$attr{'LDTARGET'};
  639.     delete $$attr{'LDTARGET'};
  640.     }
  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{$_};
  645.     }
  646. }
  647.  
  648.  
  649. sub neatvalue{
  650.     my($v) = @_;
  651.     return "undef" unless defined $v;
  652.     my($t) = ref $v;
  653.     return "'$v'" unless $t;
  654.     return "[ ".join(', ',map("'$_'",@$v))." ]" if ($t eq 'ARRAY');
  655.     return "$v" unless $t eq 'HASH';
  656.     my(@m, $key, $val);
  657.     push(@m,"$key=>".neatvalue($val)) while (($key,$val) = each %$v);
  658.     return "{ ".join(', ',@m)." }";
  659. }
  660.  
  661.  
  662. # ------ Define the MakeMaker default methods in package MM_Unix ------
  663.  
  664. package MM_Unix;
  665.  
  666. use Config;
  667. use Cwd;
  668. use File::Basename;
  669. require Exporter;
  670.  
  671. Exporter::import('ExtUtils::MakeMaker',
  672.     qw(%att %skip %Recognized_Att_Keys $Verbose));
  673.  
  674. # These attributes cannot be overridden externally
  675. @Other_Att_Keys{qw(EXTRALIBS BSLOADLIBS LDLOADLIBS)} = (1) x 3;
  676.  
  677. if ($Is_VMS = $Config{'osname'} eq 'VMS') {
  678.     require VMS::Filespec;
  679.     import VMS::Filespec 'vmsify';
  680. }
  681.  
  682.  
  683. sub init_main {
  684.     # Find out directory name.  This may contain the extension name.
  685.     my($pwd) = fastcwd(); # from Cwd.pm
  686.  
  687.     # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
  688.  
  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'});
  692.  
  693.     # Typically PERL_* and INST_* will be identical but that need
  694.     # not be the case (e.g., installing into project libraries etc).
  695.  
  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)
  700.  
  701.     # INST Macro:    Locally        Publically
  702.     # INST_LIB       ../../lib      ./blib
  703.     # INST_ARCHLIB   ../../lib      ./blib
  704.  
  705.     unless ($att{PERL_SRC}){
  706.     foreach(qw(../.. ../../.. ../../../..)){
  707.         ($att{PERL_SRC}=$_, last) if -f "$_/config.sh";
  708.     }
  709.     }
  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;
  718.     } else {
  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};
  722.     }
  723.  
  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};
  730.     } else {
  731.         $att{INST_LIB} = "$pwd/blib";
  732.     }
  733.     }
  734.     # Try to work out what INST_ARCHLIB should be if not set:
  735.     unless ($att{INST_ARCHLIB}){
  736.     my(%archmap) = (
  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,
  742.     );
  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";
  750.         } else {
  751.         $att{INST_ARCHLIB} = $att{INST_LIB};
  752.         print STDOUT "Warning: Defaulting INST_ARCHLIB to INST_LIB ",
  753.             "(not architecture independent).\n";
  754.         }
  755.     }
  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};
  760.     }
  761.  
  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");
  765.  
  766.     # --- Initialize Module Name and Paths
  767.  
  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
  773.     my($name) = $pwd;
  774.     if ($Is_VMS) {
  775.       $name =~ s:.*?([^.\]]+)\]:$1: unless ($name =~ s:.*[.\[]ext\.(.*)\]:$1:i);
  776.       ($att{NAME}=$name) =~ s#[.\]]#::#g;
  777.     } else {
  778.       $name =~ s:.*/:: unless ($name =~ s:^.*/ext/::);
  779.       ($att{NAME} =$name) =~ s#/#::#g;
  780.     }
  781.     }
  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};
  786.  
  787.     ($att{DISTNAME}=$att{NAME}) =~ s#(::)#-#g unless $att{DISTNAME};
  788.     $att{VERSION} = "0.1" unless $att{VERSION};
  789.  
  790.  
  791.     # --- Initialize Perl Binary Locations
  792.  
  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'});
  799.  
  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'});
  803.  
  804.     if ($Is_VMS) {
  805.     $att{'PERL'} = 'MCR ' . vmsify($att{'PERL'});
  806.     $att{'FULLPERL'} = 'MCR ' . vmsify($att{'FULLPERL'});
  807.     }
  808. }
  809.  
  810.  
  811. sub init_dirscan {    # --- File and Directory Lists (.xs .pm etc)
  812.  
  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});
  819.     if (-d $name){
  820.         $dir{$name} = $name if (-f "$name/Makefile.PL");
  821.     } elsif ($name =~ /\.xs$/){
  822.         my($c); ($c = $name) =~ s/\.xs$/.c/;
  823.         $xs{$name} = $c;
  824.         $c{$c} = 1;
  825.     } elsif ($name =~ /\.c$/){
  826.         $c{$name} = 1;
  827.     } elsif ($name =~ /\.h$/){
  828.         $h{$name} = 1;
  829.     } elsif ($name =~ /\.p[ml]$/){
  830.         $pm{$name} = "\$(INST_LIBDIR)/$name";
  831.     }
  832.     }
  833.  
  834.     # Some larger extensions often wish to install a number of *.pm/pl
  835.     # files into the library in various locations.
  836.  
  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).
  842.  
  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.
  848.  
  849.     # The default installation location passed to libscan in $_ is:
  850.     #
  851.     #  ./*.pm        => $(INST_LIBDIR)/*.pm
  852.     #  ./xyz/...    => $(INST_LIBDIR)/xyz/...
  853.     #  ./lib/...    => $(INST_LIB)/...
  854.     #
  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.
  859.  
  860.     $att{PMLIBDIRS} = [ 'lib', $att{BASEEXT} ] unless $att{PMLIBDIRS};
  861.  
  862.     #only existing directories that aren't in $dir are allowed
  863.     @{$att{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$att{PMLIBDIRS}};
  864.  
  865.     if (@{$att{PMLIBDIRS}}){
  866.     print "Searching PMLIBDIRS: @{$att{PMLIBDIRS}}"
  867.         if ($Verbose >= 2);
  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)');
  875.         my $striplibpath;
  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);
  880.         return unless $inst;
  881.         $pm{$path} = $inst;
  882.          }, @{$att{PMLIBDIRS}});
  883.     }
  884.  
  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};
  893. }
  894.  
  895.  
  896. sub libscan {
  897.     return undef if m:/RCS/: ;
  898.     $_;
  899. }
  900.  
  901. sub init_others {    # --- Initialize Other Attributes
  902.  
  903.     for $key (keys(%Recognized_Att_Keys), keys(%Other_Att_Keys)){
  904.     # avoid warnings for uninitialized vars
  905.     next if exists $att{$key};
  906.     $att{$key} = "";
  907.     }
  908.  
  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;
  919.         last;
  920.     }
  921.     }
  922.  
  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
  929.     ));
  930.     push(@{$att{CONFIG}}, 'shellflags') if $Config{'shellflags'};
  931.  
  932.     if ($Is_VMS) {
  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,#;
  937.     } else {
  938.       $att{OBJECT} = '$(BASEEXT).o' unless $att{OBJECT};
  939.       $att{OBJECT} =~ s/\n+/ \\\n\t/g;
  940.     }
  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} || []})
  950.                         ? 'static'
  951.                         : ($Config{'usedl'} ? 'dynamic' : 'static');
  952.     };
  953.  
  954.     # These get overridden for VMS and maybe some other systems
  955.     $att{NOOP}  = "";
  956.     $att{MAKEFILE} = "Makefile";
  957.     $att{RM_F}  = "rm -f";
  958.     $att{RM_RF} = "rm -rf";
  959.     $att{TOUCH} = "touch";
  960.     $att{CP} = "cp";
  961.     $att{MV} = "mv";
  962. }
  963.  
  964.  
  965. sub lsdir{
  966.     my($dir, $regex) = @_;
  967.     local(*DIR, @ls);
  968.     opendir(DIR, $_[0] || ".") or die "opendir: $!";
  969.     @ls = readdir(DIR);
  970.     closedir(DIR);
  971.     @ls = grep(/$regex/, @ls) if $regex;
  972.     @ls;
  973. }
  974.  
  975.  
  976. sub find_perl{
  977.     my($self, $ver, $names, $dirs, $trace) = @_;
  978.     my($name, $dir);
  979.     if ($trace){
  980.     print "Looking for perl $ver by these names: ";
  981.     print "@$names, ";
  982.     print "in these dirs:";
  983.     print "@$dirs";
  984.     }
  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);
  989.         if ($Is_VMS) {
  990.           $name .= ".exe" unless -x "$dir/$name";
  991.         }
  992.         next unless -x "$dir/$name";
  993.         print "Executing $dir/$name" if ($trace);
  994.         my($out);
  995.         if ($Is_VMS) {
  996.           my($vmscmd) = 'MCR ' . vmsify("$dir/$name");
  997.           $out = `$vmscmd -e "require $ver; print ""VER_OK\n"""`;
  998.         } else {
  999.           $out = `$dir/$name -e 'require $ver; print "VER_OK\n" ' 2>&1`;
  1000.         }
  1001.         return "$dir/$name" if $out =~ /VER_OK/;
  1002.     }
  1003.     }
  1004.     print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
  1005.     0; # false and not empty
  1006. }
  1007.  
  1008.  
  1009. sub post_initialize{
  1010.     "";
  1011. }
  1012.  
  1013.  
  1014. sub constants {
  1015.     my(@m);
  1016.  
  1017.     push @m, "
  1018. NAME = $att{NAME}
  1019. DISTNAME = $att{DISTNAME}
  1020. VERSION = $att{VERSION}
  1021.  
  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}
  1028.  
  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}
  1033. ";
  1034.  
  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});
  1040.     if ($Is_VMS){
  1041.     push @m, "I_PERL_LIBS = \"".join('" "',@i_perl_libs)."\"\n";
  1042.     } else {
  1043.     push @m, "I_PERL_LIBS = ".join(' ',@i_perl_libs)."\n";
  1044.     }
  1045.  
  1046.     push @m, "
  1047. # Where is the perl source code located?
  1048. PERL_SRC = $att{PERL_SRC}\n" if $att{PERL_SRC};
  1049.  
  1050.     push @m, "
  1051. # Perl header files (will eventually be under PERL_LIB)
  1052. PERL_INC = $att{PERL_INC}
  1053. # Perl binaries
  1054. PERL = $att{'PERL'}
  1055. FULLPERL = $att{'FULLPERL'}
  1056. ";
  1057.     push @m, "
  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}
  1064. ";
  1065.     push @m, "
  1066. INC = $att{INC}
  1067. DEFINE = $att{DEFINE}
  1068. OBJECT = $att{OBJECT}
  1069. LDFROM = $att{LDFROM}
  1070. LINKTYPE = $att{LINKTYPE}
  1071.  
  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}})."
  1077.  
  1078. .SUFFIXES: .xs
  1079.  
  1080. .PRECIOUS: Makefile
  1081.  
  1082. .PHONY: all config static dynamic test linkext
  1083.  
  1084. # This extension may link to it's own library (see SDBM_File)
  1085. MYEXTLIB = $att{MYEXTLIB}
  1086.  
  1087. # Where is the Config information that we are using/depend on
  1088. CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
  1089. ";
  1090.  
  1091.     push @m, '
  1092. # Where to put things:
  1093. INST_LIBDIR     = $(INST_LIB)$(ROOTEXT)
  1094. INST_ARCHLIBDIR = $(INST_ARCHLIB)$(ROOTEXT)
  1095.  
  1096. INST_AUTODIR      = $(INST_LIB)/auto/$(FULLEXT)
  1097. INST_ARCHAUTODIR  = $(INST_ARCHLIB)/auto/$(FULLEXT)
  1098. ';
  1099.  
  1100.     push @m, '
  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}}).'
  1105. ';
  1106.  
  1107.     join('',@m);
  1108. }
  1109.  
  1110.  
  1111. sub const_cccmd{
  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);
  1120.  
  1121.     chop($old = `cd $att{PERL_SRC}; sh $shflags ./cflags $libperl $att{BASEEXT}.c 2>/dev/null`)
  1122.     if $att{PERL_SRC};
  1123.  
  1124.     my(%map) =  (
  1125.         D =>   '-DDEBUGGING',
  1126.         E =>   '-DEMBED',
  1127.         DE =>  '-DDEBUGGING -DEMBED',
  1128.         M =>   '-DEMBED -DMULTIPLICITY',
  1129.         DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
  1130.         );
  1131.  
  1132.     if ($libperl =~ /libperl(\w*)\.a/){
  1133.     $uc = uc($1);
  1134.     } else {
  1135.     $uc = ""; # avoid warning
  1136.     }
  1137.     $perltype = $map{$uc} ? $map{$uc} : "";
  1138.  
  1139.     if ($uc =~ /^D/) {
  1140.     $optdebug = "-g";
  1141.     }
  1142.  
  1143.  
  1144.     my($name);
  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;
  1149.     my(@o)=`cc=\"$cc\"
  1150.       ccflags=\"$ccflags\"
  1151.       optimize=\"$optimize\"
  1152.       perltype=\"$perltype\"
  1153.       optdebug=\"$optdebug\"
  1154.       large=\"$large\"
  1155.       split=\"$split\"
  1156.       eval '$prog'
  1157.       echo cc=\$cc
  1158.       echo ccflags=\$ccflags
  1159.       echo optimize=\$optimize
  1160.       echo perltype=\$perltype
  1161.       echo optdebug=\$optdebug
  1162.       echo large=\$large
  1163.       echo split=\$split
  1164.       `;
  1165.     my(%cflags);
  1166.     foreach $line (@o){
  1167.         chomp $line;
  1168.         if ($line =~ /(.*?)=\s*(.*)\s*$/){
  1169.         $cflags{$1} = $2;
  1170.         print STDOUT "    $1 = $2" if $Verbose;
  1171.         } else {
  1172.         print STDOUT "Unrecognised result from hint: '$line'\n";
  1173.         }
  1174.     }
  1175.     (    $cc,$ccflags,$perltype,$optdebug,$optimize,$large,$split )=@cflags{
  1176.           qw( cc  ccflags  perltype  optdebug  optimize  large  split)};
  1177.     }
  1178.  
  1179.     if ($optdebug) {
  1180.     $optimize = $optdebug;
  1181.     }
  1182.  
  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"
  1187.     ."   old: $old\n"
  1188.     ."   new: $new\n"
  1189.     ."   Using 'old' set.\n"
  1190.     ."Please notify perl5-porters\@nicoh.com\n";
  1191.     }
  1192.     my($cccmd)=($old) ? $old : $new;
  1193.     "CCCMD = $cccmd\n";
  1194. }
  1195.  
  1196.  
  1197. # --- Constants Sections ---
  1198.  
  1199. sub const_config{
  1200.     my(@m,$m);
  1201.     push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
  1202.     my(%once_only);
  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";
  1208.     $once_only{$m} = 1;
  1209.     }
  1210.     join('', @m);
  1211. }
  1212.  
  1213.  
  1214. sub const_loadlibs{
  1215.     "
  1216. # $att{NAME} might depend on some other libraries:
  1217. # (These comments may need revising:)
  1218. #
  1219. # Dependent libraries can be linked in one of three ways:
  1220. #
  1221. #  1.  (For static extensions) by the ld command when the perl binary
  1222. #      is linked with the extension library. See EXTRALIBS below.
  1223. #
  1224. #  2.  (For dynamic extensions) by the ld command when the shared
  1225. #      object is built/linked. See LDLOADLIBS below.
  1226. #
  1227. #  3.  (For dynamic extensions) by the DynaLoader when the shared
  1228. #      object is loaded. See BSLOADLIBS below.
  1229. #
  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.
  1234. #
  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.
  1238. #
  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.
  1244. #
  1245. EXTRALIBS  = $att{'EXTRALIBS'}
  1246. LDLOADLIBS = $att{'LDLOADLIBS'}
  1247. BSLOADLIBS = $att{'BSLOADLIBS'}
  1248. ";
  1249. }
  1250.  
  1251.  
  1252. # --- Tool Sections ---
  1253.  
  1254. sub tool_autosplit{
  1255.     my($self, %attribs) = @_;
  1256.     my($asl) = "";
  1257.     $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
  1258.     q{
  1259. # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
  1260. AUTOSPLITFILE = $(PERL) $(I_PERL_LIBS) -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
  1261. };
  1262. }
  1263.  
  1264.  
  1265. sub tool_xsubpp{
  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);
  1272.     "
  1273. XSUBPPDIR = $xsdir
  1274. XSUBPP = \$(XSUBPPDIR)/xsubpp
  1275. XSUBPPDEPS = @tmdeps
  1276. XSUBPPARGS = @tmargs
  1277. ";
  1278. };
  1279.  
  1280.  
  1281. sub tools_other{
  1282.     "
  1283. SHELL = /bin/sh
  1284. LD = $att{LD}
  1285. TOUCH = $att{TOUCH}
  1286. CP = $att{CP}
  1287. MV = $att{MV}
  1288. RM_F  = $att{RM_F}
  1289. RM_RF = $att{RM_RF}
  1290. ".q{
  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;'
  1293. };
  1294. }
  1295.  
  1296.  
  1297. sub post_constants{
  1298.     "";
  1299. }
  1300.  
  1301.  
  1302. # --- Translation Sections ---
  1303.  
  1304. sub c_o {
  1305.     my(@m);
  1306.     push @m, '
  1307. .c.o:
  1308.     $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $(INC) $*.c
  1309. ';
  1310.     join "", @m;
  1311. }
  1312.  
  1313. sub xs_c {
  1314.     '
  1315. .xs.c:
  1316.     $(PERL) $(XSUBPP) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
  1317. ';
  1318. }
  1319.  
  1320. sub xs_o {    # many makes are too dumb to use xs_c then c_o
  1321.     '
  1322. .xs.o:
  1323.     $(PERL) $(XSUBPP) $(XSUBPPARGS) $*.xs >xstmp.c && mv xstmp.c $*.c
  1324.     $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $(INC) $*.c
  1325. ';
  1326. }
  1327.  
  1328.  
  1329. # --- Target Sections ---
  1330.  
  1331. sub top_targets{
  1332.     my(@m);
  1333.     push @m, '
  1334. all ::    config linkext $(INST_PM)
  1335. '.$att{NOOP}.'
  1336.  
  1337. config :: '.$att{MAKEFILE}.'
  1338.     @ $(MKPATH) $(INST_LIBDIR) $(INST_ARCHAUTODIR)
  1339. ';
  1340.  
  1341.     push @m, '
  1342. $(O_FILES): $(H_FILES)
  1343. ' if @{$att{O_FILES} || []} && @{$att{H} || []};
  1344.     join('',@m);
  1345. }
  1346.  
  1347. sub linkext {
  1348.     my($self, %attribs) = @_;
  1349.     # LINKTYPE => static or dynamic
  1350.     my($linktype) = $attribs{LINKTYPE} || '$(LINKTYPE)';
  1351.     "
  1352. linkext :: $linktype
  1353. $att{NOOP}
  1354. ";
  1355. }
  1356.  
  1357. sub dlsyms {
  1358.     my($self,%attribs) = @_;
  1359.  
  1360.     return '' if ($Config{'osname'} ne 'aix');
  1361.  
  1362.     my($funcs) = $attribs{DL_FUNCS} || $att{DL_FUNCS} || {};
  1363.     my($vars)  = $attribs{DL_VARS} || $att{DL_VARS} || [];
  1364.     my(@m);
  1365.  
  1366.     push(@m,"
  1367. dynamic :: $att{BASEEXT}.exp
  1368.  
  1369. ") unless $skip{'dynamic'};
  1370.  
  1371.     push(@m,"
  1372. static :: $att{BASEEXT}.exp
  1373.  
  1374. ") unless $skip{'static'};
  1375.  
  1376.     push(@m,"
  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}\")'
  1382. ");
  1383.  
  1384.     join('',@m);
  1385. }
  1386.  
  1387. # --- Dynamic Loading Sections ---
  1388.  
  1389. sub dynamic {
  1390.     '
  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)
  1394. '.$att{NOOP}.'
  1395. ';
  1396. }
  1397.  
  1398. sub dynamic_bs {
  1399.     my($self, %attribs) = @_;
  1400.     '
  1401. BOOTSTRAP = '."$att{BASEEXT}.bs".'
  1402.  
  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)
  1412.  
  1413. $(INST_BOOT): $(BOOTSTRAP)
  1414.     @ '.$att{RM_RF}.' $(INST_BOOT)
  1415.     -'.$att{CP}.' $(BOOTSTRAP) $(INST_BOOT)
  1416. ';
  1417. }
  1418.  
  1419.  
  1420. sub dynamic_lib {
  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 ':');
  1427.     my(@m);
  1428.     push(@m,'
  1429. # This section creates the dynamically loadable $(INST_DYNAMIC)
  1430. # from $(OBJECT) and possibly $(MYEXTLIB).
  1431. ARMAYBE = '.$armaybe.'
  1432. OTHERLDFLAGS = '.$otherldflags.'
  1433.  
  1434. $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
  1435.     @ $(MKPATH) $(INST_ARCHAUTODIR)
  1436. ');
  1437.     if ($armaybe ne ':'){
  1438.     $ldfrom = "tmp.a";
  1439.     push(@m,'    $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
  1440.     push(@m,'    $(RANLIB) '."$ldfrom\n");
  1441.     }
  1442.     $ldfrom = "-all $ldfrom -none" if ($osname eq 'dec_osf');
  1443.     push(@m,'    $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
  1444.             ' $(OTHERLDFLAGS) $(MYEXTLIB) $(LDLOADLIBS)'."\n");
  1445.     join('',@m);
  1446. }
  1447.  
  1448.  
  1449. # --- Static Loading Sections ---
  1450.  
  1451. sub static {
  1452.     '
  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)
  1456. '.$att{NOOP}.'
  1457. ';
  1458. }
  1459.  
  1460. sub static_lib{
  1461.     my(@m);
  1462.     push(@m, <<'END');
  1463. $(INST_STATIC): $(OBJECT) $(MYEXTLIB)
  1464.     @ $(MKPATH) $(INST_ARCHAUTODIR)
  1465. END
  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};
  1469.  
  1470.     push(@m, <<'END');
  1471.     ar cr $@ $(OBJECT) && $(RANLIB) $@
  1472.     @echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
  1473. END
  1474.  
  1475. # Old mechanism - still available:
  1476.  
  1477.     push(@m, <<'END') if $att{PERL_SRC};
  1478.     @ echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
  1479. END
  1480.     join('', "\n",@m);
  1481. }
  1482.  
  1483.  
  1484. sub installpm {
  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};
  1494.     my(@m, $dist);
  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));
  1499.     push(@m, "\n");
  1500.     }
  1501.     join('', @m);
  1502. }
  1503.  
  1504. sub installpm_x { # called by installpm per file
  1505.     my($self, $dist, $inst, $splitlib) = @_;
  1506.     my($instdir) = $inst =~ m|(.*)/|;
  1507.     my(@m);
  1508.     push(@m,"
  1509. $inst: $dist Makefile
  1510. ".'    @ '.$att{RM_F}.' $@
  1511.     @ $(MKPATH) '.$instdir.'
  1512.     '."$att{CP} $dist".' $@
  1513. ');
  1514.     push(@m, "\t\@\$(AUTOSPLITFILE) \$@ $splitlib/auto\n")
  1515.     if ($splitlib and $inst =~ m/\.pm$/);
  1516.     join('', @m);
  1517. }
  1518.  
  1519. sub installbin {
  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);
  1526.     $fromto{$from}=$to;
  1527.     }
  1528.     @to   = values %fromto;
  1529.     push(@m, "
  1530. EXE_FILES = @{$att{EXE_FILES}}
  1531.  
  1532. all :: @to
  1533.  
  1534. realclean ::
  1535.     $att{RM_F} @to
  1536. ");
  1537.  
  1538.     while (($from,$to) = each %fromto) {
  1539.     push @m, "
  1540. $to: $from $att{MAKEFILE}
  1541.     $att{CP} $from $to
  1542. ";
  1543.     }
  1544.     join "", @m;
  1545. }
  1546.  
  1547. sub exescan {
  1548.     $_;
  1549. }
  1550. # --- Sub-directory Sections ---
  1551.  
  1552. sub subdirs {
  1553.     my(@m);
  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($_));
  1561.     }
  1562.     if (@m){
  1563.     unshift(@m, "
  1564. # The default clean, realclean and test targets in this Makefile
  1565. # have automatically been given entries for each subdir.
  1566.  
  1567. all :: subdirs
  1568. ");
  1569.     } else {
  1570.     push(@m, "\n# none")
  1571.     }
  1572.     join('',@m);
  1573. }
  1574.  
  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";
  1580. }
  1581.  
  1582. sub subdir_x {
  1583.     my($self, $subdir) = @_;
  1584.     my(@m);
  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.
  1590.     qq{
  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)
  1594.  
  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."
  1602. '.qq{
  1603.  
  1604. subdirs ::
  1605.     cd $subdir ; \$(MAKE) all LINKTYPE=\$(LINKTYPE)
  1606.  
  1607. };
  1608. }
  1609.  
  1610.  
  1611. # --- Cleanup and Distribution Sections ---
  1612.  
  1613. sub clean {
  1614.     my($self, %attribs) = @_;
  1615.     my(@m);
  1616.     push(@m, '
  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.
  1619.  
  1620. clean ::
  1621. ');
  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};
  1632.     join("", @m);
  1633. }
  1634.  
  1635. sub realclean {
  1636.     my($self, %attribs) = @_;
  1637.     my(@m);
  1638.     push(@m,'
  1639. # Delete temporary files (via clean) and also delete installed files
  1640. realclean purge ::  clean
  1641. ');
  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}",''));
  1647.     }
  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};
  1656.     join("", @m);
  1657. }
  1658.  
  1659.  
  1660. sub distclean {
  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}}));
  1669.     "
  1670. distclean:     clean
  1671.     $preop
  1672.     $att{RM_F} $mkfiles
  1673.     cd ..; tar $tarflags $tarname.tar \$(BASEEXT)
  1674.     cd ..; $compress $tarname.tar
  1675.     $postop
  1676. ";
  1677. }
  1678.  
  1679.  
  1680. # --- Test and Installation Sections ---
  1681.  
  1682. sub test {
  1683.     my($self, %attribs) = @_;
  1684.     my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
  1685.     my(@m);
  1686.     push(@m,"
  1687. TEST_VERBOSE=0
  1688.  
  1689. test :: all
  1690. ");
  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
  1693. END
  1694.     push(@m, <<'END') if -f "test.pl";
  1695.     $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) test.pl
  1696. END
  1697.     push(@m, map("\tcd $_ && test -f $att{MAKEFILE} && \$(MAKE) test LINKTYPE=\$(LINKTYPE)\n",
  1698.          @{$att{DIR}}));
  1699.     push(@m, "\t\@echo 'No tests defined for \$(NAME) extension.'\n") unless @m > 1;
  1700.     join("", @m);
  1701. }
  1702.  
  1703.  
  1704. sub install {
  1705.     my($self, %attribs) = @_;
  1706.     my(@m);
  1707.     push @m, q{
  1708. doc_install ::
  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)")'
  1712. };
  1713.  
  1714.     push(@m, "
  1715. install :: pure_install doc_install
  1716.  
  1717. pure_install :: all
  1718. ");
  1719.     # install subdirectories first
  1720.     push(@m, map("\tcd $_ && test -f $att{MAKEFILE} && \$(MAKE) install\n",@{$att{DIR}}));
  1721.  
  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'}
  1726. ");
  1727.  
  1728.     join("",@m);
  1729. }
  1730.  
  1731. sub force {
  1732.     '# Phony target to force checking subdirectories.
  1733. FORCE:
  1734. ';
  1735. }
  1736.  
  1737.  
  1738. sub perldepend {
  1739.     my(@m);
  1740.     push(@m,'
  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
  1751.  
  1752. $(OBJECT) : $(PERL_HDRS)
  1753. ');
  1754.  
  1755.     push(@m,'
  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
  1761.  
  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};
  1766.  
  1767.     push(@m, join(" ", values %{$att{XS}})." : \$(XSUBPPDEPS)\n")
  1768.     if %{$att{XS}};
  1769.     join("\n",@m);
  1770. }
  1771.  
  1772.  
  1773. sub makefile {
  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.
  1777.     '
  1778. $(OBJECT) : '.$att{MAKEFILE}.'
  1779.  
  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
  1789. ';
  1790. }
  1791.  
  1792.  
  1793. sub postamble{
  1794.     "";
  1795. }
  1796.  
  1797. # --- Make-A-Perl section ---
  1798.  
  1799. sub staticmake {
  1800.     my($self, %attribs) = @_;
  1801.  
  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, 
  1809.                  'STAT' => \@static, 
  1810.                  'INCL' => \@perlinc,
  1811.                  'TARGET' => $att{MAP_TARGET},
  1812.                  'TMP' => "",
  1813.                  'LIBPERL' => $att{LIBPERL_A}
  1814.                  );
  1815. }
  1816.  
  1817. sub makeaperl {
  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)};
  1821.     my(@m);
  1822.     my($cccmd, $linkcmd);
  1823.  
  1824.     # This emulates cflags to get the compiler invocation...
  1825.     $cccmd = MY->const_cccmd($libperl);
  1826.     $cccmd =~ s/^CCCMD\s*=\s*//;
  1827.     chomp $cccmd;
  1828.     $cccmd =~ s/\s/ -I$att{PERL_INC} /;
  1829.     $cccmd .= " $Config{'cccdlflags'}" if ($Config{'d_shrplib'});
  1830.  
  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;
  1835.  
  1836.     # Which *.a files could we make use of...
  1837.     local(%static);
  1838.     File::Find::find(sub {
  1839.     return unless m/\.a$/;
  1840.     return if m/^libperl/;
  1841.     $static{fastcwd() . "/" . $_}++;
  1842.     }, grep( -d $_, @{$searchdirs || []}) );
  1843.  
  1844.     # We trust that what has been handed in as argument, will be buildable
  1845.     $static = [] unless $static;
  1846.     @static{@{$static}} = (1) x @{$static};
  1847.  
  1848.     $extra = [] unless $extra && ref $extra eq 'ARRAY';
  1849.     for (sort keys %static) {
  1850.     next unless /\.a$/;
  1851.     $_ = dirname($_) . "/extralibs.ld";
  1852.     push @$extra, "`cat $_`";
  1853.     }
  1854.  
  1855.     grep(s/^/-I/, @$perlinc);
  1856.  
  1857.     $target = "perl" unless $target;
  1858.     $tmp = "." unless $tmp;
  1859.  
  1860.     push @m, "
  1861. # --- MakeMaker makeaperl section ---
  1862. MAP_TARGET    = $target
  1863. FULLPERL      = $att{'FULLPERL'}
  1864. MAP_LINKCMD   = $linkcmd
  1865. MAP_PERLINC   = @{$perlinc}
  1866. MAP_STATIC    = ",
  1867. join(" ", sort keys %static), "
  1868. MAP_EXTRA     = @{$extra}
  1869. MAP_PRELIBS   = $Config{'libs'} $Config{'cryptlib'}
  1870. ";
  1871.     if ($libperl) {
  1872.     unless (-f $libperl || -f ($libperl = "$Config{'installarchlib'}/CORE/$libperl")){
  1873.         print STDOUT "Warning: $libperl not found";
  1874.         undef $libperl;
  1875.     }
  1876.     }
  1877.     unless ($libperl) {
  1878.     if (defined $att{PERL_SRC}) {
  1879.         $libperl = "$att{PERL_SRC}/libperl.a";
  1880.     } elsif ( -f ( $libperl = "$Config{'installarchlib'}/CORE/libperl.a" )) {
  1881.     } else {
  1882.         print STDOUT "Warning: $libperl not found";
  1883.     }
  1884.     }
  1885.  
  1886.     push @m, "
  1887. MAP_LIBPERL = $libperl
  1888. ";
  1889.  
  1890.     push @m, "
  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'
  1897.  
  1898. $tmp/perlmain.o: $tmp/perlmain.c
  1899. ";
  1900.     push @m, "\tcd $tmp && $cccmd perlmain.c\n";
  1901.  
  1902.     push @m, qq{
  1903. $tmp/perlmain.c: $makefilename}, q{
  1904.     @ echo Writing $@
  1905.     @ $(FULLPERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
  1906.         writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@.tmp && mv $@.tmp $@
  1907.  
  1908. };
  1909.  
  1910. # We write MAP_EXTRA outside the perl program to have it eval'd by the shell
  1911.     push @m, q{
  1912. doc_inst_perl:
  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)
  1916. };
  1917.  
  1918.     push @m, qq{
  1919. inst_perl: pure_inst_perl doc_inst_perl
  1920.  
  1921. pure_inst_perl: \$(MAP_TARGET)
  1922.     $att{CP} \$(MAP_TARGET) $Config{'installbin'}/\$(MAP_TARGET)
  1923.  
  1924. realclean :: map_clean
  1925.  
  1926. map_clean :
  1927.     $att{RM_F} $tmp/perlmain.o $tmp/perlmain.c $makefilename
  1928. };
  1929.  
  1930.     join '', @m;
  1931. }
  1932.  
  1933. # --- Determine libraries to use and how to use them ---
  1934.  
  1935. sub extliblist{
  1936.     my($self, $potential_libs)=@_;
  1937.     return ("", "", "") unless $potential_libs;
  1938.     print STDOUT "Potential libraries are '$potential_libs':" if $Verbose;
  1939.  
  1940.     my($so)   = $Config{'so'};
  1941.     my($libs) = $Config{'libs'};
  1942.  
  1943.     # compute $extralibs, $bsloadlibs and $ldloadlibs from
  1944.     # $potential_libs
  1945.     # this is a rewrite of Andy Dougherty's extliblist in perl
  1946.     # its home is in <distribution>/ext/util
  1947.  
  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
  1953.     my($found) = 0;
  1954.  
  1955.     foreach $thislib (split ' ', $potential_libs){
  1956.  
  1957.     # Handle possible linker path arguments.
  1958.     if ($thislib =~ s/^(-[LR])//){    # save path flag type
  1959.         my($ptype) = $1;
  1960.         unless (-d $thislib){
  1961.         print STDOUT "$ptype$thislib ignored, directory does not exist\n"
  1962.             if $Verbose;
  1963.         next;
  1964.         }
  1965.         if ($thislib !~ m|^/|) {
  1966.           print STDOUT "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
  1967.           $thislib = "$pwd/$thislib";
  1968.         }
  1969.         push(@searchpath, $thislib);
  1970.         push(@extralibs,  "$ptype$thislib");
  1971.         push(@ldloadlibs, "$ptype$thislib");
  1972.         next;
  1973.     }
  1974.  
  1975.     # Handle possible library arguments.
  1976.     unless ($thislib =~ s/^-l//){
  1977.       print STDOUT "Unrecognized argument in LIBS ignored: '$thislib'\n";
  1978.       next;
  1979.     }
  1980.  
  1981.     my($found_lib)=0;
  1982.     foreach $thispth (@searchpath, @libpath){
  1983.  
  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")){
  1998.         } else {
  1999.         print STDOUT "$thislib not found in $thispth" if $Verbose;
  2000.         next;
  2001.         }
  2002.         print STDOUT "'-l$thislib' found at $fullname" if $Verbose;
  2003.         $found++;
  2004.         $found_lib++;
  2005.  
  2006.         # Now update library lists
  2007.  
  2008.         # what do we know about this library...
  2009.         my $is_dyna = ($fullname !~ /\.a$/);
  2010.         my $in_perl = ($libs =~ /\B-l${thislib}\b/s);
  2011.  
  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");
  2017.         }
  2018.  
  2019.  
  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");
  2030.         } else {
  2031.         if ($is_dyna){
  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');
  2036.         } else {
  2037.             push(@ldloadlibs, "-l$thislib");
  2038.         }
  2039.         }
  2040.         last;    # found one here so don't bother looking further
  2041.     }
  2042.     print STDOUT "Warning (non-fatal): No library found for -l$thislib" unless $found_lib>0;
  2043.     }
  2044.     return ('','','') unless $found;
  2045.     ("@extralibs", "@bsloadlibs", "@ldloadlibs");
  2046. }
  2047.  
  2048.  
  2049. # --- Write a DynaLoader bootstrap file if required
  2050.  
  2051. sub mkbootstrap {
  2052.  
  2053. =head1 USEFUL SUBROUTINES
  2054.  
  2055. =head2 mkbootstrap()
  2056.  
  2057. Make a bootstrap file for use by this system's DynaLoader.  It
  2058. typically gets called from an extension Makefile.
  2059.  
  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.
  2063.  
  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
  2070. special cases.
  2071.  
  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.
  2075.  
  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.
  2079.  
  2080. =cut
  2081.  
  2082.     my($self, @bsloadlibs)=@_;
  2083.  
  2084.     @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
  2085.  
  2086.     print STDOUT "    bsloadlibs=@bsloadlibs\n" if $Verbose;
  2087.  
  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.
  2092.     require DynaLoader;
  2093.     import DynaLoader;
  2094.  
  2095.     init_main() unless defined $att{'BASEEXT'};
  2096.  
  2097.     rename "$att{BASEEXT}.bs", "$att{BASEEXT}.bso";
  2098.  
  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)};
  2104.     $bscode = "";
  2105.     unshift @INC, ".";
  2106.     require $_;
  2107.     shift @INC;
  2108.     }
  2109.  
  2110.     if ($Config{'dlsrc'} =~ /^dl_dld/){
  2111.     package DynaLoader;
  2112.     push(@dl_resolve_using, dl_findfile('-lc'));
  2113.     }
  2114.  
  2115.     my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
  2116.     my($method) = '';
  2117.     if (@all){
  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";
  2131.     }else{
  2132.         print BS "  qw(@all);\n";
  2133.     }
  2134.     # write extra code if *_BS says so
  2135.     print BS $DynaLoader::bscode if $DynaLoader::bscode;
  2136.     print BS "\n1;\n";
  2137.     close BS;
  2138.     }
  2139. }
  2140.  
  2141. sub mksymlists {
  2142.     my($self) = shift;
  2143.  
  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';
  2147.  
  2148.     init_main(@ARGV) unless defined $att{'BASEEXT'};
  2149.     if (! $att{DL_FUNCS}) {
  2150.     my($bootfunc);
  2151.     ($bootfunc = $att{NAME}) =~ s/\W/_/g;
  2152.     $att{DL_FUNCS} = {$att{BASEEXT} => ["boot_$bootfunc"]};
  2153.     }
  2154.     rename "$att{BASEEXT}.exp", "$att{BASEEXT}.exp_old";
  2155.  
  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";
  2163.         }
  2164.     }
  2165.     close EXP;
  2166. }
  2167.  
  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) = @_;
  2172.     $text;
  2173. }
  2174.  
  2175. # --- perllocal.pod section ---
  2176. sub writedoc {
  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";
  2180.     my($time);
  2181.     if (-f $localpod) {
  2182.     print "Appending installation info to $localpod\n";
  2183.     open POD, ">>$localpod" or die "Couldn't open $localpod";
  2184.     } else {
  2185.     print "Writing new file $localpod\n";
  2186.     open POD, ">$localpod" or die "Couldn't open $localpod";
  2187.     print POD "=head1 NAME
  2188.  
  2189. perllocal - locally installed modules and perl binaries
  2190. \n=head1 HISTORY OF LOCAL INSTALLATIONS
  2191.  
  2192. ";
  2193.     }
  2194.     require "ctime.pl";
  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";
  2199.     close POD;
  2200. }
  2201.  
  2202. =head1 AUTHORS
  2203.  
  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>>.
  2208.  
  2209. =head1 MODIFICATION HISTORY
  2210.  
  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
  2232.  
  2233. Cleaning up the new interface. Suggestion to freeze now until 5.001.
  2234.  
  2235. v4.061 February 12th 1995 By Andreas Koenig
  2236.  
  2237. Fixes of some my() declarations and of @extra computing in makeaperl().
  2238.  
  2239. v4.08 - 4.085  February 14th-21st 1995 by Andreas Koenig
  2240.  
  2241. Introduces EXE_FILES and INST_EXE for installing executable scripts 
  2242. and fixes documentation to reflect the new variable.
  2243.  
  2244. Introduces the automated documentation of the installation history. Every
  2245.   make install
  2246. and
  2247.   make inst_perl
  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.
  2252.  
  2253. Added ability to specify the another name than C<perl> for a new binary.
  2254.  
  2255. Both C<make perl> and C<makeaperl> now prompt the user, how to install
  2256. the new binary after the build.
  2257.  
  2258. Reduced noise during the make.
  2259.  
  2260. Variable LIBPERL_A enables indirect setting of the switches -DEMBED,
  2261. -DDEBUGGING and -DMULTIPLICITY in the same way as done by cflags.
  2262.  
  2263. old_extliblist() code deleted, new_extliblist() renamed to extliblist().
  2264.  
  2265. Improved algorithm in extliblist, that returns ('','','') if no
  2266. library has been found, even if a -L directory has been found.
  2267.  
  2268. Fixed a bug that didn't allow lib/ directory work as documented.
  2269.  
  2270. Allowed C<make test TEST_VERBOSE=1>
  2271.  
  2272. v4.086 March 9 1995 by Andy Dougherty
  2273.  
  2274. Fixed some AIX buglets.  Fixed DLD support for Linux with gcc 2.6.2.
  2275.  
  2276. =head1 NOTES
  2277.  
  2278. MakeMaker development work still to be done:
  2279.  
  2280. Needs more complete documentation.
  2281.  
  2282. Add a html: target when there has been found a general solution to
  2283. installing html files.
  2284.  
  2285. =cut
  2286.  
  2287. # the following keeps AutoSplit happy
  2288. package ExtUtils::MakeMaker;
  2289. 1;
  2290.  
  2291. __END__
  2292.