如何从命令行将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 

🙂