SYN SYN
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Embed.pm
index 04ce176..c4167a3 100644 (file)
@@ -43,10 +43,15 @@ sub my_return {
     }
 }
 
+sub is_perl_object {
+    $Config{ccflags} =~ /-DPERL_OBJECT/;  
+}
+
 sub xsinit { 
     my($file, $std, $mods) = @_;
     my($fh,@mods,%seen);
     $file ||= "perlxsi.c";
+    my $xsinit_proto = "pTHXo";
 
     if (@_) {
        @mods = @$mods if $mods;
@@ -70,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";
 
@@ -81,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"
@@ -105,13 +120,13 @@ EOF
 sub xsi_protos {
     my(@exts) = @_;
     my(@retval,%seen);
-
+    my $boot_proto = "pTHXo_ 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);
     }
@@ -178,14 +193,14 @@ sub ldopts {
     @path = $path ? split(/:/, $path) : @INC;
 
     push(@potential_libs, @link_args)    if scalar @link_args;
-    push(@potential_libs, $Config{libs}) if defined $std;
+    push(@potential_libs, $Config{perllibs}) if defined $std;
 
     push(@mods, static_ext()) if $std;
 
     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);
        
@@ -317,7 +332,7 @@ B<[@modules]> is an array ref, same as additional arguments mentioned above.
 
 
 This will generate code with an B<xs_init> function that glues the perl B<Socket::bootstrap> function 
-to the C B<boot_Socket> function and writes it to a file named "xsinit.c".
+to the C B<boot_Socket> function and writes it to a file named F<xsinit.c>.
 
 Note that B<DynaLoader> is a special case where it must call B<boot_DynaLoader> directly.
 
@@ -363,7 +378,7 @@ we should find B<auto/Socket/Socket.a>
 When looking for B<DBD::Oracle> relative to a search path,
 we should find B<auto/DBD/Oracle/Oracle.a>
 
-Keep in mind, you can always supply B</my/own/path/ModuleName.a>
+Keep in mind that you can always supply B</my/own/path/ModuleName.a>
 as an additional linker argument.
 
 B<-->  E<lt>list of linker argsE<gt>
@@ -377,7 +392,7 @@ When invoked with parameters the following are accepted and optional:
 
 C<ldopts($std,[@modules],[@link_args],$path)>
 
-Where,
+Where:
 
 B<$std> is boolean, equivalent to the B<-std> option.  
 
@@ -400,7 +415,7 @@ 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.
 
@@ -469,7 +484,7 @@ B<xsinit()> uses the xsi_* functions to generate most of it's code.
 =head1 EXAMPLES
 
 For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
-with embedded perl, see the eg/ directory and L<perlembed>.
+with embedded perl, see L<perlembed>.
 
 =head1 SEE ALSO