Видимо нет булева типа в GNU Make не условный, так это казалось лучшим решением:Переменная в make-файле условна?
$(DEF_TARGET):
if [ "$(CHECK)" != "y" ]; then \
var=foo; \
$(if $(filter foo,$(var)),result=true,result=false); \
fi
Проблема заключается в том, что независимо от того, если var=foo
или var=bar
, result
всегда будет false
. Замена $(var)
с foo
или bar
приведет к правильному результату.
Почему это не работает? Есть ли лучшее решение проблемы?
Edit:
После Makefile запускается с помощью команды make -f make.txt
.PHONY: all
all:
X=aaa; \
Y=aaa; \
if [[ '$(filter $(X),$(Y))' ]]; then echo "matched!"; else echo "not matched!"; fi
выход:
X=aaa; \
Y=aaa; \
if [[ '' ]]; then echo "matched!"; else echo "not matched!"; fi
not matched!
Почему терпят неудачу, когда X
и Y
присваиваются значения в мишени рецепт?
'[" CHECK "! =" Y "]' (условная часть оболочки, часть целевого рецепта) сравнивает буквенную строку '' CHECK "' с литеральной строкой '' y "' и всегда будет оценивать true , Какую логику нужно строить? – bobah
К сожалению, это была ошибка ввода. Я хочу создать операцию 'OR', чтобы я мог проверять несколько слов в' $ (var) 'и иметь' result = true', если совпадение найдено. В этом примере я просто проверяю 'foo', пока не получу его для работы. –
@PeterSmith причина, по которой у вас возникают проблемы, заключается в том, что вы пытаетесь сделать с рецептом make-файла, что они не предназначены для выполнения. То, что вы хотите, лучше всего делать за пределами рецепта или, возможно, даже без Make, просто с помощью сценария оболочки. –