makefile变量值在ifeq期间不可用

问题描述 投票:0回答:1

我有以下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行为正确。

任何帮助将不胜感激。谢谢。

bash shell makefile gnu-make gnu
1个回答
1
投票

ifeq是在读入Makefile时解析的。即使看起来像是配方的一部分,也不是。您可以说不是,因为它没有使用TAB字符缩进。 TAB不会缩进的任何内容都是makefile的一部分,不是配方的一部分,并且在读取makefile时(而不是在运行规则时)会进行解析。

因此,当您的规则开始运行并到达eval时,所有ifeq语句早已得到扩展和处理。

[通常,在食谱中使用eval实际上绝不是一个好主意。它几乎永远不会满足您的期望。

如果需要在配方中测试某些值,则必须编写shell代码来执行此操作,而不是makefile代码,并使用TAB缩进shell代码,以便将其传递给shell。

© www.soinside.com 2019 - 2024. All rights reserved.