Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Re: Re: In praise of h2xs: A tool you gotta have

by flyingmoose (Priest)
on Mar 29, 2004 at 22:16 UTC ( [id://340777]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: In praise of h2xs: A tool you gotta have
in thread In praise of h2xs: A tool you gotta have

Right -- I figured that from the 'xs' at the end, even though it sounds like Ingy's Inline::C is the preferred method when linking C code into a Perl script/.
This is probably subject to another meditation of some sort, but the way I see it, Inline::C is great, I love it, but it's not suited for distributions into environments where there is not a compiler present -- or for Windows environments either. Thus I doubt it can be the preferred method for production code. Unfortunately, I have yet to learn XS, but I get the feeling around here that Inline::C is considered 'training wheels' -- please correct me if I've gotten that wrong. After all, XS modules have to be compiled as well, but perhaps it is easier to distribute them in native form? Are there sufficient performance tradeoffs (not bugs, per se, but performance tradeoffs) when using Inline::C rather than XS after initial compile/build time?

Replies are listed 'Best First'.
How to use Inline::C for production code
by sfink (Deacon) on Mar 30, 2004 at 07:41 UTC
    I use Inline::C for some production code, and had to work around the issues you described. My solution was to create some infrastructure for precompiling the XS generated by Inline::C when requested. So when developing, I run using Inline::C, and get automatic recompiles when I change the C code. To release, I run make precompiled, which is a target I defined to force compilation of all of the Inline::C code and copy it over to the installation location. At runtime, the module chooses based on an environment variable whether to use Inline::C or the prebuilt stuff (on a production machine, you don't need to install the Inline module at all.)

    In more detail:

    Each of my Inline-using scripts looks like:

    package Whatever; BEGIN { do ($ENV{DEVEL_MODE} ? 'MyMagicInline' : 'MyMagicDirect') or die $@ } ...perl code... __DATA__ __CPP__ ...C++ code... (ok I lied; I'm using Inline::CPP, not Inline::C)

    $ENV{DEVEL_MODE} is set automagically by something else, but don't worry about that. Just always have it set while you're developing.

    MyMagicInline contains something like:

    use Inline with => 'MyScriptInline'; BEGIN { $inline_code_file = abs_path($INC{__PACKAGE__ . ".pm"}); } sub find_code { local $_ = shift; s/^.*?__CPP__\n//s; return $_; } use Inline(CPP => $inline_code_file, FILTERS => \&find_code); Inline->init;
    The MyScriptInline file contains a single subroutine named Inline that returns a hash ref of Inline settings (eg { INC => '-I/my/path' }). (This is how Inline implements its with magic.)

    RxMagicDirect contains only

    require DynaLoader; { my ($pkg) = caller(0); push @{$pkg . "::ISA"}, "DynaLoader"; bootstrap $pkg; }
    Ok, so that's just a sketch of what's going on; there are details about where the files are found and the precompilation target that runs everything under Inline and then copies the generated *.so files to the appropriate lib/ directory, but the end result is that I can install onto a production machine and not have to install Inline there.

    I'm sure this isn't the cleanest way to do this. I never really bothered to go back and clean it up after I got it to work, but it seems to work quite well for what I need.

      I know this is an old thread, but I have exactly the same problem. In my case I am trying to use PAR/pp to package up my stuff and field it. I tried adding the _Inline directory hoping that this would make everyone happy, and keep the recompile from occurring, but it didn't work. The approach above sounds promising, but I cannot get it to work. Perhaps a working culled down example doing something simple like "hello world" in Inline::C? I wish work offered me the time to dig into the guts of Inline::C and figure this out myself, but it doesn't. Any help much appreciated.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://340777]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (4)
As of 2024-03-28 21:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found