¿Cómo pasar el argumento a Makefile desde la línea de comandos?

¿Cómo pasar el argumento a Makefile desde la línea de comandos?

Entiendo que puedo hacer

$ make action VAR="value" $ value 

con Makefile

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

¿Cómo obtengo el siguiente comportamiento?

 $ make action value value 

?

Qué tal si

 $make action value1 value2 value1 value2 

Probablemente no deberías hacer esto; estás rompiendo el patrón básico de cómo funciona Make. Pero aquí está:

 action: @echo action $(filter-out $@,$(MAKECMDGOALS)) %: # thanks to chakrit @: # thanks to William Pursell 

EDITAR:
Para explicar el primer comando,

$(MAKECMDGOALS) es la lista de “objectives” detallados en la línea de comando, por ejemplo, “acción valor1 valor2”.

$@ es una variable automática para el nombre del objective de la regla, en este caso, “acción”.

filter-out es una función que elimina algunos elementos de una lista. Así que $(filter-out bar, foo bar baz) devuelve foo baz (puede ser más sutil, pero aquí no necesitamos sutileza).

Pon estos juntos y $(filter-out $@,$(MAKECMDGOALS)) devuelve la lista de objectives especificados en la línea de comandos que no sea “acción”, que podría ser “value1 value2”.

Desde mi punto de vista es mucho más fácil hacer algo como una muestra a continuación. Considera una tarea:

 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 

Ahora cuando quiero llamarlo, simplemente ejecuto algo como:

AT="build assets" make provision

o solo:

make provision en este caso AT es una cadena vacía

Aquí hay una solución de trabajo genérica basada en @ Beta’s

Estoy usando GNU Make 4.1 con SHELL=/bin/bash sobre mi Makefile, ¡así que YMMV!

Esto nos permite aceptar argumentos adicionales (al no hacer nada cuando obtenemos un trabajo que no concuerda, en lugar de arrojar un error).

 %: @: 

Y esta es una macro que nos molesta:

 args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}` 

Aquí hay un trabajo que podría llamar a este:

 test: @echo $(call args,defaultstring) 

El resultado sería:

 $ make test defaultstring $ make test hi hi 
    Intereting Posts