| | Chapter 10 - Writing C Modules with Inline::C | | by?Sam Tregar? | | Apress ? 2002 | Companion Web Site | | | | Here's a simple example script that uses Inline::C to print out "Just Another Perl Hacker": #!/usr/bin/perl -w use Inline C => <<END_OF_C; void japh() { PerlIO_stdoutf("Just Another Perl Hacker.\n"); } END_OF_C japh(); This script uses the Perl C API function PerlIO_stdoutf() to print a string. When you run this script, it works as expected, after a sizable pause for compilation: $ ./inline.pl Just Another Perl Hacker. The second time you run it there's no pause. So, what's happening here? Inline::C follows these steps: -
Inline::C receives the C source code passed as an argument to use Inline C. This happens at compile time. -
Next, Inline::C checks to see if it already has a compiled version of this code available. If so, it loads the compiled code with DynaLoader and returns. More on how this works in Step 5. -
A directory is created in which to build the code if one doesn't already exist. Since I didn't provide any configuration options to control this selection, Inline::C will create a directory called _Inline in the current directory. -
The C code is then parsed with Parse::RecDescent, which looks for a C function to wrap with XS. -
Inline::C creates all the files and directories necessary to build an XS module containing the C code. This includes Makefile.PL, a .pm file, and an .xs file. The name for the directory used to build the code is derived from an MD5 signature of the code to be compiled. This is how Inline::C is able to know in Step 2 if the code needs to be recompiled or not. -
The code is built using the normal perl Makefile.PL && make procedure employed by XS modules. -
The compiled code is loaded with the DynaLoader module. All of this is transparent to the Inline::C programmer, unlike with XS. Better yet, it works in scripts just as well as it works in modules. This makes testing new C functions easy: Just create a script that uses the function and run it-no compile step required! |