Здесь есть несколько заблуждений. Самая важная вещь, которую нужно понять, это то, что когда make оценивает функцию eval
, результатом этой оценки является пустая строка. Eval используется для интерпретации синтаксиса make ... он похож на оператор make include
, за исключением того, что вместо файла он "включает" строку.
Скажем так:
ifeq "$(eval ...)" "t"
никогда не может работать, потому что первое предложение всегда будет пустой строкой.
Следующее, что нужно понять, это то, что, как указано выше, eval
ожидает получить синтаксис make-файла. Но результаты функции call
будут выводом оператора psql
, который определенно не является синтаксисом make-файла.
Я не уверен, почему вы используете 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'))