我想向 CFLAGS make 变量添加另一个选项,具体取决于我想要在 makefile 的“配置”部分中的配方之外执行的 shell 命令的结果。这就是我想出的:
GCC_VERSION := $(shell gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi
首先,我使用 shell make 函数执行命令,如上所示。如果我执行上面的代码,它不会添加这个定义标志。我特意在 Linux 上使用 GCC 版本 5.4.0 来执行此操作。我认为这是错误的,因为然后我必须创建一个新的 shell 来执行条件语句。在新的 shell 中,GCC_VERSION 变量将不存在。但我可能是错的。
如果我确实喜欢这样(全部在一个外壳中):
$(shell GCC_VERSION=$(gcc -dumpversion); \
if [[ ${GCC_VERSION} > 5.0 ]] ; then \
CFLAGS += -D _POSIX_C_SOURCE=199309L; \
fi)
我收到错误:
*** recipe commences before first target. Stop.
是啊,非常混乱。
如果有人可以提供帮助,我将不胜感激。谢谢。
答案1
解决方案有很多,包括这个。在你的 Makefile 中使用
VERSION5 := $(shell \
GCC_VERSION=$$(gcc -dumpversion); \
[[ $$GCC_VERSION > 5.0 ]]; \
echo $$? )
ifeq (${VERSION5}, 0)
CFLAGS += -D _POSIX_C_SOURCE=199309L
endif
特别注意,您需要在 shell 脚本中使用$$
for every 。$
如果字符串比较为5.0
真,则该 shell 回显 0,否则回显 1,并将其保存在 make 变量中VERSION5
。
然后ifeq
Makefile 中的测试将该变量与 0 进行比较,如果匹配则编辑该CFLAGS
变量。