utilizar programacion make ejecutar como comando command-line parameters makefile arguments

command-line - programacion - makefile linux c



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

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

¿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


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


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 "objetivos" detallados en la línea de comando, por ejemplo, "acción valor1 valor2".

$@ es una variable automática para el nombre del objetivo 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 objetivos especificados en la línea de comandos que no sea "acción", que podría ser "value1 value2".