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

给定一个使用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的参数中WriteMakefile 。 如果我开始手动编写规则,我必须考虑至少makedmakenmake 。 如果使用ExtUtils :: CBuilder,我无法想出指定要链接的库的直接方法。

我肯定错过了什么。 如果你能指出来,我将不胜感激。

EU :: MM不知道如何创建可执行文件 。 如果需要这样做,则需要考虑各种编译器工具链。 我至少做过一次 ,但我并不认为它是完全便携的(只是便携式)。

一个长期的解决方案将是一个适当的编译框架,我一直在努力,但它是相当不平凡的。

你可能想看看Dist :: Zilla 。 我用它是因为我永远不会记得如何做到这一点。 使用相当小的boilerplaty 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的Makefile ,并将它们链接在一起用于Perl。

因为,虽然EU :: MM不知道如何创建可执行文件,但是它制作Makefile的大部分内容都是如此。 并且非常乐意将正确粘合C和Perl所需的内容做好。