Как передать аргумент в Makefile из командной строки?
как передать аргумент в Makefile из командной строки?
Я понимаю, что могу сделать
$ make action VAR="value"
$ value
С Makefile
VAR = "default"
action:
@echo $(VAR)
как я могу получить следующее поведение?
$ make action value
value
?
как о
$make action value1 value2
value1 value2
3 ответа:
вы, вероятно, не должны этого делать; вы нарушаете основной шаблон того, как сделать работы. Но вот это:
action: @echo action $(filter-out $@,$(MAKECMDGOALS)) %: # thanks to chakrit @: # thanks to William Pursell
EDIT:
Чтобы объяснить первую команду
$(MAKECMDGOALS)
- Это список "целей", прописанных в командной строке, например"действие value1 value2".
$@
это автоматическая переменная для имени цели правила, в данном случае "действие".
filter-out
- это функция, которая удаляет некоторые элементы из списка. Так что$(filter-out bar, foo bar baz)
возвращаетfoo baz
(это может быть более тонким, но нам не нужна тонкость здесь).таким
$(filter-out $@,$(MAKECMDGOALS))
возвращает список целей, указанных в командной строке, кроме "action", который может быть"value1 value2".
С моей точки зрения гораздо легче сделать что-то вроде примера ниже. Рассмотрим задачу:
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
- пустая строка
вот общее рабочее решение, основанное на @Beta's
Я использую GNU Make 4.1 с
SHELL=/bin/bash
поверх моего Makefile, так что YMMV!Это позволяет нам принимать дополнительные аргументы (ничего не делая, когда мы получаем задание, которое не соответствует, а не бросать ошибку).
%: @:
и это макрос, который получает args для нас:
args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-}`
вот работа, которая может назвать это:
test: @echo $(call args,defaultstring)
результат будет такой:
$ make test defaultstring $ make test hi hi