2013-10-08 107 views
1

是否可以在makefile中检查是否正在使用gmake而不是BSD make?测试gmake正在评估makefile

或者我坚持使用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

你想让BSD Make做什么,如果它运行的是生成文件? – Beta

+0

干杯@Beta我添加了一个编辑来解释。 –

+0

@devnull你可以请你恢复你的答案,因为我认为我有一个编辑它,让我更加接近 –

回答

1

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

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

GNUmakefile技巧可以工作,但这并不令人愉快,我同意。另一个选择是让你的Makefile除了一个.DEFAULT目标,然后测试然后调用$(MAKE) -f realMakefile [email protected],并让你的所有内容在realMakefile.DEFAULT由POSIX标准定义,但我不知道有多少其他make实际提供它。它仍然有点不愉快,因为如果你运行make foo bar baz那么递归make被调用3次。

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

+0

谢谢。我同意我们基本上仍然试图用1970年代创建的一套基本构造来构建规则(当然有_some_扩展)。 –