Как передать аргумент в Makefile из командной строки?


как передать аргумент в Makefile из командной строки?

Я понимаю, что могу сделать

$ make action VAR="value"
$ value

С Makefile

VAR = "default"
action:
    @echo $(VAR)

как я могу получить следующее поведение?

$ make action value
value

?

как о

$make action value1 value2
value1 value2
3 74

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