如何使用`Makefile.PL`定义新的make任务?

时间:2014-02-12 19:30:59

标签: perl makemaker

我希望我生成的Makefile能够完成linting的这些新任务:

perl:
    -for f in **/*.pl; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done
    -for f in **/*.pm; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done

perlcritic:
    -perlcritic . | grep -v "source OK"

lint: perl perlcritic

我尝试编写Makefile.PL,但是当我运行它时,生成的Makefile仍然缺少lint任务。

use ExtUtils::MakeMaker;

sub MY::lint {
  return <<'END';
lint:
    echo "Linting!!!!!!!!!!!1"

END
}

WriteMakefile;

我尝试阅读CPAN文档,但与大多数文档一样,它们在没有足够上下文的情况下提供片段,所以我甚至不确定是否应该在WriteMakefile之前或之后声明子组件。

也发布在Reddit

2 个答案:

答案 0 :(得分:4)

感谢briandfoy:

$ cat Makefile.PL 
#!/usr/bin/env perl

use strict;
use warnings;
use ExtUtils::MakeMaker;

WriteMakefile;

sub MY::postamble {
  return <<'END';
perlwarn:
    -find . -type f -name '*.pl' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"
    -find . -type f -name '*.pm' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"
    -find . -type f -name '*.t' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"

perlcritic:
    -perlcritic . | grep -v "source OK"

lint: perlwarn perlcritic
END
}

答案 1 :(得分:1)

一种可行且易于维护的解决方案是将make目标放在单独的makefile中,这样您就可以利用文本编辑器的功能,而且阅读起来也更容易一些:

# In Makefile.PL
use File::Slurp;

sub MY::postamble {
    my $targets = read_file('./script/additional.make');
    return $targets;
}

# In /script/additional.make
perl:
    for f in **/*.pl; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done
    for f in **/*.pm; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done

perlcritic:
    perlcritic . | grep -v "source OK"

lint: perl perlcritic

供以后的读者注意:我正在使用Module::Install,并且有必要使用::作为分隔符,因为似乎Module::Install禁止混用:和{{1 }}。它还不允许使用::