< Much better | Russ Allbery > Eagle's Path > January 2013 | Consensus failure > |
I'm struggling a little to keep to a schedule since the weekend, so I both didn't follow my normal evening exercise schedule nor did I write this up earlier when I could add more details. Ah well. But I'm still going to post something today, since I like this streak of (mostly) providing some useful or at least hopefully entertaining content.
Today, I converted the Perl module build system inside WebAuth to use Module::Build instead of ExtUtils::MakeMaker, and it was a rousing success. I highly recommend doing this, and am going to be doing this with all of my other Perl packages, both embedded in larger packages and standalone.
I have several packages where Perl XS modules are embedded within a larger Autoconf and Automake project that includes a shared library used by the Perl module. The largest problem with doing this is integrating the build systems in such a way that the Perl module is built against the in-tree version of the shared library, rather than some version of it that may already be on the system.
I've managed to do this with ExtUtils::MakeMaker, but it was horribly ugly, involving overriding internal target rules and setting a bunch of other variables. With Module::Build and ExtUtils::CBuilder, it's much easier and even sensible. Both support standard ways of overriding Config settings, which provides just the lever required. So this:
our $PATH = '@abs_top_builddir@/lib/.libs'; my $lddlflags = $Config{lddlflags}; my $additions = "-L$PATH @LDFLAGS@"; $lddlflags =~ s%(^| )-L% $additions -L%; package MY; sub const_loadlibs { my $loadlibs = shift->SUPER::const_loadlibs (@_); $loadlibs =~ s%^(LD_RUN_PATH =.*[\s:])$main::PATH(:|\n)%$1$2%m; return $loadlibs; } package main;
(comments stripped to just show the code) became this:
my @LDFLAGS = qw(-L@abs_top_builddir@/lib/.libs @LDFLAGS@); my $LDDLFLAGS = join q{ }, @LDFLAGS, $Config{lddlflags};
plus adding config => { lddlflags => $LDDLFLAGS }
to the standard
Module::Build configuration. So much better!
At some point, I'll write up a set of guidelines on how to embed Perl XS modules into Automake projects.
Posted: 2013-01-29 23:57 — Why no comments?
< Much better | Russ Allbery > Eagle's Path > January 2013 | Consensus failure > |