1

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

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

@Amiramix 在他对同一问题的SO 答案的评论中简洁地表达了我的保留意见。

编辑:如果使用 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 抱怨在命令行上运行良好的命令是乱码。

当我有机会继续比赛时,我会回来的。

4

1 回答 1

1

您遇到的问题是可移植的make 构造集非常贫乏。您可以测试许多变量以查看您是否正在使用 GNU make,但是任何诸如此类的测试都必须使用 shell 来完成,这意味着在一个配方中,是可移植的。这意味着您的 makefile 中的所有目标都必须将“test for GNU make”目标列为先决条件,以确保首先完成测试。

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

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

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

于 2013-10-08T11:27:59.993 回答