This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Provide support for types PVN and UNDEF in
[perl5.git] / lib / ExtUtils / CBuilder.pm
CommitLineData
6b09c160
YST
1package ExtUtils::CBuilder;
2
3use File::Spec ();
4use File::Path ();
5use File::Basename ();
6
7use vars qw($VERSION @ISA);
ce87d91c 8$VERSION = '0.15';
6b09c160
YST
9$VERSION = eval $VERSION;
10
11# Okay, this is the brute-force method of finding out what kind of
12# platform we're on. I don't know of a systematic way. These values
13# came from the latest (bleadperl) perlport.pod.
14
15my %OSTYPES = qw(
16 aix Unix
17 bsdos Unix
18 dgux Unix
19 dynixptx Unix
20 freebsd Unix
21 linux Unix
22 hpux Unix
23 irix Unix
24 darwin Unix
25 machten Unix
26 next Unix
27 openbsd Unix
28 netbsd Unix
29 dec_osf Unix
30 svr4 Unix
31 svr5 Unix
32 sco_sv Unix
33 unicos Unix
34 unicosmk Unix
35 solaris Unix
36 sunos Unix
37 cygwin Unix
38 os2 Unix
39
40 dos Windows
41 MSWin32 Windows
42
43 os390 EBCDIC
44 os400 EBCDIC
45 posix-bc EBCDIC
46 vmesa EBCDIC
47
48 MacOS MacOS
49 VMS VMS
50 VOS VOS
51 riscos RiscOS
52 amigaos Amiga
53 mpeix MPEiX
54 );
55
56# We only use this once - don't waste a symbol table entry on it.
57# More importantly, don't make it an inheritable method.
58my $load = sub {
59 my $mod = shift;
60 eval "use $mod";
61 die $@ if $@;
62 @ISA = ($mod);
63};
64
65{
66 my @package = split /::/, __PACKAGE__;
67
68 if (grep {-e File::Spec->catfile($_, @package, 'Platform', $^O) . '.pm'} @INC) {
69 $load->(__PACKAGE__ . "::Platform::$^O");
70
71 } elsif (exists $OSTYPES{$^O} and
72 grep {-e File::Spec->catfile($_, @package, 'Platform', $OSTYPES{$^O}) . '.pm'} @INC) {
73 $load->(__PACKAGE__ . "::Platform::$OSTYPES{$^O}");
74
75 } else {
76 $load->(__PACKAGE__ . "::Base");
77 }
78}
79
80sub os_type { $OSTYPES{$^O} }
81
821;
83__END__
84
85=head1 NAME
86
87ExtUtils::CBuilder - Compile and link C code for Perl modules
88
89=head1 SYNOPSIS
90
91 use ExtUtils::CBuilder;
92
93 my $b = ExtUtils::CBuilder->new(%options);
94 $obj_file = $b->compile(source => 'MyModule.c');
95 $lib_file = $b->link(objects => $obj_file);
96
97=head1 DESCRIPTION
98
99This module can build the C portions of Perl modules by invoking the
100appropriate compilers and linkers in a cross-platform manner. It was
101motivated by the C<Module::Build> project, but may be useful for other
102purposes as well. However, it is I<not> intended as a general
103cross-platform interface to all your C building needs. That would
104have been a much more ambitious goal!
105
106=head1 METHODS
107
108=over 4
109
110=item new
111
112Returns a new C<ExtUtils::CBuilder> object. A C<config> parameter
113lets you override C<Config.pm> settings for all operations performed
114by the object, as in the following example:
115
116 # Use a different compiler than Config.pm says
117 my $b = ExtUtils::CBuilder->new( config =>
118 { ld => 'gcc' } );
119
120=item have_compiler
121
122Returns true if the current system has a working C compiler and
123linker, false otherwise. To determine this, we actually compile and
124link a sample C library.
125
126=item compile
127
128Compiles a C source file and produces an object file. The name of the
129object file is returned. The source file is specified in a C<source>
130parameter, which is required; the other parameters listed below are
131optional.
132
133=over 4
134
135=item C<object_file>
136
137Specifies the name of the output file to create. Otherwise the
138C<object_file()> method will be consulted, passing it the name of the
139C<source> file.
140
141=item C<include_dirs>
142
143Specifies any additional directories in which to search for header
144files. May be given as a string indicating a single directory, or as
145a list reference indicating multiple directories.
146
147=item C<extra_compiler_flags>
148
149Specifies any additional arguments to pass to the compiler. Should be
150given as a list reference containing the arguments individually, or if
151this is not possible, as a string containing all the arguments
152together.
153
154=back
155
156The operation of this method is also affected by the
345dbb93 157C<archlibexp>, C<cccdlflags>, C<ccflags>, C<optimize>, and C<cc>
6b09c160
YST
158entries in C<Config.pm>.
159
160=item link
161
162Invokes the linker to produce a library file from object files. In
163scalar context, the name of the library file is returned. In list
164context, the library file and any temporary files created are
165returned. A required C<objects> parameter contains the name of the
166object files to process, either in a string (for one object file) or
167list reference (for one or more files). The following parameters are
168optional:
169
170
171=over 4
172
173=item lib_file
174
175Specifies the name of the output library file to create. Otherwise
176the C<lib_file()> method will be consulted, passing it the name of
177the first entry in C<objects>.
178
179=item module_name
180
181Specifies the name of the Perl module that will be created by linking.
182On platforms that need to do prelinking (Win32, OS/2, etc.) this is a
183required parameter.
184
185=item extra_linker_flags
186
187Any additional flags you wish to pass to the linker.
188
189=back
190
191On platforms where C<need_prelink()> returns true, C<prelink()>
192will be called automatically.
193
194The operation of this method is also affected by the C<lddlflags>,
195C<shrpenv>, and C<ld> entries in C<Config.pm>.
196
197=item link_executable
198
199Invokes the linker to produce an executable file from object files. In
200scalar context, the name of the executable file is returned. In list
201context, the executable file and any temporary files created are
202returned. A required C<objects> parameter contains the name of the
203object files to process, either in a string (for one object file) or
204list reference (for one or more files). The optional parameters are
205the same as C<link> with exception for
206
207
208=over 4
209
210=item exe_file
211
212Specifies the name of the output executable file to create. Otherwise
213the C<exe_file()> method will be consulted, passing it the name of the
214first entry in C<objects>.
215
216=back
217
218=item object_file
219
220 my $object_file = $b->object_file($source_file);
221
222Converts the name of a C source file to the most natural name of an
223output object file to create from it. For instance, on Unix the
224source file F<foo.c> would result in the object file F<foo.o>.
225
226=item lib_file
227
228 my $lib_file = $b->lib_file($object_file);
229
230Converts the name of an object file to the most natural name of a
231output library file to create from it. For instance, on Mac OS X the
232object file F<foo.o> would result in the library file F<foo.bundle>.
233
234=item exe_file
235
236 my $exe_file = $b->exe_file($object_file);
237
238Converts the name of an object file to the most natural name of an
239executable file to create from it. For instance, on Mac OS X the
240object file F<foo.o> would result in the executable file F<foo>, and
241on Windows it would result in F<foo.exe>.
242
243
244=item prelink
245
246On certain platforms like Win32, OS/2, VMS, and AIX, it is necessary
247to perform some actions before invoking the linker. The
248C<ExtUtils::Mksymlists> module does this, writing files used by the
249linker during the creation of shared libraries for dynamic extensions.
250The names of any files written will be returned as a list.
251
252Several parameters correspond to C<ExtUtils::Mksymlists::Mksymlists()>
253options, as follows:
254
255 Mksymlists() prelink() type
256 -------------|-------------------|-------------------
257 NAME | dl_name | string (required)
258 DLBASE | dl_base | string
259 FILE | dl_file | string
260 DL_VARS | dl_vars | array reference
261 DL_FUNCS | dl_funcs | hash reference
262 FUNCLIST | dl_func_list | array reference
263 IMPORTS | dl_imports | hash reference
ce87d91c 264 VERSION | dl_version | string
6b09c160
YST
265
266Please see the documentation for C<ExtUtils::Mksymlists> for the
267details of what these parameters do.
268
269=item need_prelink
270
271Returns true on platforms where C<prelink()> should be called
272during linking, and false otherwise.
273
ce87d91c
SP
274=item extra_link_args_after_prelink
275
276Returns list of extra arguments to give to the link command; the arguments
277are the same as for prelink(), with addition of array reference to the
278results of prelink(); this reference is indexed by key C<prelink_res>.
279
6b09c160
YST
280=back
281
282=head1 TO DO
283
284Currently this has only been tested on Unix and doesn't contain any of
285the Windows-specific code from the C<Module::Build> project. I'll do
286that next.
287
288=head1 HISTORY
289
290This module is an outgrowth of the C<Module::Build> project, to which
291there have been many contributors. Notably, Randy W. Sims submitted
292lots of code to support 3 compilers on Windows and helped with various
ce87d91c
SP
293other platform-specific issues. Ilya Zakharevich has contributed
294fixes for OS/2; John E. Malmberg and Peter Prymmer have done likewise
295for VMS.
6b09c160
YST
296
297=head1 AUTHOR
298
299Ken Williams, kwilliams@cpan.org
300
301=head1 COPYRIGHT
302
303Copyright (c) 2003-2005 Ken Williams. All rights reserved.
304
305This library is free software; you can redistribute it and/or
306modify it under the same terms as Perl itself.
307
308=head1 SEE ALSO
309
310perl(1), Module::Build(3)
311
312=cut