あるあるおハマリ大事典 - mod_perl がコンパイルできない→解決済

LinuxApache-2.2.11 + mod_perl-2.0.4 にて。

cc (snip) -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -I/usr/lib/perl/5.8/CORE -DMOD_PERL -DMP_COMPAT_1X -DLINUX=2 -O2 -fPIC \
        -c modperl_xsinit.c && mv modperl_xsinit.o modperl_xsinit.lo
modperl_xsinit.c: In function 'xs_init':
modperl_xsinit.c:30: error: 'my_perl' undeclared (first use in this function)
modperl_xsinit.c:30: error: (Each undeclared identifier is reported only once
modperl_xsinit.c:30: error: for each function it appears in.)
modperl_xsinit.c:30: warning: passing argument 3 of 'Perl_newXS' from incompatib
le pointer type
make[1]: *** [modperl_xsinit.lo] Error 1

エラる。自分のマシンだけエラる。ほかのマシンは問題ない。

src/modules/perl/modperl_xsinit.c を比較してみると、

--- modperl_xsinit.c    2009-03-02 12:38:16.000000000 +0900
+++ modperl_xsinit.c_dame        2009-03-02 12:43:06.000000000 +0900
(snip)
-EXTERN_C void xs_init (pTHX);
(snip)
+
+EXTERN_C void xs_init _((void));

-EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+EXTERN_C void boot_DynaLoader _((CV* cv));

 EXTERN_C void
-xs_init(pTHX)
+xs_init()
 {

なんか全然違うお!

modperl_xsinit.c は mod_perl の配布物に含まれてるファイルじゃなくて、make の過程で生成されるファイルの模様。

grepると、lib/ModPerl/Code.pm が ExtUtils::Embed を使って生成してるぽい。

    my $xsinit = "$self->{path}/modperl_xsinit.c";
    debug "generating...$xsinit";
(snip)
    ExtUtils::Embed::xsinit($xsinit, 1, $static_xs);

比較してみると ExtUtils::Embed のバージョンが違う。1.2505 と 1.26 。

ExtUtils::Embed は、Perl 本体に含まれるやつ(1.26)のほかに、CPAN もジュール(1.2505)もあり、手がすべって超絶古い CPAN のほうの ExtUtils::Embed が入ってしまっていたぽい。

あの日はlighttpdとかmod_postfileとかいじってて、PerlFCGI系のモジュールもしこすこ入れてた。その過程で手がすべったのかもしれないしそうでないのかもしれない。

とにかく、ExtUtils::EmbedとEmbed::Persistentを消して、1.26のExtUtils::Embedをコピってきて解決。

ちゃんちゃん。