This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH] sv.c: consting
[perl5.git] / lib / ExtUtils / Mkbootstrap.pm
CommitLineData
005c1a0e 1package ExtUtils::Mkbootstrap;
15e1d173 2
1e65eb70
SP
3# There's just too much Dynaloader incest here to turn on strict vars.
4use strict 'refs';
5
6use vars qw($VERSION @ISA @EXPORT);
6d6be53e 7$VERSION = '6.42';
1e65eb70
SP
8
9require Exporter;
10@ISA = ('Exporter');
11@EXPORT = ('&Mkbootstrap');
15e1d173 12
005c1a0e 13use Config;
1e65eb70
SP
14
15use vars qw($Verbose);
16
005c1a0e
AD
17
18sub Mkbootstrap {
005c1a0e 19 my($baseext, @bsloadlibs)=@_;
005c1a0e
AD
20 @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
21
22 print STDOUT " bsloadlibs=@bsloadlibs\n" if $Verbose;
23
24 # We need DynaLoader here because we and/or the *_BS file may
25 # call dl_findfile(). We don't say `use' here because when
26 # first building perl extensions the DynaLoader will not have
27 # been built when MakeMaker gets first used.
28 require DynaLoader;
29
30 rename "$baseext.bs", "$baseext.bso"
31 if -s "$baseext.bs";
32
33 if (-f "${baseext}_BS"){
34 $_ = "${baseext}_BS";
35 package DynaLoader; # execute code as if in DynaLoader
15e1d173
PP
36 local($osname, $dlsrc) = (); # avoid warnings
37 ($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
005c1a0e
AD
38 $bscode = "";
39 unshift @INC, ".";
40 require $_;
41 shift @INC;
42 }
43
44 if ($Config{'dlsrc'} =~ /^dl_dld/){
45 package DynaLoader;
46 push(@dl_resolve_using, dl_findfile('-lc'));
47 }
48
49 my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
50 my($method) = '';
51 if (@all){
52 open BS, ">$baseext.bs"
53 or die "Unable to open $baseext.bs: $!";
54 print STDOUT "Writing $baseext.bs\n";
55 print STDOUT " containing: @all" if $Verbose;
f360dba1 56 print BS "# $baseext DynaLoader bootstrap file for $^O architecture.\n";
005c1a0e
AD
57 print BS "# Do not edit this file, changes will be lost.\n";
58 print BS "# This file was automatically generated by the\n";
875fa795 59 print BS "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n";
005c1a0e
AD
60 print BS "\@DynaLoader::dl_resolve_using = ";
61 # If @all contains names in the form -lxxx or -Lxxx then it's asking for
62 # runtime library location so we automatically add a call to dl_findfile()
63 if (" @all" =~ m/ -[lLR]/){
64 print BS " dl_findfile(qw(\n @all\n ));\n";
65 }else{
66 print BS " qw(@all);\n";
67 }
68 # write extra code if *_BS says so
69 print BS $DynaLoader::bscode if $DynaLoader::bscode;
70 print BS "\n1;\n";
71 close BS;
72 }
73}
74
15e1d173
PP
751;
76
77__END__
78
79=head1 NAME
80
81ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
82
83=head1 SYNOPSIS
84
39234879 85C<Mkbootstrap>
15e1d173
PP
86
87=head1 DESCRIPTION
88
89Mkbootstrap typically gets called from an extension Makefile.
90
a7665c5e
GS
91There is no C<*.bs> file supplied with the extension. Instead, there may
92be a C<*_BS> file which has code for the special cases, like posix for
15e1d173
PP
93berkeley db on the NeXT.
94
95This file will get parsed, and produce a maybe empty
96C<@DynaLoader::dl_resolve_using> array for the current architecture.
97That will be extended by $BSLOADLIBS, which was computed by
98ExtUtils::Liblist::ext(). If this array still is empty, we do nothing,
99else we write a .bs file with an C<@DynaLoader::dl_resolve_using>
100array.
101
102The C<*_BS> file can put some code into the generated C<*.bs> file by
103placing it in C<$bscode>. This is a handy 'escape' mechanism that may
104prove useful in complex situations.
105
106If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
107Mkbootstrap will automatically add a dl_findfile() call to the
108generated C<*.bs> file.
109
110=cut