测试gmake正在评估makefile

时间:2013-10-08 09:56:07

标签: makefile gnu-make

是否可以在makefile中检查使用gmake而不是BSD make?

还是我坚持使用GNUmakefile的大锤方法,这似乎有点不优雅,绝对不是用户友好的?

@Amiramix在对SO answer对同一问题的评论中简明扼要地表达了我的保留意见。

编辑:如果正在使用BSD make来评估Makefile,那么我希望它能够保释并贬低应该运行gmake来评估Makefile。

编辑2:我已经从@devnull中删除了现在可悲的删除的答案,然后玩了一下以获得它:

MAKEVERSION=Not_GNU

checkVariant:
        @MAKEVERSION=`${MAKE} --version 2>/dev/null | head -1 | sed -e 's/^\(GNU\).*$/\1/'`; \
        if [ "${MAKEVERSION}" != "GNU" ]; then \
            echo "Not using gmake"; \
            exit 1; \
        fi

但是sed抱怨命令在命令行上正常工作,这是乱码。

当我有机会进一步发挥时,我会回来。

1 个答案:

答案 0 :(得分:1)

你遇到的问题是 portable make构造集非常贫乏。你可以测试很多变量,看你是否正在使用GNU make,但是任何这样的测试都必须使用shell来完成,这意味着在配方中,可以移植。这意味着makefile中的所有目标都必须列出“测试GNU make”目标作为先决条件,以确保首先完成测试。

更有问题的是,它意味着你不能使用各种各样的GNU make构造,因为它们在make的其他版本中会出现语法错误,很久之后make就会运行你的GNU make-ness测试规则。 / p>

GNUmakefile技巧会奏效,但我同意并不愉快。另一个选项是让您的Makefile只有一个.DEFAULT目标,然后测试然后调用$(MAKE) -f realMakefile $@并将所有其余的make内容放在realMakefile中。 .DEFAULT由POSIX标准定义,但我不知道有多少其他make实现实际提供它。它仍然有点不愉快,因为如果你运行make foo bar baz那么递归make会被调用3次。

或者,您可以在README文件中记录先决条件,并希望人们在make的实现吐出语法错误时阅读它。