簡體   English   中英

Makefile: $(eval $(call ...)) 在具有變量擴展的配方中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM