Значение переменной Makefile недоступно во время ifeq - PullRequest
0 голосов
/ 30 мая 2020

У меня есть следующий 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, я всегда go в PASS как в условиях ifeq, так и в условиях findstring, но значения переменных отображаются правильно в выражениях эха. Таким образом, значение недоступно во время оценки ifeq

Однако if-else правильно ведет себя для переменной TEST_STATI C.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 30 мая 2020

ifeq анализируется при чтении make-файла. Даже если кажется, что это часть рецепта, это не так. Вы можете сказать, что это не так, потому что он не имеет отступа с помощью символа TAB. Все, что не имеет отступа с помощью TAB, является частью make-файла, а не частью рецепта, и анализируется при считывании make-файла, а не при выполнении правила.

Итак, к моменту выполнения вашего правила оно попадает в ваш eval, все операторы ifeq уже давно расширены и рассмотрены.

В общем, практически никогда не стоит использовать eval внутри рецепта. Он почти никогда не сделает то, на что вы надеетесь.

Если вам нужно проверить какое-то значение внутри рецепта, вам нужно написать для этого код оболочки, а не код make-файла, и сделать отступ для кода оболочки с помощью TAB, чтобы передать его в оболочку.

...