GNU make - 如何根据 shell 命令结果连接到变量(GCC 版本)?

GNU make - 如何根据 shell 命令结果连接到变量(GCC 版本)?

我想向 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

然后ifeqMakefile 中的测试将该变量与 0 进行比较,如果匹配则编辑该CFLAGS变量。

相关内容