Module::Build::Pluggable::XSUtil と Minilla の相性が悪いので Module::Build::XSUtil 作りました

Minillaを使い始めたのですが、MinillaとModule::Build::Plaggableは共にModule::Build::subclass()を使用していて、Module::Build::subclass()は多重に使えないという制約のため一緒には使えません。

XSモジュールではModule::Build::Pluggable::XSUtilを使っていたため、Minillaでも同等のことを行うためのモジュール Module::Build::XSUtil を作りました。

GitHub
MetaCPAN

Minilla専用というわけではなく、素のBuild.PLでも使えます。
なお、オプションの名前はModule::Buildの流儀に近いかたちにアレンジしています。

use strict;
use warnings;
use Module::Build::XSUtil;

my $builder = Module::Build::XSUtil->new(
    dist_name            => 'Your-XS-Module',
    license              => 'perl',
    dist_author          => 'Your Name <yourname@example.com>',
    dist_version_from    => 'lib/Your/XS/Module',
    generate_ppport_h    => 'lib/Your/XS/ppport.h',
    generate_xs_helper_h => 'lib/Your/XS/xshelper.h',
    needs_compiler_c99   => 1,
);
$builder->create_build_script();

Minillaと共に使う際は、minil.tomlに以下の記述を行います。

[build]
build_class = "builder::MyBuilder"
[no_index]
directory = ['t', 'xt', 'inc', 'share', 'eg', 'examples', 'author', 'builder']

そして、以下のような builder/MyBuilder.pm を作成します。

package builder::MyBuilder;
use strict;
use warnings FATAL => 'all';
use 5.008005;
use base 'Module::Build::XSUtil';

sub new {
    my ( $class, %args ) = @_;
    my $self = $class->SUPER::new(
        %args,
        generate_ppport_h     => 'path/to/ppport.h',
        generate_xs_helper_h => 'lib/Your/XS/xshelper.h',
        needs_compiler_c99   => 1,
    );
    return $self;
}

1;

最後に、

$ minil build

で Build.PL を生成すればMinillaでModule::Build::XSUtilを使用できるようになります。

素のBuild.PLを使っている場合は自動的にModule::Build::XSUtilがconfigure_requiresに追加されますが、Minillaの場合はcpanfileに以下のような記述を追加してください。

on 'configure' => sub{
    requires 'Module::Build::XSUtil' => '>=0.02';
};

なお、拙作の Algorithm::HyperLogLogDigest::SpookyHashは既にModule::Build::XSUtilを使うバージョンをリリース済みです。