Как я могу прервать выполнение make / makefile, основываясь на том, что переменная make-файла не была установлена / оценена?
Я придумал это, но работает, только если вызывающая сторона явно не запускает цель (т.е. работает make
только).
ifeq ($(MY_FLAG),)
abort: ## This MUST be the first target :( ugly
@echo Variable MY_FLAG not set && false
endif
all:
@echo MY_FLAG=$(MY_FLAG)
Я думаю, что-то вроде этого было бы хорошей идеей, но я ничего не нашел в руководстве make:
ifndef MY_FLAG
.ABORT
endif
Ответы:
TL; DR : использовать
error
функцию :Обратите внимание, что строки не должны иметь отступ. Точнее, никакие вкладки не должны предшествовать этим строкам.
Универсальное решение
Если вы собираетесь тестировать много переменных, для этого стоит определить вспомогательную функцию:
А вот как это использовать:
Это вывело бы ошибку как это:
Ноты:
Настоящая проверка сделана здесь:
Это отражает поведение
ifndef
условия, так что переменная, определенная для пустого значения, также считается «неопределенной». Но это верно только для простых переменных и явно пустых рекурсивных переменных:Как предполагает @VictorSergienko в комментариях, может потребоваться немного другое поведение:
И:
Целевая проверка
Также возможно расширить решение, так что можно потребовать переменную, только если вызывается определенная цель.
$(call check_defined, ...)
изнутри рецептПросто переместите чек в рецепт:
Ведущий
@
знак отключает отображение команд и:
является фактической командой, заглушка no-op оболочки .Отображение имени цели
check_defined
Функция может быть улучшена также выход целевого имени ( при условии , через$@
переменную):Таким образом, теперь неудачная проверка выдает красиво отформатированный вывод:
check-defined-MY_FLAG
особая цельЛично я бы использовал простое и понятное решение выше. Однако, например, этот ответ предлагает использовать специальную цель для выполнения фактической проверки. Можно попытаться обобщить это и определить цель как неявное шаблонное правило:
Использование:
Обратите внимание, что в
check-defined-BAR
качестве обязательного условия указан только order (|...
).Плюсы:
Минусы:
make -t
(см. Вместо выполнения рецептов ) загрязнит ваш корневой каталог большим количествомcheck-defined-...
файлов. Это печальный недостаток того факта, что правила шаблона не могут быть объявлены.PHONY
.Я считаю, что эти ограничения могут быть преодолены с помощью некоторых
eval
магических и вторичных хакерских расширений , хотя я не уверен, что оно того стоит.источник
make --version
в качестве первого шага.Используйте функцию оболочки
test
:Использование:
источник
checkforsomething
цель, в которой была только одна ,test
и сделалfoo
зависимость от нее , и 2)@if test -z "$(something)"; then echo "helpful error here"; exit 1; fi
вместо этого я изменил чек . Это дало мне возможность добавить полезную ошибку и позволило сделать название новой цели немного более показательным из того, что пошло не так.Makefile:5: *** missing separator. Stop.
test -n "$(something) || (echo "message" ; exit 1)
избегать явногоif
.Вы можете использовать IF для проверки:
Результат:
источник
[
это псевдоним командыtest
, так что это тот же ответ, что и @Messa выше. Это более компактно и включает генерацию сообщений об ошибках.Используйте обработку ошибок оболочки для неустановленных переменных (обратите внимание на двойную
$
):Если вам нужно специальное сообщение об ошибке, добавьте его после
?
:источник
Для простоты и краткости:
С выходами:
источник