如何通过 Make 的 $(shell ...) 回显 makefile 变量

如何通过 Make 的 $(shell ...) 回显 makefile 变量

我有一个GNU 生成文件。 makefile 有一些测试(链接文件的第 65 行左右):

UNAME = uname

MACHINE ?= $(shell $(UNAME) -m)
SYSTEM ?= $(shell $(UNAME) -s)

IS_X86 = $(shell echo $MACHINE | $(EGREP) -c "i.86|x86|i86|amd64")
IS_X86_64 = $(shell echo $MACHINE | $(EGREP) -c "_64|d64")

makefile 无法在 MinGW 及其shell下正确IS_X86设置。当我在测试块后添加以下内容时:IS_X86_64sh

$(info MACHINE: $(MACHINE))
$(info SYSTEM: $(SYSTEM))
$(info IS_X86: $(IS_X86))
$(info IS_X86_64: $(IS_X86_64))

我得到的回报是:

$ make
MACHINE: i686
SYSTEM: MINGW32_NT-6.1
IS_X86: 0
IS_X86_64: 0

我假设 MinGW 可以匹配i686到,所以我猜测MinGW 下的命令或变量i.86有问题。echo

我还尝试了以下方法,但没有感到高兴:

$(shell echo $(MACHINE) ...)
$(shell echo $((MACHINE)) ...)

我什至尝试在测试之前强制变量扩展:

MACHINE := $(MACHINE)

最后,我尝试使用临时的但没有任何乐趣:

MTEXT ?= $(shell $(UNAME) -m)
MACHINE := $(MTEXT)

测试在 BSD、Linux、OS X 和 Solaris 下运行良好。它甚至可以在 Cygwin 下运行。

echo在 MinGW 下使用 echo makefile 变量的技巧是什么?

答案1

看起来你在 mingw 环境中使用了一个奇怪的 shell - 而不是 bash。或者是egrep的奇怪版本。

您可以通过用 GNU make 条件替换这些egrep shell调用来解决这个问题,例如:

ifeq (,$(filter %686 %x86 %i86 %amd64,$(MACHINE)))
  IS_X86 = 0
else
  IS_X86 = 1
endif

或者,您可以基于以下内容创建一些内容$(findstring ...)或其他 GNU make 文本函数

除了解决当前的问题之外,使用此类 GNU make 语言功能也比通过 左右分叉更有效$(shell)

相关内容