1 # $Id: Embed.pm,v 1.2501 $
4 package ExtUtils::Embed;
10 #Only when we need them
11 #require ExtUtils::MakeMaker;
12 #require ExtUtils::Liblist;
14 use vars qw(@ISA @EXPORT $VERSION
15 @Extensions $Verbose $lib_ext
20 $VERSION = sprintf("%d.%02d", q$Revision: 1.2505 $ =~ /(\d+)\.(\d+)/);
23 @EXPORT = qw(&xsinit &ldopts
24 &ccopts &ccflags &ccdlflags &perl_inc
25 &xsi_header &xsi_protos &xsi_body);
27 #let's have Miniperl borrow from us instead
28 #require ExtUtils::Miniperl;
29 #*canon = \&ExtUtils::Miniperl::canon;
32 $lib_ext = $Config{lib_ext} || '.a';
34 sub is_cmd { $0 eq '-e' }
47 $Config{ccflags} =~ /-DPERL_OBJECT/;
51 my($file, $std, $mods) = @_;
53 $file ||= "perlxsi.c";
54 my $xsinit_proto = "pTHXo";
57 @mods = @$mods if $mods;
61 $file = $opt_o if defined $opt_o;
62 $std = $opt_s if defined $opt_s;
65 $std = 1 unless scalar @mods;
67 if ($file eq "STDOUT") {
71 $fh = new FileHandle "> $file";
74 push(@mods, static_ext()) if defined $std;
75 @mods = grep(!$seen{$_}++, @mods);
77 print $fh &xsi_header();
78 print $fh "EXTERN_C void xs_init ($xsinit_proto);\n\n";
79 print $fh &xsi_protos(@mods);
81 print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
82 print $fh &xsi_body(@mods);
89 #if defined(__cplusplus) && !defined(PERL_OBJECT)
102 #include "win32iop.h"
104 #include <perlhost.h>
109 # define EXTERN_C extern "C"
113 # define EXTERN_C extern
123 my $boot_proto = "pTHXo_ CV* cv";
125 my($pname) = canon('/', $_);
127 ($mname = $pname) =~ s!/!::!g;
128 ($cname = $pname) =~ s!/!__!g;
129 my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
130 next if $seen{$ccode}++;
131 push(@retval, $ccode);
133 return join '', @retval;
138 my($pname,@retval,%seen);
139 my($dl) = canon('/','DynaLoader');
140 push(@retval, "\tchar *file = __FILE__;\n");
141 push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
145 my($pname) = canon('/', $_);
146 my($mname, $cname, $ccode);
147 ($mname = $pname) =~ s!/!::!g;
148 ($cname = $pname) =~ s!/!__!g;
150 # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
151 # boot_DynaLoader is called directly in DynaLoader.pm
152 $ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
153 push(@retval, $ccode) unless $seen{$ccode}++;
155 $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
156 push(@retval, $ccode) unless $seen{$ccode}++;
159 return join '', @retval;
163 unless (scalar @Extensions) {
164 @Extensions = sort split /\s+/, $Config{static_ext};
165 unshift @Extensions, qw(DynaLoader);
171 require ExtUtils::MakeMaker;
172 require ExtUtils::Liblist;
173 my($std,$mods,$link_args,$path) = @_;
174 my(@mods,@link_args,@argv);
175 my($dllib,$config_libs,@potential_libs,@path);
176 local($") = ' ' unless $" eq ' ';
177 my $MM = bless {} => 'MY';
179 @link_args = @$link_args if $link_args;
180 @mods = @$mods if $mods;
185 while($_ = shift @argv) {
186 /^-std$/ && do { $std = 1; next; };
187 /^--$/ && do { @link_args = @argv; last; };
188 /^-I(.*)/ && do { $path = $1 || shift @argv; next; };
192 $std = 1 unless scalar @link_args;
193 @path = $path ? split(/:/, $path) : @INC;
195 push(@potential_libs, @link_args) if scalar @link_args;
196 push(@potential_libs, $Config{libs}) if defined $std;
198 push(@mods, static_ext()) if $std;
200 my($mod,@ns,$root,$sub,$extra,$archive,@archives);
201 print STDERR "Searching (@path) for archives\n" if $Verbose;
202 foreach $mod (@mods) {
203 @ns = split(/::|\/|\\/, $mod);
205 $root = $MM->catdir(@ns);
207 print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose;
209 next unless -e ($archive = $MM->catdir($_,"auto",$root,"$sub$lib_ext"));
210 push @archives, $archive;
211 if(-e ($extra = $MM->catdir($_,"auto",$root,"extralibs.ld"))) {
213 if(open(FH, $extra)) {
214 my($libs) = <FH>; chomp $libs;
215 push @potential_libs, split /\s+/, $libs;
218 warn "Couldn't open '$extra'";
224 #print STDERR "\@potential_libs = @potential_libs\n";
226 my $libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0] || "-lperl";
228 my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
230 $MM->catdir("-L$Config{archlibexp}", "CORE"), " $libperl",
233 my $ld_or_bs = $bsloadlibs || $ldloadlibs;
234 print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
235 my $linkage = "$Config{ccdlflags} $Config{ldflags} @archives $ld_or_bs";
236 print STDERR "ldopts: '$linkage'\n" if $Verbose;
238 return $linkage if scalar @_;
239 my_return("$linkage\n");
243 my_return(" $Config{ccflags} ");
247 my_return(" $Config{ccdlflags} ");
251 my_return(" -I$Config{archlibexp}/CORE ");
261 # might be X::Y or lib/auto/X/Y/Y.a
263 s:^(lib|ext)/(auto/)?::;
266 grep(s:/:$as:, @ext) if ($as ne '/');
274 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
279 perl -MExtUtils::Embed -e xsinit
280 perl -MExtUtils::Embed -e ldopts
284 ExtUtils::Embed provides utility functions for embedding a Perl interpreter
285 and extensions in your C/C++ applications.
286 Typically, an application B<Makefile> will invoke ExtUtils::Embed
287 functions while building your application.
291 ExtUtils::Embed exports the following functions:
293 xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(),
294 ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
302 Generate C/C++ code for the XS initializer function.
304 When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
305 the following options are recognized:
307 B<-o> E<lt>output filenameE<gt> (Defaults to B<perlxsi.c>)
309 B<-o STDOUT> will print to STDOUT.
311 B<-std> (Write code for extensions that are linked with the current Perl.)
313 Any additional arguments are expected to be names of modules
314 to generate code for.
316 When invoked with parameters the following are accepted and optional:
318 C<xsinit($filename,$std,[@modules])>
322 B<$filename> is equivalent to the B<-o> option.
324 B<$std> is boolean, equivalent to the B<-std> option.
326 B<[@modules]> is an array ref, same as additional arguments mentioned above.
331 perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
334 This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function
335 to the C B<boot_Socket> function and writes it to a file named F<xsinit.c>.
337 Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
339 perl -MExtUtils::Embed -e xsinit
342 This will generate code for linking with B<DynaLoader> and
343 each static extension found in B<$Config{static_ext}>.
344 The code is written to the default file name B<perlxsi.c>.
347 perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle
350 Here, code is written for all the currently linked extensions along with code
351 for B<DBI> and B<DBD::Oracle>.
353 If you have a working B<DynaLoader> then there is rarely any need to statically link in any
358 Output arguments for linking the Perl library and extensions to your
361 When invoked as C<`perl -MExtUtils::Embed -e ldopts --`>
362 the following options are recognized:
366 Output arguments for linking the Perl library and any extensions linked
367 with the current Perl.
369 B<-I> E<lt>path1:path2E<gt>
371 Search path for ModuleName.a archives.
372 Default path is B<@INC>.
373 Library archives are expected to be found as
374 B</some/path/auto/ModuleName/ModuleName.a>
375 For example, when looking for B<Socket.a> relative to a search path,
376 we should find B<auto/Socket/Socket.a>
378 When looking for B<DBD::Oracle> relative to a search path,
379 we should find B<auto/DBD/Oracle/Oracle.a>
381 Keep in mind that you can always supply B</my/own/path/ModuleName.a>
382 as an additional linker argument.
384 B<--> E<lt>list of linker argsE<gt>
386 Additional linker arguments to be considered.
388 Any additional arguments found before the B<--> token
389 are expected to be names of modules to generate code for.
391 When invoked with parameters the following are accepted and optional:
393 C<ldopts($std,[@modules],[@link_args],$path)>
397 B<$std> is boolean, equivalent to the B<-std> option.
399 B<[@modules]> is equivalent to additional arguments found before the B<--> token.
401 B<[@link_args]> is equivalent to arguments found after the B<--> token.
403 B<$path> is equivalent to the B<-I> option.
405 In addition, when ldopts is called with parameters, it will return the argument string
406 rather than print it to STDOUT.
411 perl -MExtUtils::Embed -e ldopts
414 This will print arguments for linking with B<libperl.a>, B<DynaLoader> and
415 extensions found in B<$Config{static_ext}>. This includes libraries
416 found in B<$Config{libs}> and the first ModuleName.a library
417 for each extension that is found by searching B<@INC> or the path
418 specified by the B<-I> option.
419 In addition, when ModuleName.a is found, additional linker arguments
420 are picked up from the B<extralibs.ld> file in the same directory.
423 perl -MExtUtils::Embed -e ldopts -- -std Socket
426 This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
429 perl -MExtUtils::Embed -e ldopts -- DynaLoader
432 This will print arguments for linking with just the B<DynaLoader> extension
436 perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql
439 Any arguments after the second '--' token are additional linker
440 arguments that will be examined for potential conflict. If there is no
441 conflict, the additional arguments will be part of the output.
446 For including perl header files this function simply prints:
448 -I$Config{archlibexp}/CORE
450 So, rather than having to say:
452 perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
456 perl -MExtUtils::Embed -e perl_inc
458 =item ccflags(), ccdlflags()
460 These functions simply print $Config{ccflags} and $Config{ccdlflags}
464 This function combines perl_inc(), ccflags() and ccdlflags() into one.
468 This function simply returns a string defining the same B<EXTERN_C> macro as
469 B<perlmain.c> along with #including B<perl.h> and B<EXTERN.h>.
471 =item xsi_protos(@modules)
473 This function returns a string of B<boot_$ModuleName> prototypes for each @modules.
475 =item xsi_body(@modules)
477 This function returns a string of calls to B<newXS()> that glue the module B<bootstrap>
478 function to B<boot_ModuleName> for each @modules.
480 B<xsinit()> uses the xsi_* functions to generate most of it's code.
486 For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
487 with embedded perl, see the eg/ directory and L<perlembed>.
495 Doug MacEachern E<lt>F<dougm@osf.org>E<gt>
497 Based on ideas from Tim Bunce E<lt>F<Tim.Bunce@ig.co.uk>E<gt> and
498 B<minimod.pl> by Andreas Koenig E<lt>F<k@anna.in-berlin.de>E<gt> and Tim Bunce.