[英]Makefile: $(eval $(call ...)) in recipe with variable expansion
我想了解如何正確測試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
測試沒有通過,不知道哪里出錯了。
這里有很多誤解。 要理解的最重要的事情是當 make評估eval
函數時,評估的結果是空字符串。 Eval 用於解釋 make 語法......它有點像 make include
語句,除了它不是文件,它“包括”一個字符串。
所以說這樣的話:
ifeq "$(eval ...)" "t"
永遠無法工作,因為第一個子句將始終是空字符串。
接下來要意識到的是,如上所述, eval
期望獲得 makefile 語法。 但是call
函數的結果會是psql
語句的輸出,這絕對不是makefile語法。
我不確定你為什么在這里使用eval
。 為什么不使用:
ifeq "$(call check_working_schema, $(WORKING_SCHEMA))" "t"
?
此外,您的check_working_schema
函數不正確,因為它正在轉義$1
參數; 您希望擴展該參數; 這就是使用call
的全部意義。
FWIW,我也會在這里使用$(strip ...)
因為 make 對空格敏感:
check_working_schema = $(strip $(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'))
謝謝,
經過大量閱讀,我終於找到了解決方案。
我很困惑,因為我想轉義傳遞給 psql 的第二個變量。 $(DB) 值在整個 Makefile 中是相同的,但模式名稱可能會有所不同。
所以這是我的解決方案:
DB = my_db
# first instanciation of working_schema
WORKING SCHEMA = toto
DB := $(strip $(DB))
WORKING_SCHEMA := $(strip $(WORKING_SCHEMA))
checking_working_schema =$$(shell echo -e "\\\timing of \n\
SELECT EXISTS ( \
SELECT 1 \
FROM pg_catalog.pg_namespace \
WHERE nspname = :'sel_schema' \
);" \
| psql -d $(DB) -q -t -A --variable sel_schema=$1)
$(eval working_schema_exist:=$(call checking_working_schema,$(WORKING_SCHEMA)))
ifeq "$(working_schema_exist)" "t"
$(info in true part)
else
$(info in false part)
endif
然后我修改了 $(WORKING_SCHEMA) 的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.