NAME
InlineX::C2XS - create an XS file from Inline C code.
SYNOPSIS
use InlineX::C2XS qw(c2xs);
my $module_name = 'MY::XS_MOD';
my $package_name = 'MY::XS_MOD';
# $build_dir is an optional third arg
my $build_dir = '/some/where/else';
# $config_opts is an optional fourth arg (hash reference)
# See the "Recognised Hash Keys" section below.
my $config_opts = {'AUTOWRAP' => 1,
'AUTO_INCLUDE' => 'my_header.h',
'TYPEMAPS' => ['my_typemap'],
'INC' => '-Imy/includes/dir',
'WRITE_MAKEFILE_PL' => 1,
'VERSION' => 0.42,
'LIBS' => ['-L/somewhere -lmylib'],
'BUILD_NOISY' => 0, # No Inline::C progress messages
};
# Create /some/where/else/XS_MOD.xs from ./src/XS_MOD.c
c2xs($module_name, $package_name, $build_dir);
# Or create XS_MOD.xs in the cwd:
c2xs($module_name, $package_name);
The optional fourth arg (a reference to a hash) is to enable the
writing of XS files using Inline::C's autowrap capability - and
also to enable the creation of the Makefile.PL (if desired).
See the "Recognised Hash Keys" section below.
# Create XS_MOD.xs in the cwd, using the AUTOWRAP feature:
c2xs($module_name, $package_name, '.', $config_opts);
DESCRIPTION
Don't feed an actual Inline::C script to this module - it won't
be able to parse it. It is capable of parsing correctly only
that C code that is suitable for inclusion in an Inline::C
script.
For example, here is a simple Inline::C script:
use warnings;
use Inline C => Config =>
BUILD_NOISY => 1,
CLEAN_AFTER_BUILD => 0;
use Inline C => <<'EOC';
#include <stdio.h>
void greet() {
printf("Hello world\n");
}
EOC
greet();
__END__
The C file that InlineX::C2XS needs to find would contain only that code
that's between the opening 'EOC' and the closing 'EOC' - namely:
#include <stdio.h>
void greet() {
printf("Hello world\n");
}
InlineX::C2XS looks for the source file in ./src directory - expecting
that the filename will be the same as what appears after the final '::'
in the module name (with a '.c' extension). ie if your module is
called My::Next::Mod the c2xs() function looks for a file ./src/Mod.c,
and creates a file named Mod.xs. Also created by the c2xs function, is
the file 'INLINE.h' - but only if that file is needed. The generated
xs file (and INLINE.h) will be written to the cwd unless a third
argument (specifying a valid directory) is provided to the c2xs
function
The created XS file, when packaged with the '.pm' file, an
appropriate 'Makefile.PL', and 'INLINE.h' (if it's needed), can be
used to build the module in the usual way - without any dependence
upon the Inline::C module.
Recognised Hash Keys
As regards the optional fourth argument to c2xs(), the following hash
keys are recognised:
AUTOWRAP
Set this to a true value to enable Inline::C's AUTOWRAP capability.
(There's no point in specifying a false value, as "false" is the
default anyway.) eg:
AUTOWRAP => 1,
----
WRITE_MAKEFILE_PL
Set this to to a true value if you want the Makefile.PL to be
generated. (There's no point in specifying a false value, as "false"
is the default anyway. You should also assign the 'VERSION' key to
the correct value when WRITE_MAKEFILE_PL is set.) eg:
WRITE_MAKEFILE_PL => 1,
----
AUTO_INCLUDE
The value specified is automatically inserted into the generated XS
file. (Also, the specified include will be parsed and acted upon iff
AUTOWRAP is set to a true value.) eg:
AUTO_INCLUDE => '#include <my_header.h>',
----
VERSION
Set this to the version number of the module. It makes sense to assign
this key only if WRITE_MAKEFILE_PL is set to a true value. eg:
VERSION => 0.42,
----
INC
The value specified is added to the includes search path. It makes
sense to assign this key only when AUTOWRAP and/or WRITE_MAKEFILE_PL
are set to a true value. eg:
INC => '-I/my/includes/dir',
----
LIBS
The value(s) specified become the LIBS search path. It makes sense
to assign this key only if WRITE_MAKEFILE_PL is set to a true value.
(Must be an array reference.) eg
LIBS => ['-L/somewhere -lsomelib', '-L/elsewhere -lotherlib'],
----
TYPEMAPS
The value(s) specified are added to the list of typemaps. It makes
sense to assign this key only when AUTOWRAP and/or WRITE_MAKEFILE_PL
are set to a true value. (Must be an array reference.) eg:
TYPEMAPS =>['my_typemap', 'my_other_typemap'],
----
BUILD_NOISY
Is set to a true value, by default. Setting to a false value will
mean that progress messages generated by Inline::C are suppressed. eg:
BUILD_NOISY => 0,
----
CC
Specify the compiler you want to use. eg:
CC => 'g++',
----
LD
Specify the linker you want to use. eg:
LD => 'g++',
----
MAKE
Specify the make utility you want to use. eg:
MAKE => 'pmake', # I have no idea whether that will work :-)
----
TODO
Add coverage (and testing) of BOOT, CCFLAGS, FILTERS, LDDLFLAGS,
MYEXTLIB, OPTIMIZE and PREFIX options. (This will be done soon.)
Add testing of CC, LD, and MAKE options. (This will be done soon.)
Improve the t_makefile_pl test script. It currently provides strong
indication that everything is working fine ... but is not conclusive.
(This might take forever.)
BUGS
None known - patches/rewrites/enhancements welcome.
Send to sisyphus at cpan dot org
COPYRIGHT
Copyright Sisyphus. You can do whatever you want with this code.
It comes without any guarantee or warranty.