Как передать аргумент в Makefile из командной строки?
Я понимаю, что могу сделать
$ make action VAR="value"
$ value
с Makefile
VAR = "default"
action:
@echo $(VAR)
Как мне получить следующее поведение?
$ make action value
value
?
Как насчет
$make action value1 value2
value1 value2
Ответ 1
Вы, вероятно, не должны этого делать; вы нарушаете базовый шаблон работы Make. Но вот он:
action:
@echo action $(filter-out $@,$(MAKECMDGOALS))
%: # thanks to chakrit
@: # thanks to William Pursell
EDIT:
Чтобы объяснить первую команду,
$(MAKECMDGOALS)
- это список "целей", указанных в командной строке, например. "значение action1 значение2".
$@
- это автоматическая переменная для имя цели правила, в данном случае "действие".
filter-out
- это функция, которая удаляет некоторые элементы из списка. Поэтому $(filter-out bar, foo bar baz)
возвращает foo baz
(он может быть более тонким, но здесь нам не нужна тонкость).
Поместите их вместе, а $(filter-out $@,$(MAKECMDGOALS))
возвращает список целей, указанных в командной строке, отличных от "action", который может быть "value1 value2".
Ответ 2
Вот общее рабочее решение, основанное на @Beta
Я использую GNU Make 4.1 с SHELL=/bin/bash
поверх моего Makefile, так что YMMV!
Это позволяет нам принимать дополнительные аргументы (ничего не делая, когда мы получаем работу, которая не соответствует, вместо того, чтобы выдавать ошибку).
%:
@:
И это макрос, который получает аргументы за нас:
args = 'arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}'
Вот работа, которая может называть эту:
test:
@echo $(call args,defaultstring)
Результат будет:
$ make test
defaultstring
$ make test hi
hi
Внимание! Возможно, вам лучше использовать "Taskfile", который представляет собой шаблон bash, который работает аналогично созданию, только без нюансов Maketools. Видеть https://github.com/adriancooney/Taskfile
Ответ 3
Гораздо проще подойти. Рассмотрим задачу:
provision:
ansible-playbook -vvvv \
-i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory \
--private-key=.vagrant/machines/default/virtualbox/private_key \
--start-at-task="$(AT)" \
-u vagrant playbook.yml
Теперь, когда я хочу позвонить, я просто запускаю что-то вроде:
AT="build assets" make provision
или просто:
make provision
в этом случае AT
является пустой строкой
Ответ 4
не пытайтесь сделать это
$ make action value1 value2
вместо этого создайте скрипт:
#! /bin/sh
# rebuild if necessary
make
# do action with arguments
action "$@"
и сделай это:
$ ./buildthenaction.sh value1 value2
для более подробного объяснения, почему это и предостережения о взломе make файла, прочитайте мой ответ на другой очень похожий, но, казалось бы, не дублирующий вопрос: fooobar.com/info/34275/...