检查命令是否在Makefile

时间:2018-12-29 12:11:20

标签: c linux bash makefile gnu-make

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

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

其中${CXX}gccclang。对于x86_64机器,这将返回一个非空字符串。对于Raspberry Pi这样的32位计算机,将为空。

如何区分这两种情况?

我这样做了:

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

在打印$(info)时,我确保在Raspberry Pi中不满足该条件,应该这样做,因为命令clang-6.0 -dumpmachine返回:armv7l-unknown-linux-gnueabihf。那么为什么不执行此条件呢?我在做什么错了?

2 个答案:

答案 0 :(得分:4)

语法

{ quiz: {answer: 5 }}

shell 语法。它无法完成$(${CXX} -dumpmachine | grep -i 'x86_64') 中您想要的操作。要在 Makefile 中扩展CXX变量,首选语法是使用Makefile(虽然$(CXX)也可以,但是 ${CXX}不能)。要捕获shell输出,您需要使用$CXX。因此

$(shell command)

请注意,编译器目标与结果程序中的“内存问题”无关。您可以使用CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64') ifneq ($(CXXARCH),) MAGICVAR:=-DMY_DEFINE endif 来编译32位程序(-m32)并获得与32位编译器相同的“相同的内存问题”。


最后确保您没有混淆x86_64-linux-gnu-gccifneq

ifeq

表示“如果ifneq ($(CXXARCH),) 不能 扩展为空字符串,则...”

答案 1 :(得分:0)

假设使用POSIX系统,则将结果通过def findSubstringsRecursive(string, substring): counter = 0 substringLength = len(substring) for i in range(len(string)): if string[i] == substring[0]: end = i + substringLength sub1 = string[i:end] if substring == sub1: return 1 + findSubstringsRecursive(string[i+1:], substring) return 0 传递给管道:

wc -l

如果结果为零,则其中包含CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64' | wc -l) 的零行。在makefile中比字符串值更容易处理。

(包括获取shell语法的修补程序)