我最近开始使用perlxstut学习XS,教程建议我使用旧的h2xs工具创建我的模块,以创建基于ExtUtils::MakeMaker的项目。然而,对于纯Perl项目,h2xs / EUMM长期以来一直不赞成Module::Install,Module::Build或Dist::Zilla。
是否有更现代的方式来创建XS项目? Module::Starter可以创建XS项目吗? Module :: Build或Dist :: Zilla可以构建XS项目吗?他们的粉丝页面对此事保持沉默。
另一方面,针对h2xs / EUMM的批评是否适用于XS项目?如果你还需要一个C编译器,那么同样需要make工具是否合理?
编辑:我看到this question回答了关于创建项目的问题。我仍然想知道构建:EUMM是唯一的选择,还是Module :: Build和Dist :: Zilla也能够构建XS?
答案 0 :(得分:4)
事实证明,Module :: Build完全能够编译XS。这是一个完整的Build.PL,我设法凑到一起:
use strict;
use Module::Build;
my $build = Module::Build->new(
module_name => 'Chocolate::Belgian',
dynamic_config => 1,
license => 'perl',
requires => {
'Module::Build' => '0.19', # xs
'Test::More' => 0,
},
extra_compiler_flags => '-Iinclude',
extra_linker_flags => '',
c_source => 'src',
needs_compiler => 1,
xs_files => {
'./Belgian.xs' => 'lib/Chocolate/Belgian.xs',
},
);
$build->create_build_script;
这将在.h
目录中构建ppport.h
包含文件(例如include/
),.c
目录中的src/
源文件,以及与项目基目录中的包.xs
对应的Chocolate::Belgian
文件。
extra_compiler_flags
对应make CCFLAGS
,而extra_linker_flags
对应LIBS
(因此您可能需要-lm
来链接C数学库。)< / p>
答案 1 :(得分:2)
Dist :: Zilla 不是是EUMM或Module :: Build的替代品,它会为你生成一个Makefile.Pl
(等),我不会感到惊讶听说它不能为XS项目做到这一点,但有一些方法可以为dzil项目管理自己的项目。它可以与它提供的任何Makefile.Pl
(或Build.pl)一起使用。
所以我对你的问题的Dist :: Zilla部分的回答是,Dist :: Zilla没有在项目中填补这个角色。
答案 2 :(得分:1)
我总是只使用一些相当简单的XS发行版作为起点。 h2xs可以通过解析标题来完成一些XS生成,但大多数时候,我发现它太有限了,无法使用。
如果您打算包装C ++,您可能需要查看Module :: Build :: WithXSpp。