检查 Makefile 中的命令 returns 是否为空

Check if a command returns nothing in Makefile

对于 C 库,由于内存问题,我需要检查当前编译器是否适用于 x86_64。我发现完全符合我要求的命令:

CXXARCH:=$(${CXX} -dumpmachine | grep -i 'x86_64')

其中 ${CXX}gccclang。对于 x86_64 机器,这将 return 一个非空字符串。对于 32 位机器,假设 Raspberry Pi,这将是空的。

如何区分这两种情况?

我这样做了:

ifneq (${CXXARCH},)
MAGICVAR:=-DMY_DEFINE
endif

通过 $(info) 打印,我确保在 Raspberry Pi 中不满足此条件,而它应该满足,因为命令 clang-6.0 -dumpmachine returns :armv7l-unknown-linux-gnueabihf。那么为什么这个条件没有被执行呢?我做错了什么?

语法

$(${CXX} -dumpmachine | grep -i 'x86_64')

shell语法。它不会在 Makefile 中执行您想要的操作。要在 Makefile 中扩展 CXX 变量,首选语法是使用 $(CXX)(虽然 ${CXX} 也可以,但是 $CXX没有)。要捕获 shell 输出,您需要使用 $(shell command)。于是

CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64')
ifneq ($(CXXARCH),)
MAGICVAR:=-DMY_DEFINE
endif

请注意编译器目标与结果程序中的"memory issues"无关。您可以使用 x86_64-linux-gnu-gcc 编译 32 位程序 (-m32) 并获得 32 位编译器所具有的 "same memory issues"。


最后确保您没有混淆 ifneqifeq

ifneq ($(CXXARCH),)

表示"if $(CXXARCH) does not expand to an empty string, then..."

假设一个 POSIX 系统,将结果通过 wc -l:

CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64' | wc -l)

如果结果为零,则其中包含 x86_64 的零行。这在 makefile 中比在字符串值中更容易处理。

(包括获得 shell 语法的修复)