我有一个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_64
sh
$(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)
。