Perl 5.001
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MakeMaker.pm
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__