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".