如何从命令行将parameter passing给Makefile?
如何从命令行将parameter passing给Makefile?
我明白我能做到
$ make action VAR="value" $ value
与Makefile
VAR = "default" action: @echo $(VAR)
我如何得到以下行为?
$ make action value value
?
怎么样
$make action value1 value2 value1 value2
你可能不应该这样做; 你打破了Make的基本模式。 但这里是:
action: @echo action $(filter-out $@,$(MAKECMDGOALS)) %: # thanks to chakrit @: # thanks to William Pursell
编辑:
为了解释第一个命令,
$(MAKECMDGOALS)
是在命令行上列出的“目标”列表,例如“action value1 value2”。
$@
是规则目标名称的自动variables ,在这种情况下是“动作”。
filter-out
是一个从列表中删除一些元素的函数。 所以$(filter-out bar, foo bar baz)
返回foo baz
(它可以更微妙,但我们不需要微妙)。
把它们放在一起, $(filter-out $@,$(MAKECMDGOALS))
返回除“action”(可能是“value1 value2”)以外的命令行上指定的目标列表。
从我的angular度来看,做下面的例子更容易。 考虑一个任务:
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
是一个空string
这是一个基于@ Beta的通用工作解决scheme
我使用GNU Make 4.1和SHELL=/bin/bash
在我的Makefile上面,所以YMMV!
这允许我们接受额外的参数(当我们得到一个不匹配的工作时,什么也不做,而不是抛出一个错误)。
%: @:
这是一个macros,它为我们提供了参考:
args = arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}
这是一个可以称之为“工作”的工作:
test: @echo $(call args,defaultstring)
结果将是:
make test defaultstring make test hi hi
🙂