是否可以在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抱怨命令在命令行上正常工作,这是乱码。
当我有机会进一步发挥时,我会回来。
答案 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的实现吐出语法错误时阅读它。