我有以下Makefile
SHELL=/bin/bash
.SHELLFLAGS=-O extglob -o errexit -o pipefail -o nounset -c
.PHONY: testing
define getFileContents
$(shell cat ./test.txt)
endef
TEST_STATIC=dummy
deploy:
$(eval TEST=$(getFileContents))
@echo "$(TEST)"
ifeq ($(TEST),dummy)
@echo "$(TEST) is FAILED"
else
@echo "$(TEST) is PASS"
endif
ifneq (,$(findstring dummy,$(TEST)))
@echo "$(TEST) is FAILED"
else
@echo "$(TEST) is PASS"
endif
ifeq ($(TEST_STATIC),dummy)
@echo "$(TEST) is FAILED"
else
@echo "$(TEST) is PASS"
endif
ifneq (,$(findstring dummy,$(TEST_STATIC)))
@echo "$(TEST) is FAILED"
else
@echo "$(TEST) is PASS"
endif
无论我在./test.txt中输入什么值,我总是在ifeq和findstring条件下都进入PASS,但是变量的值正确显示在echo语句中。因此在评估ifeq
时该值不可用但是,对于TEST_STATIC变量,if-else行为正确。
任何帮助将不胜感激。谢谢。
ifeq
是在读入Makefile时解析的。即使看起来像是配方的一部分,也不是。您可以说不是,因为它没有使用TAB字符缩进。 TAB不会缩进的任何内容都是makefile的一部分,不是配方的一部分,并且在读取makefile时(而不是在运行规则时)会进行解析。
因此,当您的规则开始运行并到达eval
时,所有ifeq
语句早已得到扩展和处理。
[通常,在食谱中使用eval
实际上绝不是一个好主意。它几乎永远不会满足您的期望。
如果需要在配方中测试某些值,则必须编写shell代码来执行此操作,而不是makefile代码,并使用TAB缩进shell代码,以便将其传递给shell。