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 を作りました。
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::HyperLogLog、Digest::SpookyHashは既にModule::Build::XSUtilを使うバージョンをリリース済みです。