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

Как передать аргумент в 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 [email protected],$(MAKECMDGOALS))

%:      # thanks to chakrit
    @:    # thanks to William Pursell

EDIT:
Чтобы объяснить первую команду,

$(MAKECMDGOALS) - это список "целей", указанных в командной строке, например. "значение action1 значение2".

[email protected] - это автоматическая переменная для имя цели правила, в данном случае "действие".

filter-out - это функция, которая удаляет некоторые элементы из списка. Поэтому $(filter-out bar, foo bar baz) возвращает foo baz (он может быть более тонким, но здесь нам не нужна тонкость).

Поместите их вместе, а $(filter-out [email protected],$(MAKECMDGOALS)) возвращает список целей, указанных в командной строке, отличных от "action", который может быть "value1 value2".

Ответ 2

Вот общее рабочее решение, основанное на @Beta

Я использую GNU Make 4.1 с SHELL=/bin/bash поверх моего Makefile, так что YMMV!

Это позволяет нам принимать дополнительные аргументы (ничего не делая, когда мы получаем работу, которая не соответствует, вместо того, чтобы выдавать ошибку).

%:
    @:

И это макрос, который получает аргументы за нас:

args = 'arg="$(filter-out [email protected],$(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 "[email protected]"

и сделай это:

$ ./buildthenaction.sh value1 value2

для более подробного объяснения, почему это и предостережения о взломе make файла, прочитайте мой ответ на другой очень похожий, но, казалось бы, не дублирующий вопрос: fooobar.com/info/34275/...