使用Perl的ExtUtils::MakeMaker,我如何使用与我的XS模块相同的设置编译可执行文件?

8

假设有一个使用C库的Perl XS模块,并且存在正确设置所有头文件和库位置、编译器和链接器标志等的Makefile.PL。

现在,假设我想在该XS模块中包含一个使用相同底层C库的小型C程序。如何正确、平台无关地指定目标可执行文件,以便使用相同的设置和标志进行构建?

如果我执行以下操作:

sub MY::postamble {
    return <<FRAG;
target$Config{exe_ext}: target$Config{obj_ext}

target$Config{obj_ext}: target.c

FRAG
}

我不理解在WriteMakefile的参数中设置的包含位置、库列表等内容。如果我开始手动编写规则,我至少要考虑到makedmakenmake。如果使用ExtUtils::CBuilder,我无法找到一个简单明了的方法来指定链接的库。
我一定是漏掉了什么。如果您能指出来,我将不胜感激。
2个回答

2
EU::MM不知道如何创建可执行文件。如果您需要这样做,您将需要考虑各种编译器工具链。我至少已经做过一次,但我不会声称它完全可移植(只是足够可移植)。
长期的解决方案将是一个适当的编译框架,我一直在研究这个问题,但它相当复杂。

1
您可能想看一下Dist::Zilla。我使用它是因为我也经常忘记如何做这个。通过一个相当小而简单的dist.ini文件告诉它要使用哪些插件,它将为您生成所有正确的构建系统,包括整个必要的Makefile.PL。可以将其视为makefile-maker-maker。我将其用于我的一些较小且有缺陷的基于C的CPAN模块:https://github.com/morungos/p5-Algorithm-Diff-Fast,虽然它不太适用作模块,但构建良好。所需的魔法位于inc/DiffMakeMaker.pm中。

然而,简短的答案是查看此组件添加到Makefile.PL中的额外设置:

LIBS => [''],
INC => '-I.',
OBJECT => '$(O_FILES)', # link all the C files too

只需将这些选项添加到您的Makefile.PL中,就可以构建一个处理C和XS并将它们链接到Perl的Makefile。因为,尽管EU::MM不知道如何创建可执行文件,但它所做的大部分工作都是制作Makefile。而且,它很乐意制作将C和Perl正确粘合在一起所需的内容。

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