On Thu, Apr 8, 2010 at 7:31 PM, Bill Moseley <mose...@hank.org> wrote:
> At times we must make do with what we have:
> I'm working with a team of C++ programmers.  To provide Perl access to their
> code they are using SWIG, which produces a .pm and a (big fat) .so file.
>  The question is how to turn this into a distribution that can be installed
> in the correct place.
> Target platform is all the same so no real concern about portability at this
> time (famous last words).  We can just copy into @INC I suppose, although
> the plan is to use cpan2rpm so really would like a distribution (with a
> Makefile.PL).
>
> I've always used XS before that builds a "real" distribution where the .xs
> is compiled and linked at build time and MakeMaker figures out where to
> install.  But, that's just not what I have, unfortunately.
> To get by could I just make a normal distribution and add in the .so file
> into the lib directory?   Then let MakeMaker install? That seems ugly (not
> to mention platform dependent).
> Any other suggestions how to package up these so they can be installed in a
> normal "make install" for a stop-gap measure for now?
> My suggestion is to move to autoconf to build libraries and use thin XS
> wrappers, but that's a bigger project than anyone is willing to take on
> right now.
> BTW -- poking around Google there seems to be debate about SWIG vs. XS (and
> Inline), and often it seems like SWIG is preferred.  Hard to believe since
> it makes such odd code with werid naming (use "foo";  $foo = foo::Foo->new)
> and sub TIEHASH.
>
> --
> Bill Moseley
> mose...@hank.org
>

I used swig in making up Math-Cephes:
      http://cpansearch.perl.org/src/RKOBES/Math-Cephes-0.47/
In a nutshell, I placed the "wrapper" file Cephes_wrap.c that swig
generates at the top-level, and all the .c and .h files used to build
the C library under the libmd/ directory. The top-level Makefile.PL
had attributes like
            NAME => 'Math::Cephes',
            MYEXTLIB => "$libmd/libmd\$(LIB_EXT)",
            VERSION_FROM => 'lib/Math/Cephes.pm',
            OBJECT => 'Cephes_wrap.o arrays.o',
            INC => "-I$libmd",
where arrays.c was a self-made .c helper file and $libmd = catdir
$cwd, 'libmd'). Under libmd/ was a Makefile.PL that built the libmd
library via attributes like
            NAME      => 'Math::Cephes::libmd',
            VERSION_FROM => '../lib/Math/Cephes.pm', # finds $VERSION
            OBJECT => join(' ', @objs),
            SKIP      =>  [ qw( dynamic test ) ] ,
            LINKTYPE  =>  'static',
            clean => {FILES => 'libmd$(LIB_EXT)'}
where the object files were found from
    opendir(DIR, '.') or die "Cannot opendir '.': $!\n";
    my @objs = map {s/\.c$/.o/; $_} grep { /\.c$/ } readdir DIR;
    closedir DIR;

This turned out to be a fairly portable solution across different platforms.

-- 
best regards,
Randy

Reply via email to