Makefile:变量扩展的配方中的$(eval $(call…))

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

我想了解如何正确测试shell输出的值。这是我的代码:

DB := my_database
WORKING_SCHEMA := toto
export WORKING_SCHEMA

check_working_schema = $(shell echo "SELECT EXISTS ( \
                       SELECT 1 FROM pg_catalog.pg_namespace \
                       WHERE nspname = :'sel_schema'\
                       ); " | psql -d $(DB) -q -t -A --variable sel_schema=$$1)

$(info $(check_working_schema))

.PHONY: rule1
rule1 :
ifeq "$(eval $(call check_working_schema, $(WORKING_SCHEMA)))" "t" 
        $(info in true part)
else
        $(info in false par)
endif

测试未通过,我不知道错误在哪里。

shell makefile eval call expansion
1个回答
0
投票

这里有很多误解。要理解的最重要的事情是,当使make evaluates eval函数时,该评估的结果是空字符串。 Eval用于解释make语法...它有点像make include语句,除了代替文件以外,它还“包含”字符串。

所以说类似:

ifeq "$(eval ...)" "t"

永远不会起作用,因为第一个子句始终是空字符串。

接下来要意识到的是,如上所述,eval希望获得makefile语法。但是call函数的结果将是psql语句的输出,这绝对不是makefile语法。

我不确定您为什么在这里使用eval。为什么不使用:

ifeq "$(call check_working_schema, $(WORKING_SCHEMA))" "t" 

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