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?

4

3 回答 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源文件,项目基目录中包含与 package 对应src/的文件。.xsChocolate::Belgian

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

于 2010-08-28T21:18:25.147 回答
2

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

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

于 2010-08-28T11:41:43.550 回答
1

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

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

于 2010-08-28T18:25:43.493 回答