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