什么工具可以帮助构建XS项目?

7

我最近开始学习使用perlxstut的XS,并且教程建议我使用旧的h2xs工具创建基于ExtUtils::MakeMaker的项目来创建我的模块。但是对于纯Perl项目,h2xs/EUMM长期以来已经不再受欢迎,而是更喜欢使用Module::InstallModule::BuildDist::Zilla

有没有更现代的方法来创建XS项目? Module :: Starter能够创建XS项目吗? Module :: Build或Dist :: Zilla能够构建XS项目吗?它们的Pod页面在这个问题上保持沉默。

另一方面,对h2xs/EUMM提出的批评是否适用于XS项目?如果您需要C编译器,那么要求使用make工具是否合理?

编辑:我看到这个问题回答了我的项目创建问题。我仍然想知道关于构建方面的信息:EUMM是唯一的选择吗?还是Module :: Build和Dist :: Zilla也能够构建XS项目?

3个回答

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 / 目录中,并且与项目基目录中的 Chocolate :: Belgian 包对应的 .xs 文件。 extra_compiler_flags 对应于制作 CCFLAGS ,而 extra_linker_flags 对应于 LIBS (因此您可能希望在这里添加 -lm 以链接C数学库)。

1
由于您在评论中要求反馈:经过快速检查,这看起来很好。小问题:也许应该添加对ExtUtils::CBuilder的依赖(needs_compiler可能已经做到了)。您确定需要dynamic_config: 1吗?我敢打赌你不需要。此外,您可能希望将Module::Build添加到configure_requires而不是requires中。我相信它会自动添加对最新版本的依赖项,如果根本找不到它。尝试删除那行,运行"./Build dist"并检查生成的META.yml/META.json是否提到了Module::Build。 - tsee
@tsee:非常感谢您的评论。我已将其设为社区维基,因此如果您愿意,可以进行任何更改。 - Philip Potter
哦嗯...Module::Build::API页面说,needs_compiler在M::B版本.36之后可用,并且如果c_source存在或者在某处找到了xs代码,则会自动设置为true。 如果为真,则会自动将ExtUtils :: CBuilder添加为build_requires项目。 - Nate Glenn

2

Dist::Zilla并不是EUMM或Module::Build的替代品,它将为您生成Makefile.Pl等文件。我不会惊讶地听到它无法为XS项目生成这些文件,但有方法可以管理dzil项目自己的文件。它可以使用所提供的任何Makefile.Pl(或Build.pl)。

因此,我的回答是,Dist::Zilla在项目中并不起到该角色。


1
谢谢,这让我对Dzil有了更清晰的理解。进一步调查发现Dist::Zilla::Plugin::MakeMaker::Awesome声称具有部分XS能力。 - Philip Potter

1

我通常只使用一些相对简单的XS分发作为起点。h2xs可以通过解析头文件来生成一些XS代码,但大多数情况下,我发现它过于受限以至于无法发挥作用。

如果你计划包装C++,你可能想看看Module::Build::WithXSpp。


谢谢你的回答。你用什么来构建你的分发? - Philip Potter
1
我最初使用MakeMaker,因为它似乎是最简单的。现在,我通常使用Module::Build(对于XS/C方面来说,我会说它有一点学习曲线),因为我觉得它给了我更多的灵活性,而不必去修改Makefiles。同时,将其扩展以执行Module::Build::WithXSpp中的魔法也相当容易。 - tsee
你能提供一个关于XS的Module::Build示例或者检查一下我回答中的示例吗?我是新手,正在尝试寻找创建XS项目的最佳实践。 - Philip Potter
我只会指出我知道的模块,因为我懒得做太多的研究。这显然通常意味着我的模块。它们不一定反映最佳实践。如果您计划使用XS++,那么这就是最简单的方法:http://search.cpan.org/~smueller/Math-ThinPlateSpline-0.05/ 对于普通的XS,我没有彻底的vanilla Build.PL。这是一个复杂的例子,但您可以简单地删除所有特殊逻辑:http://search.cpan.org/~smueller/SOOT-0.09/ 这是使用Module::Install的示例(来自Daisuke Maki):http://search.cpan.org/~dmaki/ZeroMQ-0.02/ - tsee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接