【问题标题】:Check if a command returns nothing in Makefile检查命令是否在 Makefile 中不返回任何内容
【发布时间】:2018-12-29 12:11:20
【问题描述】:

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

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

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

如何区分这两种情况?

我这样做了:

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

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

【问题讨论】:

  • 这不是 Makefile 而是 shell 语法!见$(shell )
  • @AnttiHaapala 抱歉,我对普通的 makefile 细微差别不太熟悉,因为我通常处理 cmake。此语法适用于我正在使用的 make 文件中的其他内容(不是我自己创建的)。
  • 它很可能在执行部分中。在任何情况下,这都会总是导致一个空字符串被分配给 CXXARCH。
  • @AnttiHaapala 实际上在 shell 之前添加 ${CXX} 并不能正常工作。
  • 当然不是。看我的回答

标签: c linux bash makefile gnu-make


【解决方案1】:

语法

$(${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

请注意,编译器目标与生成的程序中的“内存问题”无关。您可以使用 x86_64-linux-gnu-gcc 编译 32 位程序 (-m32) 并获得与 32 位编译器相同的“内存问题”。


最后确保你没有混淆ifneqifeq

ifneq ($(CXXARCH),)

表示“如果$(CXXARCH) 扩展为空字符串,那么...”

【讨论】:

  • 我检查了很多次,我使用了您的确切语法,但根本没有输入 if 条件(通过在此处添加 $(info) 调用确保是这种情况。还有其他可以可以检查一下吗?(顺便说一句,关于内存的事情,我需要知道可寻址内存是 32 位还是 64 位;这似乎是我找到的唯一干净的方法)。
  • 这就是我在上一段中评论的内容。如果 -m32 在 args 中,则可寻址内存为 32 位。 -dumpmachine 将给 x86_64-linux-gnu。你可以$(info $(CXXARCH))$(info $(MAGICVAR))(或warning 让它更明显)。为工作。
  • 实际上,clang-6.0 -m32 -dumpmachine 在 x86 机器上返回 i386-pc-linux-gnu
  • 不适用于 gcc。而且您无论如何都不会在 CXX 命令中提供这些标志。但是,也许你已经混淆了ifeqifneq
  • 在未来的某个时候,我们将迁移到 cmake... 然后我们将使用 CMAKE_SIZEOF_VOID_P。无论如何,你能帮忙解释一下为什么没有输入 if 条件吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • wc -l 并不是真正需要的,现在你让它变得更复杂了 ;)
  • @AnttiHaapala 数字值在生成文件中更容易处理。 ;-)
  • 比 ifeq 对空字符串? :D 怀疑
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 2011-05-22
  • 2021-06-10
  • 2011-03-13
  • 2013-08-27
  • 2021-03-12
  • 1970-01-01
  • 2023-01-05
相关资源
最近更新 更多