MULTICALLを使う場合はコンパイル時に -DPERL_EXTを指定する

http://d.hatena.ne.jp/syohex/20111005/1317829402


以前自分で調べておきながら再度ハマってしまったので、
専用のエントリを書いておきます。

対象

  • MULTICALLを使ったモジュールを Perl 5.10以前にも対応させたい方。

Perl 5.12以降のみをサポートというのであればおそらく不要です。

問題

"-DPERL_EXT"をつけないと Perl-5.10以前では以下のようなエラーが出てしまい、
リンクに失敗します。

undefined symbol 'cxinc'

Module::Buildを使った場合の対応

以下のように extra_compiler_flagsを使ってコンパイルフラグを指定します。

package builder::MyBuilder;
use strict;
use warnings;
use 5.008001;
use base 'Module::Build::XSUtil';

sub new {
    my ( $class, %args ) = @_;
    my $self = $class->SUPER::new(
        %args,
        c_source => 'xs-src',
        xs_files => {
            './xs-src/UtilsBy.xs' => './lib/List/UtilsBy/XS.xs',
        },
        generate_ppport_h  => 'lib/List/UtilsBy/ppport.h',
        extra_compiler_flags => ['-DPERL_EXT'],
        needs_compiler_c99 => 1,
    );
    return $self;
}

1;

おわりに

MULTICALLを利用しているモジュールで Perl-5.8, Perl-5.10のみ
テストがこけると CPAN Testersからメールがきた場合は, -DPERL_EXT
フラグがないことを疑ってみるとよいでしょう。