Мне нужно выполнить некоторые правила make условно, только если установленный Python больше определенной версии (скажем, 2.5).
Я думал, что могу сделать что-то вроде выполнения:
python -c 'import sys; print int(sys.version_info >= (2,5))'
а затем используя вывод («1», если в порядке, «0» в противном случае) в операторе ifeq
make.
В простом сценарии оболочки bash это просто:
MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`
но это не работает в Makefile.
Какие-либо предложения? Я мог бы использовать любой другой разумный обходной путь для достижения этой цели.
Ответы:
Используйте
shell
встроенный Make, как вMY_VAR=$(shell echo whatever)
источник
$
.Упаковка задания в
eval
работает для меня.источник
.PHONY always make these targets
.Вот немного более сложный пример с конвейером и назначением переменной внутри рецепта:
источник
PODNAME
имени развертывания:$(eval PODNAME=$(shell sh -c "kubectl get pod -l app=sqlproxy -o jsonpath='{.items[0].metadata.name}'"))
Я пишу ответ, чтобы улучшить видимость фактического синтаксиса, который решает проблему. К сожалению, то, что кто-то может считать тривиальным, может стать очень серьезной головной болью для человека, который ищет простой ответ на разумный вопрос.
Поместите следующее в файл «Makefile».
Поведение, которое вы хотели бы видеть, следующее (при условии, что у вас недавно установлен Python).
Если вы скопируете и вставите вышеуказанный текст в Makefile, получите ли вы это? Возможно нет. Вы, вероятно, получите сообщение об ошибке, подобное тому, что сообщается здесь:
makefile: 4: *** отсутствует разделитель. Стоп
Почему: потому что, хотя я лично использовал настоящую вкладку, Переполнение стека (пытаясь быть полезным) преобразует мою вкладку в несколько пробелов. Вы, разочарованный гражданин Интернета, теперь копируете это, думая, что теперь у вас есть тот же текст, который я использовал. Команда make теперь читает пробелы и обнаруживает, что команда «all» неправильно отформатирована. Поэтому скопируйте приведенный выше текст, вставьте его, а затем преобразуйте пробел перед «@echo» во вкладку, и этот пример, наконец, должен, надеюсь, сработать для вас.
источник
Остерегайтесь таких рецептов
Он делает две вещи неправильно. Первая строка в рецепте выполняется в отдельном экземпляре оболочки от второй строки. Переменная тем временем теряется. Во-вторых, неправильно то, что
$
не удалось избежать.Обе проблемы были исправлены, и переменная может использоваться. Обратная косая черта объединяет обе строки в одну оболочку, поэтому установка переменной и чтение послесловия переменной работает.
Я понимаю, что в оригинальном сообщении говорилось, как получить результаты команды оболочки в переменную MAKE, и этот ответ показывает, как получить ее в переменную оболочки. Но другие читатели могут извлечь выгоду.
Одно из последних улучшений: если потребитель ожидает, что будет установлена «переменная среды», вам придется ее экспортировать.
понадобится это в make-файле
Надеюсь, что это помогает кому-то. В целом, следует избегать какой-либо реальной работы вне рецептов, потому что если кто-то использует make-файл с опцией --dry-run, чтобы только ВИДЕТЬ, что он будет делать, у него не будет никаких нежелательных побочных эффектов. Каждый
$(shell)
вызов оценивается во время компиляции, и некоторая реальная работа может быть выполнена случайно. Лучше оставить реальную работу, такую как создание идентификаторов, внутри рецептов, когда это возможно.источник
С GNU Make вы можете использовать
shell
иeval
для хранения, запуска и назначения вывода из произвольных вызовов командной строки. Разница между примере ниже , и те , использование которых:=
представляет собой:=
назначение происходит один раз (когда он встречается) и для всех. Рекурсивно расширенные переменные, установленные с=
помощью, немного более «ленивы»; ссылки на другие переменные остаются до тех пор, пока не будет указана ссылка на саму переменную, и последующее рекурсивное расширение будет происходить каждый раз при обращении к переменной , что желательно для создания «согласованных, вызываемых фрагментов». См. Руководство по настройке переменных для получения дополнительной информации.источник
$(SET_ID)
жизнь внутри изif
пункта , что является ложным , то она по - прежнему называется .В приведенном ниже примере я сохранил путь к папке Makefile
LOCAL_PKG_DIR
и затем использовалLOCAL_PKG_DIR
переменную в целях.Makefile:
Терминальный выход:
источник