Perl Inline :: Module正确编写Makefile.PL的方法

时间:2015-06-11 12:36:17

标签: perl module makefile inline

我正在努力使用Inline :: Module。问题是,当我尝试使用内联C代码安装我的perl模块时,make系统会生成带有内联模块的自动存根,这些模块应该编译内联C代码。虽然如果你运行make dist,它会用DynaLoader版本替换存根(在我看来这是正确的)。所以问题是当我运行make install时如何强制Inline :: Module生成DynaLoader存根?我错过了这一点吗?

我从一些开放的例子中获取了Makefile:

use 5.008001; use strict; use warnings; use utf8;

use lib 'inc';
use ExtUtils::MakeMaker;
use Inline::Module;

WriteMakefile(
    NAME => 'Text::Levenshtein::Inline',
    ABSTRACT => 'Levenshtein distance implement by Inline::C',
    VERSION_FROM => 'lib/Text/Levenshtein/Inline.pm',
    AUTHOR => 'tadegenban <tadegenban@gmail.com>',
    LICENSE => 'perl',
    MIN_PERL_VERSION => '5.008001',
    test => { TESTS => 't/*.t' },
    postamble => {
        inline => {
            module => 'Text::Levenshtein::Inline',
            makestub => 1
        },
    },
);

以下是运行make install时生成的自动生成的存根:

use strict; use warnings;
package Text::Levenshtein::Inline::Inline;
use Inline::Module stub => 'v2';
1;

虽然如果我做了dist,它会用这个替换内联存根:

use strict; use warnings;
package Text::Levenshtein::Inline::Inline;
use base 'DynaLoader';
bootstrap Text::Levenshtein::Inline::Inline;
1;

这里的真正问题是,如果有人从Repo中检出s / w并且只是运行make install,那么每次用户在工作目录中运行它时,s / w都会尝试构建内联C代码。否则你将不得不提供一些解释,在结账后,有人必须运行make dist或make distdir并从那里运行make install。有点烦人......

1 个答案:

答案 0 :(得分:0)

如果您阅读the tutorial,那么您会发现它的工作方式与此相同。而Perl工具链的设计方式,做你要求的事情是没有意义的。

考虑安装模块所涉及的步骤:

perl Makefile.PL  # generates Makefile
make              # compiles code to blib
make test         # tests code in blib
make install      # copies files from blib to installation dir

如果它按您的要求运行,make install步骤将需要丢弃已构建和测试的代码,重建不同版本的代码(未经过测试)并安装。

从存储库构建的人员应该知道他们在做什么。您可以在README文件中添加关于此问题的注释。