This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.000
[perl5.git] / lib / ExtUtils / MakeMaker.pm
CommitLineData
a0d0e21e
LW
1package ExtUtils::MakeMaker;
2
3# Authors: Andy Dougherty <doughera@lafcol.lafayette.edu>
4# Andreas Koenig <k@franz.ww.TU-Berlin.DE>
5# Tim Bunce <Tim.Bunce@ig.co.uk>
6
7# Last Revision: 12 Oct 1994
8
9# This utility is designed to write a Makefile for an extension
10# module from a Makefile.PL. It is based on the excellent Makefile.SH
11# model provided by Andy Dougherty and the perl5-porters.
12
13# It splits the task of generating the Makefile into several
14# subroutines that can be individually overridden.
15# Each subroutine returns the text it wishes to have written to
16# the Makefile.
17
18use Config;
19require Exporter;
20@ISA = qw(Exporter);
21@EXPORT = qw(writeMakefile mkbootstrap $Verbose);
22@EXPORT_OK = qw(%att @recognized_att_keys);
23
24use strict qw(refs);
25
26# Setup dummy package:
27# MY exists for overriding methods to be defined within
28unshift(@MY::ISA, qw(MM));
29
30$Verbose = 0;
31$Subdirs = 0; # set to 1 to have this .PL run all below
32$^W=1;
33
34
35# For most extensions it will do to call
36#
37# use ExtUtils::MakeMaker
38# &writeMakefile("potential_libs" => "-L/usr/alpha -lfoo -lbar");
39#
40# from Makefile.PL in the extension directory
41# It is also handy to include some of the following attributes:
42#
43@recognized_att_keys=qw(
44 TOP INC DISTNAME VERSION DEFINE OBJECT LDTARGET ARMAYBE
45 BACKUP_LIBS AUTOSPLITMAXLEN LINKTYPE
46 potential_libs otherldflags perl fullperl
47 distclean_tarflags
48 clean_files realclean_files
49);
50
51#
52# TOP is the directory above lib/ and ext/ (normally ../..)
53# (MakeMaker will normally work this out for itself)
54# INC is something like "-I/usr/local/Minerva/include"
55# DISTNAME is a name of your choice for distributing the package
56# VERSION is your version number
57# DEFINE is something like "-DHAVE_UNISTD_H"
58# OBJECT defaults to '$(BASEEXT).o', but can be a long string containing
59# all object files, e.g. "tkpBind.o tkpButton.o tkpCanvas.o"
60# LDTARGET defaults to $(OBJECT) and is used in the ld command
61# (some machines need additional switches for bigger projects)
62# ARMAYBE defaults to ":", but can be used to run ar before ld
63# BACKUP_LIBS is an anonymous array of libraries to be searched for
64# until we get at least some output from ext/util/extliblist
65# 'potential_libs' => "-lgdbm",
66# 'BACKUP_LIBS' => [ "-ldbm -lfoo", "-ldbm.nfs" ]
67# AUTOSPLITMAXLEN defaults to 8 and is used when autosplit is done
68# (can be set higher on a case-by-case basis)
69# defaults to `dynamic', can be set to `static'
70
71#
72# `make distclean' builds $(DISTNAME)-$(VERSION).tar.Z after a clean
73
74# Be aware, that you can also pass attributes into the %att hash table
75# by calling Makefile.PL with an argument of the form TOP=/some/where.
76
77# If the Makefile generated by default does not fit your purpose,
78# you may specify private subroutines in the Makefile.PL as there are:
79#
80# MY->initialize => sub MY::initialize{ ... }
81# MY->post_initialize => sub MY::post_initialize{ ... }
82# MY->constants => etc
83# MY->dynamic
84# etc. (see function writeMakefile, for the current breakpoints)
85#
86# Each subroutines returns the text it wishes to have written to
87# the Makefile. To override a section of the Makefile you can
88# either say: sub MY::co { "new literal text" }
89# or you can edit the default by saying something like:
90# sub MY::co { $_=MM->co; s/old text/new text/; $_ }
91#
92# If you still need a different solution, try to develop another
93# subroutine, that fits your needs and submit the diffs to
94# perl5-porters or comp.lang.perl as appropriate.
95
96sub writeMakefile {
97 %att = @_;
98 local($\)="\n";
99
100 foreach (@ARGV){
101 $att{$1}=$2 if m/(.*)=(.*)/;
102 }
103 print STDOUT "MakeMaker" if $Verbose;
104 print STDOUT map(" $_ = '$att{$_}'\n", sort keys %att) if ($Verbose && %att);
105
106 MY->initialize();
107
108 print STDOUT "Writing ext/$att{FULLEXT}/Makefile (with variable substitutions)";
109
110 open MAKE, ">Makefile" or die "Unable to open Makefile: $!";
111
112 MY->mkbootstrap(split(" ", $att{'dynaloadlibs'}));
113 print MAKE MY->post_initialize;
114
115 print MAKE MY->constants;
116 print MAKE MY->post_constants;
117
118 print MAKE MY->subdir if $Subdirs;
119 print MAKE MY->dynamic;
120 print MAKE MY->force;
121 print MAKE MY->static;
122 print MAKE MY->co;
123 print MAKE MY->c;
124 print MAKE MY->installpm;
125 print MAKE MY->clean;
126 print MAKE MY->realclean;
127 print MAKE MY->test;
128 print MAKE MY->install;
129 print MAKE MY->perldepend;
130 print MAKE MY->distclean;
131 print MAKE MY->postamble;
132
133 MY->finish;
134
135 close MAKE;
136
137 1;
138}
139
140
141sub mkbootstrap{
142 MY->mkbootstrap(@_)
143}
144
145
146sub avoid_typo_warnings{
147 local($t) = "$t
148 $main::writeMakefile
149 $main::mkbootstrap
150 $main::Verbose
151 $DynaLoader::dl_resolve_using
152 $ExtUtils::MakeMaker::Config
153 $DynaLoader::Config
154 ";
155}
156
157
158# --- Supply the MakeMaker default methods ---
159
160package MM;
161
162use Config;
163require Exporter;
164
165Exporter::import('ExtUtils::MakeMaker', qw(%att @recognized_att_keys));
166
167# These attributes cannot be overridden
168@other_att_keys=qw(extralibs dynaloadlibs statloadlibs bootdep);
169
170
171sub find_perl{
172 my($self, $ver, $names, $dirs, $trace) = @_;
173 my($name, $dir);
174 print "Looking for perl $ver by these names: @$names, in these dirs: @$dirs\n"
175 if ($trace);
176 foreach $dir (@$dirs){
177 foreach $name (@$names){
178 print "checking $dir/$name\n" if ($trace >= 2);
179 next unless -x "$dir/$name";
180 print "executing $dir/$name\n" if ($trace);
181 my($out) = `$dir/$name -e 'require $ver; print "5OK\n" ' 2>&1`;
182 return "$dir/$name" if $out =~ /5OK/;
183 }
184 }
185 warn "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
186 0; # false and not empty
187}
188
189
190sub initialize {
191 # Find out directory name. This is also the extension name.
192 chop($pwd=`pwd`);
193
194 unless ( $top = $att{TOP} ){
195 foreach(qw(../.. ../../.. ../../../..)){
196 ($top=$_, last) if -f "$_/config.sh";
197 }
198 die "Can't find config.sh" unless -f "$top/config.sh";
199 }
200 chdir $top or die "Couldn't chdir $top: $!";
201 chop($abstop=`pwd`);
202 chdir $pwd;
203
204 # EXTMODNAME = The perl module name for this extension.
205 # FULLEXT = Full pathname to extension directory.
206 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
207 # ROOTEXT = Directory part of FULLEXT. May be empty.
208 my($p) = $pwd; $p =~ s:^\Q$abstop/ext/\E::;
209 ($att{EXTMODNAME}=$p) =~ s#/#::#g ; #eg. BSD::Foo::Socket
210 ($att{FULLEXT} =$p); #eg. BSD/Foo/Socket
211 ($att{BASEEXT} =$p) =~ s:.*/:: ; #eg. Socket
212 ($att{ROOTEXT} =$p) =~ s:/?\Q$att{BASEEXT}\E$:: ; #eg. BSD/Foo
213
214 # Find Perl 5. The only contract here is that both 'perl' and 'fullperl'
215 # will be working versions of perl 5.
216 $att{'perl'} = MY->find_perl(5.0, [ qw(perl5 perl miniperl) ],
217 [ $abstop, split(":", $ENV{PATH}) ], 0 )
218 unless ($att{'perl'} && -x $att{'perl'});
219
220 # Define 'fullperl' to be a non-miniperl (used in test: target)
221 ($att{'fullperl'} = $att{'perl'}) =~ s/miniperl$/perl/
222 unless ($att{'fullperl'} && -x $att{'fullperl'});
223
224 for $key (@recognized_att_keys, @other_att_keys){
225 # avoid warnings for uninitialized vars
226 $att{$key} = "" unless defined $att{$key};
227 }
228
229 # compute extralibs, dynaloadlibs and statloadlibs from
230 # $att{'potential_libs'}
231
232 unless ( &run_extliblist($att{'potential_libs'}) ){
233 foreach ( @{$att{'BACKUP_LIBS'} || []} ){
234 # Try again. Maybe they have specified some other libraries
235 last if &run_extliblist($_);
236 }
237 }
238}
239
240
241sub run_extliblist {
242 my($potential_libs)=@_;
243 # Now run ext/util/extliblist to discover what *libs definitions
244 # are required for the needs of $potential_libs
245 $ENV{'potential_libs'} = $potential_libs;
246 $_=`. $abstop/ext/util/extliblist;
247 echo extralibs=\$extralibs
248 echo dynaloadlibs=\$dynaloadlibs
249 echo statloadlibs=\$statloadlibs
250 echo bootdep=\$bootdep
251 `;
252 my(@w);
253 foreach $line (split "\n", $_){
254 chomp $line;
255 if ($line =~ /(.*)\s*=\s*(.*)$/){
256 $att{$1} = $2;
257 print STDERR " $1 = $2" if $Verbose;
258 }else{
259 push(@w, $line);
260 }
261 }
262 print STDERR "Messages from extliblist:\n", join("\n",@w,'')
263 if @w ;
264 join '', @att{qw(extralibs dynaloadlibs statloadlibs)};
265}
266
267
268sub post_initialize{
269 "";
270}
271
272
273sub constants {
274 my(@m);
275
276 $att{BOOTDEP} = (-f "$att{BASEEXT}_BS") ? "$att{BASEEXT}_BS" : "";
277 $att{OBJECT} = '$(BASEEXT).o' unless $att{OBJECT};
278 $att{LDTARGET} = '$(OBJECT)' unless $att{LDTARGET};
279 $att{ARMAYBE} = ":" unless $att{ARMAYBE};
280 $att{AUTOSPLITMAXLEN} = 8 unless $att{AUTOSPLITMAXLEN};
281 $att{LINKTYPE} = ($Config{'usedl'}) ? 'dynamic' : 'static'
282 unless $att{LINKTYPE};
283
284
285 push @m, "
286#
287# This Makefile is for the $att{FULLEXT} extension to perl.
288# It was written by Makefile.PL, so don't edit it, edit
289# Makefile.PL instead. ANY CHANGES MADE HERE WILL BE LOST!
290#
291
292DISTNAME = $att{DISTNAME}
293VERSION = $att{VERSION}
294
295TOP = $top
296ABSTOP = $abstop
297PERL = $att{'perl'}
298FULLPERL = $att{'fullperl'}
299INC = $att{INC}
300DEFINE = $att{DEFINE}
301OBJECT = $att{OBJECT}
302LDTARGET = $att{LDTARGET}
303";
304
305 push @m, "
306CC = $Config{'cc'}
307LIBC = $Config{'libc'}
308LDFLAGS = $Config{'ldflags'}
309CLDFLAGS = $Config{'ldflags'}
310LINKTYPE = $att{LINKTYPE}
311ARMAYBE = $att{ARMAYBE}
312RANLIB = $Config{'ranlib'}
313
314SMALL = $Config{'small'}
315LARGE = $Config{'large'} $Config{'split'}
316# The following are used to build and install shared libraries for
317# dynamic loading.
318LDDLFLAGS = $Config{'lddlflags'}
319CCDLFLAGS = $Config{'ccdlflags'}
320CCCDLFLAGS = $Config{'cccdlflags'}
321SO = $Config{'so'}
322DLEXT = $Config{'dlext'}
323DLSRC = $Config{'dlsrc'}
324";
325
326 push @m, "
327# $att{FULLEXT} might need to be linked with some extra libraries.
328# EXTRALIBS = full list of libraries needed for static linking.
329# Only those libraries that actually exist are included.
330# DYNALOADLIBS = list of those libraries that are needed but can be
331# linked in dynamically on this platform. On SunOS, for
332# example, this would be .so* libraries, but not archive
333# libraries. The bootstrap file is installed only if
334# this list is not empty.
335# STATLOADLIBS = list of those libraries which must be statically
336# linked into the shared library. On SunOS 4.1.3,
337# for example, I have only an archive version of
338# -lm, and it must be linked in statically.
339EXTRALIBS = $att{'extralibs'}
340DYNALOADLIBS = $att{'dynaloadlibs'}
341STATLOADLIBS = $att{'statloadlibs'}
342
343";
344
345 push @m, "
346# EXTMODNAME = The perl module name for this extension.
347# FULLEXT = Full pathname to extension directory.
348# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
349# ROOTEXT = Directory part of FULLEXT. May be empty.
350EXTMODNAME = $att{EXTMODNAME}
351FULLEXT = $att{FULLEXT}
352BASEEXT = $att{BASEEXT}
353ROOTEXT = $att{ROOTEXT}
354# and for backward compatibility and for AIX support (due to change!)
355EXT = $att{BASEEXT}
356
357# $att{FULLEXT} might have its own typemap
358EXTTYPEMAP = ".(-f "typemap" ? "typemap" : "")."
359# $att{FULLEXT} might have its own bootstrap support
360BOOTSTRAP = $att{BASEEXT}.bs
361BOOTDEP = $att{BOOTDEP}
362";
363
364 push @m, '
365# Where to put things:
366AUTO = $(TOP)/lib/auto
367AUTOEXT = $(TOP)/lib/auto/$(FULLEXT)
368INST_BOOT = $(AUTOEXT)/$(BASEEXT).bs
369INST_DYNAMIC = $(AUTOEXT)/$(BASEEXT).$(DLEXT)
370INST_STATIC = $(BASEEXT).a
371INST_PM = $(TOP)/lib/$(FULLEXT).pm
372'."
373# These two are only used by install: targets
374INSTALLPRIVLIB = $Config{'installprivlib'}
375INSTALLARCHLIB = $Config{'installarchlib'}
376";
377
378 push @m, "\nshellflags = $Config{'shellflags'}" if $Config{'shellflags'};
379
380 push @m, q{
381# Tools
382SHELL = /bin/sh
383CCCMD = `sh $(shellflags) $(ABSTOP)/cflags $@`
384XSUBPP = $(TOP)/ext/xsubpp
385# the following is a portable way to say mkdir -p
386MKPATH = $(PERL) -we '$$"="/"; foreach(split(/\//,$$ARGV[0])){ push(@p, $$_); next if -d "@p"; print "mkdir @p\n"; mkdir("@p",0777)||die "mkdir @p: $$!" } exit 0;'
387AUTOSPLITLIB = cd $(TOP); \
388 $(PERL) -Ilib -e 'use AutoSplit; $$AutoSplit::Maxlen=}.$att{AUTOSPLITMAXLEN}.q{; autosplit_lib_modules(@ARGV) ;'
389};
390
391 push @m, '
392
393all ::
394
395config :: Makefile
396 @$(MKPATH) $(AUTOEXT)
397
398install ::
399
400';
401
402 join('',@m);
403}
404
405
406sub post_constants{
407 "";
408}
409
410
411sub subdir {
412 my(@m);
413 foreach $MakefilePL (<*/Makefile.PL>){
414 ($subdir=$MakefilePL) =~ s:/Makefile\.PL$:: ;
415 push @m, "
416config ::
417 \@cd $subdir ; \\
418 if test ! -f Makefile; then \\
419 test -f Makefile.PL && \$(PERL) -I\$(ABSTOP)/lib Makefile.PL TOP=\$(ABSTOP) ; \\
420 fi
421
422all ::
423 cd $subdir ; \$(MAKE) config
424 cd $subdir ; \$(MAKE) all
425";
426
427 }
428 join('',@m);
429}
430
431
432sub co {
433 '
434.c.o:
435 $(CCCMD) $(CCCDLFLAGS) $(DEFINE) -I$(TOP) $(INC) $*.c
436';
437}
438
439
440sub force {
441 '
442# Phony target to force checking subdirectories.
443FORCE:
444';
445}
446
447
448sub dynamic {
449 '
450all:: $(LINKTYPE)
451
452# Target for Dynamic Loading:
453dynamic:: $(INST_DYNAMIC) $(INST_PM) $(INST_BOOT)
454
455$(INST_DYNAMIC): $(OBJECT)
456 @$(MKPATH) $(AUTOEXT)
457 $(ARMAYBE) cr $(EXTMODNAME).a $(OBJECT)
458 ld $(LDDLFLAGS) -o $@ $(LDTARGET) '.$att{'otherldflags'}.' $(STATLOADLIBS)
459
460$(BOOTSTRAP): $(BOOTDEP)
461 $(PERL) -I$(TOP)/lib -e \'use ExtUtils::MakeMaker; &mkbootstrap("$(DYNALOADLIBS)");\'
462 touch $(BOOTSTRAP)
463
464$(INST_BOOT): $(BOOTSTRAP)
465 @test ! -s $(BOOTSTRAP) || cp $(BOOTSTRAP) $@
466';
467}
468
469
470sub static {
471 '
472# Target for Static Loading:
473static:: $(INST_STATIC) $(INST_PM)
474
475$(INST_STATIC): $(OBJECT)
476 ar cr $@ $(OBJECT)
477 $(RANLIB) $@
478 echo $(EXTRALIBS) >> $(TOP)/ext.libs
479';
480}
481
482
483sub c {
484 '
485$(BASEEXT).c: $(BASEEXT).xs $(XSUBPP) $(TOP)/ext/typemap $(EXTTYPEMAP) $(TOP)/cflags
486 $(PERL) $(XSUBPP) $(BASEEXT).xs >tmp
487 mv tmp $@
488';
489}
490
491
492sub installpm {
493 '
494$(INST_PM): $(BASEEXT).pm
495 @$(MKPATH) $(TOP)/lib/$(ROOTEXT)
496 rm -f $@
497 cp $(BASEEXT).pm $@
498 @$(AUTOSPLITLIB) $(EXTMODNAME)
499';
500}
501
502
503sub clean {
504 '
505clean::
506 rm -f *.o *.a mon.out core $(BASEEXT).c so_locations
507 rm -f makefile Makefile $(BOOTSTRAP) $(BASEEXT).bso '.$att{'clean_files'}.'
508';
509}
510
511
512sub realclean {
513 '
514realclean:: clean
515 rm -f $(INST_DYNAMIC) $(INST_STATIC) $(INST_BOOT)
516 rm -rf $(INST_PM) $(AUTOEXT) '.$att{'realclean_files'}.'
517
518purge: realclean
519';
520}
521
522
523sub test {
524 '
525test: all
526 $(FULLPERL) -I$(TOP)/lib -e \'use Test::Harness; runtests @ARGV;\' t/*.t
527';
528}
529
530
531sub install {
532 '
533# used if installperl will not be installing it for you
534install:: all
535 # not yet defined
536';
537}
538
539
540sub distclean {
541 my($tarflags) = $att{'distclean_tarflags'} || 'cvf';
542 '
543distclean: clean
544 rm -f Makefile *~ t/*~
545 cd ..; tar '.$tarflags.' "$(DISTNAME)-$(VERSION).tar" $(BASEEXT)
546 cd ..; compress "$(DISTNAME)-$(VERSION).tar"
547';
548}
549
550
551sub perldepend {
552 '
553$(OBJECT) : Makefile
554$(OBJECT) : $(TOP)/EXTERN.h
555$(OBJECT) : $(TOP)/INTERN.h
556$(OBJECT) : $(TOP)/XSUB.h
557$(OBJECT) : $(TOP)/av.h
558$(OBJECT) : $(TOP)/cop.h
559$(OBJECT) : $(TOP)/cv.h
560$(OBJECT) : $(TOP)/dosish.h
561$(OBJECT) : $(TOP)/embed.h
562$(OBJECT) : $(TOP)/form.h
563$(OBJECT) : $(TOP)/gv.h
564$(OBJECT) : $(TOP)/handy.h
565$(OBJECT) : $(TOP)/hv.h
566$(OBJECT) : $(TOP)/keywords.h
567$(OBJECT) : $(TOP)/mg.h
568$(OBJECT) : $(TOP)/op.h
569$(OBJECT) : $(TOP)/opcode.h
570$(OBJECT) : $(TOP)/patchlevel.h
571$(OBJECT) : $(TOP)/perl.h
572$(OBJECT) : $(TOP)/perly.h
573$(OBJECT) : $(TOP)/pp.h
574$(OBJECT) : $(TOP)/proto.h
575$(OBJECT) : $(TOP)/regcomp.h
576$(OBJECT) : $(TOP)/regexp.h
577$(OBJECT) : $(TOP)/scope.h
578$(OBJECT) : $(TOP)/sv.h
579$(OBJECT) : $(TOP)/unixish.h
580$(OBJECT) : $(TOP)/util.h
581$(TOP)/config.h: $(TOP)/config.sh; cd $(TOP); /bin/sh config_h.SH
582$(TOP)/embed.h: $(TOP)/config.sh; cd $(TOP); /bin/sh embed_h.SH
583$(TOP)/cflags: $(TOP)/config.sh; cd $(TOP); /bin/sh cflags.SH
584
585Makefile: Makefile.PL
586 $(PERL) -I$(TOP)/lib Makefile.PL
587';
588}
589
590
591sub postamble{
592 "";
593}
594
595
596sub finish {
597 chmod 0644, "Makefile";
598 system("$Config{'eunicefix'} Makefile") unless $Config{'eunicefix'} eq ":";
599}
600
601
602
603sub mkbootstrap {
604#
605# mkbootstrap, by:
606#
607# Andreas Koenig <k@otto.ww.TU-Berlin.DE>
608# Tim Bunce <Tim.Bunce@ig.co.uk>
609# Andy Dougherty <doughera@lafcol.lafayette.edu>
610#
611# This perl script attempts to make a bootstrap file for use by this
612# system's DynaLoader. It typically gets called from an extension
613# Makefile.
614#
615# There is no .bs file supplied with the extension. Instead a _BS
616# file which has code for the special cases, like posix for berkeley db
617# on the NeXT.
618#
619# This file will get parsed, and produce a maybe empty
620# @DynaLoader::dl_resolve_using array for the current architecture.
621# That will be extended by $dynaloadlibs, which was computed by Andy's
622# extliblist script. If this array still is empty, we do nothing, else
623# we write a .bs file with an @DynaLoader::dl_resolve_using array, but
624# without any `if's, because there is no longer a need to deal with
625# special cases.
626#
627# The _BS file can put some code into the generated .bs file by placing
628# it in $bscode. This is a handy 'escape' mechanism that may prove
629# useful in complex situations.
630#
631# If @DynaLoader::dl_resolve_using contains -L* or -l* entries then
632# mkbootstrap will automatically add a dl_findfile() call to the
633# generated .bs file.
634#
635 my($self, @dynaloadlibs)=@_;
636 print STDERR " dynaloadlibs=@dynaloadlibs" if $Verbose;
637 require DynaLoader; # we need DynaLoader, if the *_BS gets interpreted
638 import DynaLoader; # we don't say `use', so if DynaLoader is not
639 # yet built MakeMaker works nonetheless except here
640
641 &initialize unless defined $att{'perl'};
642
643 rename "$att{BASEEXT}.bs", "$att{BASEEXT}.bso";
644
645 if (-f "$att{BASEEXT}_BS"){
646 $_ = "$att{BASEEXT}_BS";
647 package DynaLoader; # execute code as if in DynaLoader
648 local($osname, $dlsrc) = (); # avoid warnings
649 ($osname, $dlsrc) = @Config{qw(osname dlsrc)};
650 $bscode = "";
651 unshift @INC, ".";
652 require $_;
653 }
654
655 if ($Config{'dlsrc'} =~ /^dl_dld/){
656 package DynaLoader;
657 push(@dl_resolve_using, dl_findfile('-lc'));
658 }
659
660 my(@all) = (@dynaloadlibs, @DynaLoader::dl_resolve_using);
661 my($method) = '';
662 if (@all){
663 open BS, ">$att{BASEEXT}.bs"
664 or die "Unable to open $att{BASEEXT}.bs: $!";
665 print STDOUT "Writing $att{BASEEXT}.bs\n";
666 print STDOUT " containing: @all" if $Verbose;
667 print BS "# $att{BASEEXT} DynaLoader bootstrap file for $Config{'osname'} architecture.\n";
668 print BS "# Do not edit this file, changes will be lost.\n";
669 print BS "# This file was automatically generated by the\n";
670 print BS "# mkbootstrap routine in ExtUtils/MakeMaker.pm.\n";
671 print BS "\@DynaLoader::dl_resolve_using = ";
672 if (" @all" =~ m/ -[lL]/){
673 print BS " dl_findfile(qw(\n @all\n ));\n";
674 }else{
675 print BS " qw(@all);\n";
676 }
677 # write extra code if *_BS says so
678 print BS $DynaLoader::bscode if $DynaLoader::bscode;
679 print BS "1;\n";
680 close BS;
681 }
682
683 if ($Config{'dlsrc'} =~ /^dl_aix/){
684 open AIX, ">$att{BASEEXT}.exp";
685 print AIX "#!\nboot_$att{BASEEXT}\n";
686 close AIX;
687 }
688}
689
690# the following makes AutoSplit happy (bug in perl5b3e)
691package ExtUtils::MakeMaker;
6921;
693
694__END__