Как передать аргумент Makefile из командной строки?
Я понимаю, что могу
$ make action VAR="value"
$ value
с участием Makefile
VAR = "default"
action:
@echo $(VAR)
Как добиться следующего поведения?
$ make action value
value
?
Как насчет
$make action value1 value2
value1 value2
Ответы:
Вероятно, вам не стоит этого делать; вы нарушаете основные принципы работы Make. Но вот оно:
РЕДАКТИРОВАТЬ:
Чтобы объяснить первую команду,
$(MAKECMDGOALS)
это список «целей», записанный в командной строке, например, «действие значение1 значение2».$@
- автоматическая переменная для имени цели правила, в данном случае «действие».filter-out
это функция, которая удаляет некоторые элементы из списка. Итак,$(filter-out bar, foo bar baz)
возвращаетсяfoo baz
(это может быть более тонким, но нам здесь не нужны тонкости).Соедините их вместе и
$(filter-out $@,$(MAKECMDGOALS))
вернет список целей, указанный в командной строке, кроме «действия», которое может быть «значение1 значение2».источник
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')
пропустить все цели раньше и просто рассматривать следующие аргументы:make target1 target2 action value1 value2
%:
и@:
не могу найти информацию о том, что делают эти «директивы» (или как они там называются). Не могли бы вы объяснить?%:
и@:
является правилом . Целевое имя%
означает, что это правило соответствует чему угодно ; то есть, если Make не может найти другого способа построить то, что вы ему говорите, он выполнит это правило.@:
Является рецепт ; что:
означает ничего не делать, а@
значит делать это молча.%:
самом деле% :
это имя цели с подстановочными знаками. Я не вижу ничего на этой странице руководства,@:
хотя ... оно предполагает, что правило «ничего не делать» будет просто иметь;
после целевой спецификации, поэтому не было бы более точным написать,% : ;
как «подстановочный знак делает -ничего "правило?filter-out
не работает, когда действие является зависимостью цели, указанной в командной строке, потому что$@
будет установлено имя зависимости, а не исходный аргумент, вызываемый в командной строке. Вместо этого я назначаюMAKECMDGOALS
массив оболочки, а затем@ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
Вот общее рабочее решение на основе @ Beta
Я использую GNU Make 4.1
SHELL=/bin/bash
поверх моего Makefile, поэтому YMMV!Это позволяет нам принимать дополнительные аргументы (ничего не делая, когда мы получаем задание, которое не совпадает, вместо того, чтобы выдавать ошибку).
И это макрос, который получает для нас аргументы:
Вот работа, которую можно назвать этой:
Результат будет:
Заметка! Возможно, вам будет лучше использовать "Taskfile", который представляет собой шаблон bash, который работает аналогично созданию, только без нюансов Maketools. См. Https://github.com/adriancooney/Taskfile
источник
tab
раньше@echo
, а неspace
.Намного проще подход. Рассмотрим задачу:
Теперь, когда я хочу назвать это, я просто запускаю что-то вроде:
AT="build assets" make provision
или просто:
make provision
в данном случаеAT
это пустая строкаисточник
не пытайся сделать это
вместо этого создайте скрипт:
и сделайте так:
для получения дополнительных объяснений, почему это делается, и предостережений относительно взлома make-файлов, прочтите мой ответ на другой очень похожий, но, по-видимому, не повторяющийся вопрос: Передача аргументов для "make run"
источник