Использование команд оболочки, как упоминалось в других ответах, должно быть достаточным для большинства случаев использования:
if [ 1 -gt 0 ]; then \
#do something \
fi
Однако, если вы, как и я, хотите использовать больше чем сравнение для , тогда установите переменную make
с помощью make
'$(eval)
, то вы обнаружите, что пытаетесь сделать это, используя модель другого ответа:
if [ 1 -gt 0 ]; then \
$(eval FOO := value) \
fi
выдает ошибку:
if [ 1 -gt 0 ]; then fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;'
make: *** [clean] Error 2```
Причина в том, что выражение make
$(eval)
возвращает пустую строку. В результате полученный код bash искажается. **
Я придумал следующее решение (попробовав много разных подходов!).
$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
$(eval BAR := true), \
$(eval BAR := false))
Необходимо вывести строку после выполнения арифметического сравнения (часть echo "OK"
), поскольку оператор make
$(if)
основан на логике пустой строки:
$ (если условие, то-часть [, еще-часть])
Функция if обеспечивает поддержку условного расширения в функциональном контексте (в отличие от GNU делает условные выражения make-файла, такие как ifeq (см. Синтаксис условных выражений).
Первый аргумент, условие, сначала удаляет все предшествующие и конечные пробелы, а затем расширяется. Если он расширяется до любой непустой строки, то условие считается истинным. Если оно расширяется до пустой строки, условие считается ложным.
Источник: Руководство по GNU Make
Надеюсь, это поможет!
** Примечание : Первоначально я думал, что эту проблему можно легко исправить, добавив команду bash, которая ничего не делает с выражением, например true
:
if [ $(VALUE) -ge 1 ]; then \
true; $(eval BAR := GreaterOrEqualThan1) \
else \
true; $(eval BAR := LowerThan1) \
fi
Это оказалось ужасной идеей. Я до сих пор не понял, почему, но ветка else
всегда выполняется независимо от результата сравнения.
Думаю, мне следует открыть вопрос по этому делу.