BeOS update (Mirror maint-5.005 change #2727).
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Embed.pm
index 45ccbe6..4b56e88 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Embed.pm,v 1.17 1996/07/02 13:48:17 dougm Exp $
+# $Id: Embed.pm,v 1.2501 $
 require 5.002;
 
 package ExtUtils::Embed;
@@ -17,11 +17,7 @@ use vars qw(@ISA @EXPORT $VERSION
            );
 use strict;
 
-$VERSION = sprintf("%d.%02d", q$Revision: 1.17 $ =~ /(\d+)\.(\d+)/);
-#for the namespace change
-$Devel::embed::VERSION = "99.99";
-
-sub Version { $VERSION; }
+$VERSION = sprintf("%d.%02d", q$Revision: 1.2505 $ =~ /(\d+)\.(\d+)/);
 
 @ISA = qw(Exporter);
 @EXPORT = qw(&xsinit &ldopts 
@@ -35,10 +31,27 @@ sub Version { $VERSION; }
 $Verbose = 0;
 $lib_ext = $Config{lib_ext} || '.a';
 
+sub is_cmd { $0 eq '-e' }
+
+sub my_return {
+    my $val = shift;
+    if(is_cmd) {
+       print $val;
+    }
+    else {
+       return $val;
+    }
+}
+
+sub is_perl_object {
+    $Config{ccflags} =~ /-DPERL_OBJECT/;  
+}
+
 sub xsinit { 
     my($file, $std, $mods) = @_;
     my($fh,@mods,%seen);
     $file ||= "perlxsi.c";
+    my $xsinit_proto = is_perl_object() ? "CPERLarg" : "void";
 
     if (@_) {
        @mods = @$mods if $mods;
@@ -62,10 +75,10 @@ sub xsinit {
     @mods = grep(!$seen{$_}++, @mods);
 
     print $fh &xsi_header();
-    print $fh "EXTERN_C void xs_init _((void));\n\n";     
+    print $fh "EXTERN_C void xs_init _(($xsinit_proto));\n\n";     
     print $fh &xsi_protos(@mods);
 
-    print $fh "\nEXTERN_C void\nxs_init()\n{\n";
+    print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
     print $fh &xsi_body(@mods);
     print $fh "}\n";
 
@@ -73,14 +86,24 @@ sub xsinit {
 
 sub xsi_header {
     return <<EOF;
-#ifdef __cplusplus
+#if defined(__cplusplus) && !defined(PERL_OBJECT)
+#define is_cplusplus
+#endif
+
+#ifdef is_cplusplus
 extern "C" {
 #endif
 
 #include <EXTERN.h>
 #include <perl.h>
-
-#ifdef __cplusplus
+#ifdef PERL_OBJECT
+#define NO_XSLOCKS
+#include <XSUB.h>
+#include "win32iop.h"
+#include <fcntl.h>
+#include <perlhost.h>
+#endif
+#ifdef is_cplusplus
 }
 #  ifndef EXTERN_C
 #    define EXTERN_C extern "C"
@@ -97,13 +120,14 @@ EOF
 sub xsi_protos {
     my(@exts) = @_;
     my(@retval,%seen);
-
+    my $boot_proto = is_perl_object() ? 
+       "CV* cv _CPERLarg" : "CV* cv";
     foreach $_ (@exts){
         my($pname) = canon('/', $_);
         my($mname, $cname);
         ($mname = $pname) =~ s!/!::!g;
         ($cname = $pname) =~ s!/!__!g;
-       my($ccode) = "EXTERN_C void boot_${cname} _((CV* cv));\n";
+       my($ccode) = "EXTERN_C void boot_${cname} _(($boot_proto));\n";
        next if $seen{$ccode}++;
         push(@retval, $ccode);
     }
@@ -114,8 +138,9 @@ sub xsi_body {
     my(@exts) = @_;
     my($pname,@retval,%seen);
     my($dl) = canon('/','DynaLoader');
+    push(@retval, "\tchar *file = __FILE__;\n");
     push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
-    push(@retval, "\tchar *file = __FILE__;\n\n");
+    push(@retval, "\n");
 
     foreach $_ (@exts){
         my($pname) = canon('/', $_);
@@ -176,7 +201,7 @@ sub ldopts {
     my($mod,@ns,$root,$sub,$extra,$archive,@archives);
     print STDERR "Searching (@path) for archives\n" if $Verbose;
     foreach $mod (@mods) {
-       @ns = split('::', $mod);
+       @ns = split(/::|\/|\\/, $mod);
        $sub = $ns[-1];
        $root = $MM->catdir(@ns);
        
@@ -199,36 +224,36 @@ sub ldopts {
     }
     #print STDERR "\@potential_libs = @potential_libs\n";
 
+    my $libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0] || "-lperl";
+
     my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
        $MM->ext(join ' ', 
-                $MM->catdir("-L$Config{archlib}", "CORE"), " -lperl", 
+                $MM->catdir("-L$Config{archlibexp}", "CORE"), " $libperl", 
                 @potential_libs);
 
     my $ld_or_bs = $bsloadlibs || $ldloadlibs;
     print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
-    my $linkage = "$Config{ldflags} @archives $ld_or_bs";
+    my $linkage = "$Config{ccdlflags} $Config{ldflags} @archives $ld_or_bs";
     print STDERR "ldopts: '$linkage'\n" if $Verbose;
 
     return $linkage if scalar @_;
-    print "$linkage\n";
+    my_return("$linkage\n");
 }
 
 sub ccflags {
-   print " $Config{ccflags} ";
+    my_return(" $Config{ccflags} ");
 }
 
 sub ccdlflags {
-   print " $Config{ccdlflags} ";
+    my_return(" $Config{ccdlflags} ");
 }
 
 sub perl_inc {
-   print " -I $Config{archlib}/CORE ";
+    my_return(" -I$Config{archlibexp}/CORE ");
 }
 
 sub ccopts {
-   ccflags;
-   ccdlflags;
-   perl_inc;
+   ccflags . perl_inc;
 }
 
 sub canon {
@@ -265,20 +290,22 @@ functions while building your application.
 =head1 @EXPORT
 
 ExtUtils::Embed exports the following functions:
-L<xsinit()>, L<ldopts()>, L<ccopts()>, L<perl_inc()>, L<ccflags()>, 
-L<ccdlflags()>, L<xsi_header()>, L<xsi_protos()>, L<xsi_body()>
+
+xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(), 
+ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
 
 =head1 FUNCTIONS
 
+=over
+
 =item xsinit()
 
-Generate C/C++ code for the XS intializer function.
+Generate C/C++ code for the XS initializer function.
 
 When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
 the following options are recognized:
 
-B<-o> <output filename> (Defaults to B<perlxsi.c>)
+B<-o> E<lt>output filenameE<gt> (Defaults to B<perlxsi.c>)
 
 B<-o STDOUT> will print to STDOUT.
 
@@ -301,7 +328,7 @@ B<[@modules]> is an array ref, same as additional arguments mentioned above.
 
 =item Examples
 
+
  perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
 
 
@@ -340,7 +367,7 @@ B<-std>
 Output arguments for linking the Perl library and any extensions linked
 with the current Perl.
 
-B<-I> <path1:path2>
+B<-I> E<lt>path1:path2E<gt>
 
 Search path for ModuleName.a archives.  
 Default path is B<@INC>.
@@ -355,7 +382,7 @@ we should find B<auto/DBD/Oracle/Oracle.a>
 Keep in mind, you can always supply B</my/own/path/ModuleName.a>
 as an additional linker argument.
 
-B<-->  <list of linker args>
+B<-->  E<lt>list of linker argsE<gt>
 
 Additional linker arguments to be considered.
 
@@ -389,13 +416,13 @@ This will print arguments for linking with B<libperl.a>, B<DynaLoader> and
 extensions found in B<$Config{static_ext}>.  This includes libraries
 found in B<$Config{libs}> and the first ModuleName.a library
 for each extension that is found by searching B<@INC> or the path 
-specifed by the B<-I> option.  
+specified by the B<-I> option.  
 In addition, when ModuleName.a is found, additional linker arguments
 are picked up from the B<extralibs.ld> file in the same directory.
 
 
  perl -MExtUtils::Embed -e ldopts -- -std Socket
+
 
 This will do the same as the above example, along with printing additional arguments for linking with the B<Socket> extension.
 
@@ -419,11 +446,11 @@ conflict, the additional arguments will be part of the output.
 
 For including perl header files this function simply prints:
 
- -I $Config{archlib}/CORE  
+ -I$Config{archlibexp}/CORE  
 
 So, rather than having to say:
 
- perl -MConfig -e 'print "-I $Config{archlib}/CORE"'
+ perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
 
 Just say:
 
@@ -453,21 +480,23 @@ function to B<boot_ModuleName> for each @modules.
 
 B<xsinit()> uses the xsi_* functions to generate most of it's code.
 
+=back
+
 =head1 EXAMPLES
 
 For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
-with embedded perl, see the eg/ directory and the I<perlembed> man page.
+with embedded perl, see the eg/ directory and L<perlembed>.
+
 =head1 SEE ALSO
 
-the I<perlembed> man page
+L<perlembed>
 
 =head1 AUTHOR
 
-Doug MacEachern <dougm@osf.org>
+Doug MacEachern E<lt>F<dougm@osf.org>E<gt>
 
-Based on ideas from Tim Bunce <Tim.Bunce@ig.co.uk> and
-B<minimod.pl> by Andreas Koenig <k@anna.in-berlin.de> and Tim Bunce.
+Based on ideas from Tim Bunce E<lt>F<Tim.Bunce@ig.co.uk>E<gt> and
+B<minimod.pl> by Andreas Koenig E<lt>F<k@anna.in-berlin.de>E<gt> and Tim Bunce.
 
 =cut