【问题标题】:What tools can help build an XS project?哪些工具可以帮助构建 XS 项目?
【发布时间】:2011-04-05 03:28:01
【问题描述】:

我最近开始使用 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 工具?

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

【问题讨论】:

    标签: perl module perl-xs makemaker


    【解决方案1】:

    事实证明,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;
    

    这将构建一个发行版,其中include/ 目录中包含.h 包含文件(例如ppport.h),src/ 目录中包含.c 源文件,以及与包@ 对应的.xs 文件987654328@在项目基目录中。

    extra_compiler_flags 对应于 make CCFLAGS,而 extra_linker_flags 对应于 LIBS(因此您可能希望 -lm 在那里链接 C 数学库)。

    【讨论】:

    • 因为您在评论中要求反馈:快速检查后看起来很好。 Nits:也许添加对 ExtUtils::CBuilder 的依赖(needs_compiler 可能已经这样做了)。你确定你需要dynamic_config:1吗?我打赌你不会。此外,您可能希望将 Module::Build 添加到 configure_requires 而不是 requires。我相信如果根本找不到它,它会自动添加对最新版本的依赖。尝试删除该行,运行“./Build dist”并检查生成的 META.yml/META.json 是否提及 Module::Build。
    • @tsee:非常感谢您的评论。我已将其设为社区 wiki,因此您可以根据需要进行任何更改。
    • Hmmm... Module::Build::API 页面说,needs_compiler 在 M::B 版本 .36 之后可用,并且如果 c_source 存在或 xs 代码是,它会自动设置为 true在某处找到。如果为 true,它会自动将 ExtUtils::CBuilder 添加为 build_requires 项。
    【解决方案2】:

    Dist::Zilla 不是 EUMM 或 Module::Build 的替代品,它会为你生成一个 Makefile.Pl (等),听到这个我不会感到惊讶它不能对 XS 项目执行此操作,但有一些方法可以为 dzil 项目管理您自己的项目。它可以与它提供的任何Makefile.Pl(或Build.pl)一起使用。

    所以我对您问题的 Dist::Zilla 部分的回答是,Dist::Zilla 不会在项目中担任该角色。

    【讨论】:

    • 谢谢你,它让我心中的dzil大大澄清了。进一步调查发现 Dist::Zilla::Plugin::MakeMaker::Awesome 声称具有部分 XS 功能。
    【解决方案3】:

    我总是只使用一些相当简单的 XS 发行版作为起点。 h2xs 可以通过解析 header 来做一些 XS 的生成,但大多数时候,我发现它太有限,没有用。

    如果您打算封装 C++,您可能需要查看 Module::Build::WithXSpp。

    【讨论】:

    • 感谢您的回答。你用什么来构建你的发行版?
    • 我开始使用 MakeMaker,因为这似乎是最简单的。现在,我通常使用 Module::Build(我想说,它对 XS/C 的东西有更多的学习曲线),因为我觉得它给了我更多的灵活性,而不必破解 Makefile。在 Module::Build::WithXSpp 中扩展以实现疯狂的魔法也相当容易。
    • 您能否提供一个 Module::Build XS 示例或查看我的答案中的示例?我是新手,我正在尝试寻找创建 XS 项目的最佳实践。
    • 我只会指出我知道的模块,因为我懒得做很多研究。这显然通常意味着我的模块。它们不一定反映最佳实践。如果您打算使用 XS++,那么这很简单:search.cpan.org/~smueller/Math-ThinPlateSpline-0.05 对于普通的 XS,我没有完全普通的 Build.PL。这是一个复杂的示例,但您可以简单地删除所有特殊逻辑:search.cpan.org/~smueller/SOOT-0.09 这是使用 Module::Install 的示例(来自 Daisuke Maki):search.cpan.org/~dmaki/ZeroMQ-0.02
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多