make xsubpp skip embedded pod (from Matthias Neeracher
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Mksymlists.pm
CommitLineData
c07a80fd 1package ExtUtils::Mksymlists;
cb50131a 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;
cb50131a 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";
146174a9 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
8c99d73e 160 my($isvax) = $Config::Config{'archname'} =~ /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
80601f72 176 print OPT "case_sensitive=yes\n"
177 if $Config::Config{d_vms_case_sensitive_symbols};
c07a80fd 178 foreach $sym (@{$data->{FUNCLIST}}) {
ff0cee69 179 my $safe = $set->addsym($sym);
180 if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
181 else { print OPT "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
c07a80fd 182 }
183 foreach $sym (@{$data->{DL_VARS}}) {
ff0cee69 184 my $safe = $set->addsym($sym);
c07a80fd 185 print OPT "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
ff0cee69 186 if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
187 else { print OPT "SYMBOL_VECTOR=($safe=DATA)\n"; }
c07a80fd 188 }
189 close OPT;
190
c07a80fd 191}
192
1931;
194
195__END__
196
197=head1 NAME
198
199ExtUtils::Mksymlists - write linker options files for dynamic extension
200
201=head1 SYNOPSIS
202
203 use ExtUtils::Mksymlists;
204 Mksymlists({ NAME => $name ,
205 DL_VARS => [ $var1, $var2, $var3 ],
206 DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
207 $pkg2 => [ $func3 ] });
208
209=head1 DESCRIPTION
210
211C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
1fef88e7 212during the creation of shared libraries for dynamic extensions. It is
c07a80fd 213normally called from a MakeMaker-generated Makefile when the extension
214is built. The linker option file is generated by calling the function
215C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
216It takes one argument, a list of key-value pairs, in which the following
217keys are recognized:
218
2ae324a7 219=over
220
875fa795 221=item DLBASE
c07a80fd 222
875fa795 223This item specifies the name by which the linker knows the
224extension, which may be different from the name of the
225extension itself (for instance, some linkers add an '_' to the
226name of the extension). If it is not specified, it is derived
227from the NAME attribute. It is presently used only by OS2 and Win32.
c07a80fd 228
229=item DL_FUNCS
230
231This is identical to the DL_FUNCS attribute available via MakeMaker,
232from which it is usually taken. Its value is a reference to an
233associative array, in which each key is the name of a package, and
234each value is an a reference to an array of function names which
235should be exported by the extension. For instance, one might say
875fa795 236C<DL_FUNCS =E<gt> { Homer::Iliad =E<gt> [ qw(trojans greeks) ],
a5f75d66 237Homer::Odyssey =E<gt> [ qw(travellers family suitors) ] }>. The
c07a80fd 238function names should be identical to those in the XSUB code;
239C<Mksymlists> will alter the names written to the linker option
240file to match the changes made by F<xsubpp>. In addition, if
241none of the functions in a list begin with the string B<boot_>,
242C<Mksymlists> will add a bootstrap function for that package,
243just as xsubpp does. (If a B<boot_E<lt>pkgE<gt>> function is
244present in the list, it is passed through unchanged.) If
245DL_FUNCS is not specified, it defaults to the bootstrap
246function for the extension specified in NAME.
247
248=item DL_VARS
249
250This is identical to the DL_VARS attribute available via MakeMaker,
251and, like DL_FUNCS, it is usually specified via MakeMaker. Its
252value is a reference to an array of variable names which should
253be exported by the extension.
254
255=item FILE
256
257This key can be used to specify the name of the linker option file
258(minus the OS-specific extension), if for some reason you do not
259want to use the default value, which is the last word of the NAME
875fa795 260attribute (I<e.g.> for C<Tk::Canvas>, FILE defaults to C<Canvas>).
c07a80fd 261
262=item FUNCLIST
263
264This provides an alternate means to specify function names to be
265exported from the extension. Its value is a reference to an
266array of function names to be exported by the extension. These
267names are passed through unaltered to the linker options file.
de592821 268Specifying a value for the FUNCLIST attribute suppresses automatic
875fa795 269generation of the bootstrap function for the package. To still create
270the bootstrap name you have to specify the package name in the
271DL_FUNCS hash:
c07a80fd 272
875fa795 273 Mksymlists({ NAME => $name ,
274 FUNCLIST => [ $func1, $func2 ],
275 DL_FUNCS => { $pkg => [] } });
c07a80fd 276
875fa795 277
278=item IMPORTS
279
280This attribute is used to specify names to be imported into the
281extension. It is currently only used by OS/2 and Win32.
282
283=item NAME
284
285This gives the name of the extension (I<e.g.> C<Tk::Canvas>) for which
286the linker option file will be produced.
c07a80fd 287
2ae324a7 288=back
289
c07a80fd 290When calling C<Mksymlists>, one should always specify the NAME
291attribute. In most cases, this is all that's necessary. In
292the case of unusual extensions, however, the other attributes
293can be used to provide additional information to the linker.
294
295=head1 AUTHOR
296
bd3fa61c 297Charles Bailey I<E<lt>bailey@newman.upenn.eduE<gt>>
c07a80fd 298
299=head1 REVISION
300
a5f75d66 301Last revised 14-Feb-1996, for Perl 5.002.