In FreeBSD disable floating point exception handlers.
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Mksymlists.pm
CommitLineData
c07a80fd 1package ExtUtils::Mksymlists;
17f410f9 2
3use 5.005_64;
c07a80fd 4use strict qw[ subs refs ];
5# no strict 'vars'; # until filehandles are exempted
6
7use Carp;
c07a80fd 8use Exporter;
17f410f9 9our(@ISA, @EXPORT, $VERSION);
f1387719 10@ISA = 'Exporter';
11@EXPORT = '&Mksymlists';
6ee623d5 12$VERSION = substr q$Revision: 1.17 $, 10;
c07a80fd 13
14sub Mksymlists {
15 my(%spec) = @_;
f1387719 16 my($osname) = $^O;
c07a80fd 17
18 croak("Insufficient information specified to Mksymlists")
19 unless ( $spec{NAME} or
20 ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) );
21
22 $spec{DL_VARS} = [] unless $spec{DL_VARS};
23 ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE};
348844dc 24 $spec{FUNCLIST} = [] unless $spec{FUNCLIST};
c07a80fd 25 $spec{DL_FUNCS} = { $spec{NAME} => [] }
26 unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or
348844dc 27 @{$spec{FUNCLIST}});
c07a80fd 28 if (defined $spec{DL_FUNCS}) {
29 my($package);
30 foreach $package (keys %{$spec{DL_FUNCS}}) {
31 my($packprefix,$sym,$bootseen);
32 ($packprefix = $package) =~ s/\W/_/g;
33 foreach $sym (@{$spec{DL_FUNCS}->{$package}}) {
34 if ($sym =~ /^boot_/) {
35 push(@{$spec{FUNCLIST}},$sym);
36 $bootseen++;
37 }
38 else { push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym"); }
39 }
40 push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen;
41 }
42 }
43
44# We'll need this if we ever add any OS which uses mod2fname
760ac839 45# not as pseudo-builtin.
c07a80fd 46# require DynaLoader;
c2e89b3d 47 if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
48 $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
49 }
c07a80fd 50
f1387719 51 if ($osname eq 'aix') { _write_aix(\%spec); }
52 elsif ($osname eq 'VMS') { _write_vms(\%spec) }
bab2b58e 53 elsif ($osname eq 'os2') { _write_os2(\%spec) }
68dc0745 54 elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
f1387719 55 else { croak("Don't know how to create linker option file for $osname\n"); }
c07a80fd 56}
57
58
59sub _write_aix {
60 my($data) = @_;
61
62 rename "$data->{FILE}.exp", "$data->{FILE}.exp_old";
63
64 open(EXP,">$data->{FILE}.exp")
65 or croak("Can't create $data->{FILE}.exp: $!\n");
66 print EXP join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
67 print EXP join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
68 close EXP;
69}
70
71
72sub _write_os2 {
73 my($data) = @_;
6ee623d5 74 require Config;
75 my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : "");
c07a80fd 76
77 if (not $data->{DLBASE}) {
78 ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
79 $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
80 }
3cfae81b 81 my $distname = $data->{DISTNAME} || $data->{NAME};
82 $distname = "Distribution $distname";
0ff3fa1a 83 my $comment = "Perl (v$Config::Config{version}$threaded) module $data->{NAME}";
3cfae81b 84 if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
85 $distname = 'perl5-porters@perl.org';
86 $comment = "Core $comment";
87 }
c07a80fd 88 rename "$data->{FILE}.def", "$data->{FILE}_def.old";
89
90 open(DEF,">$data->{FILE}.def")
91 or croak("Can't create $data->{FILE}.def: $!\n");
92 print DEF "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
3cfae81b 93 print DEF "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
c07a80fd 94 print DEF "CODE LOADONCALL\n";
95 print DEF "DATA LOADONCALL NONSHARED MULTIPLE\n";
c2e89b3d 96 print DEF "EXPORTS\n ";
97 print DEF join("\n ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
98 print DEF join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
99 if (%{$data->{IMPORTS}}) {
100 print DEF "IMPORTS\n";
875fa795 101 my ($name, $exp);
102 while (($name, $exp)= each %{$data->{IMPORTS}}) {
103 print DEF " $name=$exp\n";
104 }
c2e89b3d 105 }
c07a80fd 106 close DEF;
107}
108
68dc0745 109sub _write_win32 {
110 my($data) = @_;
111
3e3baf6d 112 require Config;
68dc0745 113 if (not $data->{DLBASE}) {
114 ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
115 $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
116 }
117 rename "$data->{FILE}.def", "$data->{FILE}_def.old";
118
119 open(DEF,">$data->{FILE}.def")
120 or croak("Can't create $data->{FILE}.def: $!\n");
84902520 121 # put library name in quotes (it could be a keyword, like 'Alias')
5b0d9cbe 122 if ($Config::Config{'cc'} !~ /^gcc/i) {
123 print DEF "LIBRARY \"$data->{DLBASE}\"\n";
5b0d9cbe 124 }
68dc0745 125 print DEF "EXPORTS\n ";
84902520 126 my @syms;
127 # Export public symbols both with and without underscores to
128 # ensure compatibility between DLLs from different compilers
129 # NOTE: DynaLoader itself only uses the names without underscores,
130 # so this is only to cover the case when the extension DLL may be
131 # linked to directly from C. GSAR 97-07-10
3e3baf6d 132 if ($Config::Config{'cc'} =~ /^bcc/i) {
84902520 133 for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
134 push @syms, "_$_", "$_ = _$_";
135 }
3e3baf6d 136 }
84902520 137 else {
138 for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
139 push @syms, "$_", "_$_ = $_";
140 }
141 }
142 print DEF join("\n ",@syms, "\n") if @syms;
68dc0745 143 if (%{$data->{IMPORTS}}) {
144 print DEF "IMPORTS\n";
145 my ($name, $exp);
146 while (($name, $exp)= each %{$data->{IMPORTS}}) {
147 print DEF " $name=$exp\n";
148 }
149 }
150 close DEF;
151}
152
c07a80fd 153
154sub _write_vms {
155 my($data) = @_;
a6e61155 156
f1387719 157 require Config; # a reminder for once we do $^O
ff0cee69 158 require ExtUtils::XSSymSet;
a6e61155 159
160 my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
ff0cee69 161 my($set) = new ExtUtils::XSSymSet;
c07a80fd 162 my($sym);
163
164 rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
165
166 open(OPT,">$data->{FILE}.opt")
167 or croak("Can't create $data->{FILE}.opt: $!\n");
168
169 # Options file declaring universal symbols
170 # Used when linking shareable image for dynamic extension,
171 # or when linking PerlShr into which we've added this package
172 # as a static extension
173 # We don't do anything to preserve order, so we won't relax
174 # the GSMATCH criteria for a dynamic extension
175
176 foreach $sym (@{$data->{FUNCLIST}}) {
ff0cee69 177 my $safe = $set->addsym($sym);
178 if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
179 else { print OPT "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
c07a80fd 180 }
181 foreach $sym (@{$data->{DL_VARS}}) {
ff0cee69 182 my $safe = $set->addsym($sym);
c07a80fd 183 print OPT "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
ff0cee69 184 if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
185 else { print OPT "SYMBOL_VECTOR=($safe=DATA)\n"; }
c07a80fd 186 }
187 close OPT;
188
c07a80fd 189}
190
1911;
192
193__END__
194
195=head1 NAME
196
197ExtUtils::Mksymlists - write linker options files for dynamic extension
198
199=head1 SYNOPSIS
200
201 use ExtUtils::Mksymlists;
202 Mksymlists({ NAME => $name ,
203 DL_VARS => [ $var1, $var2, $var3 ],
204 DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
205 $pkg2 => [ $func3 ] });
206
207=head1 DESCRIPTION
208
209C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
1fef88e7 210during the creation of shared libraries for dynamic extensions. It is
c07a80fd 211normally called from a MakeMaker-generated Makefile when the extension
212is built. The linker option file is generated by calling the function
213C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
214It takes one argument, a list of key-value pairs, in which the following
215keys are recognized:
216
2ae324a7 217=over
218
875fa795 219=item DLBASE
c07a80fd 220
875fa795 221This item specifies the name by which the linker knows the
222extension, which may be different from the name of the
223extension itself (for instance, some linkers add an '_' to the
224name of the extension). If it is not specified, it is derived
225from the NAME attribute. It is presently used only by OS2 and Win32.
c07a80fd 226
227=item DL_FUNCS
228
229This is identical to the DL_FUNCS attribute available via MakeMaker,
230from which it is usually taken. Its value is a reference to an
231associative array, in which each key is the name of a package, and
232each value is an a reference to an array of function names which
233should be exported by the extension. For instance, one might say
875fa795 234C<DL_FUNCS =E<gt> { Homer::Iliad =E<gt> [ qw(trojans greeks) ],
a5f75d66 235Homer::Odyssey =E<gt> [ qw(travellers family suitors) ] }>. The
c07a80fd 236function names should be identical to those in the XSUB code;
237C<Mksymlists> will alter the names written to the linker option
238file to match the changes made by F<xsubpp>. In addition, if
239none of the functions in a list begin with the string B<boot_>,
240C<Mksymlists> will add a bootstrap function for that package,
241just as xsubpp does. (If a B<boot_E<lt>pkgE<gt>> function is
242present in the list, it is passed through unchanged.) If
243DL_FUNCS is not specified, it defaults to the bootstrap
244function for the extension specified in NAME.
245
246=item DL_VARS
247
248This is identical to the DL_VARS attribute available via MakeMaker,
249and, like DL_FUNCS, it is usually specified via MakeMaker. Its
250value is a reference to an array of variable names which should
251be exported by the extension.
252
253=item FILE
254
255This key can be used to specify the name of the linker option file
256(minus the OS-specific extension), if for some reason you do not
257want to use the default value, which is the last word of the NAME
875fa795 258attribute (I<e.g.> for C<Tk::Canvas>, FILE defaults to C<Canvas>).
c07a80fd 259
260=item FUNCLIST
261
262This provides an alternate means to specify function names to be
263exported from the extension. Its value is a reference to an
264array of function names to be exported by the extension. These
265names are passed through unaltered to the linker options file.
de592821 266Specifying a value for the FUNCLIST attribute suppresses automatic
875fa795 267generation of the bootstrap function for the package. To still create
268the bootstrap name you have to specify the package name in the
269DL_FUNCS hash:
c07a80fd 270
875fa795 271 Mksymlists({ NAME => $name ,
272 FUNCLIST => [ $func1, $func2 ],
273 DL_FUNCS => { $pkg => [] } });
c07a80fd 274
875fa795 275
276=item IMPORTS
277
278This attribute is used to specify names to be imported into the
279extension. It is currently only used by OS/2 and Win32.
280
281=item NAME
282
283This gives the name of the extension (I<e.g.> C<Tk::Canvas>) for which
284the linker option file will be produced.
c07a80fd 285
2ae324a7 286=back
287
c07a80fd 288When calling C<Mksymlists>, one should always specify the NAME
289attribute. In most cases, this is all that's necessary. In
290the case of unusual extensions, however, the other attributes
291can be used to provide additional information to the linker.
292
293=head1 AUTHOR
294
bd3fa61c 295Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>>
c07a80fd 296
297=head1 REVISION
298
a5f75d66 299Last revised 14-Feb-1996, for Perl 5.002.