¿Cómo pasar un argumento a Makefile desde la línea de comando?
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
command-line
parameters
makefile
arguments
Meng Lu
fuente
fuente

Respuestas:
Probablemente no deberías hacer esto; estás rompiendo el patrón básico de cómo funciona Make. Pero aqui esta:
EDITAR:
Para explicar el primer comando,
$(MAKECMDGOALS)es la lista de "objetivos" detallada en la línea de comando, por ejemplo, "acción valor1 valor2".$@es una variable automática para el nombre del destino de la regla, en este caso "acción".filter-outes una función que elimina algunos elementos de una lista. Entonces$(filter-out bar, foo bar baz)regresafoo baz(puede ser más sutil, pero no necesitamos sutileza aquí).Ponlos juntos y
$(filter-out $@,$(MAKECMDGOALS))devuelve la lista de objetivos especificados en la línea de comando que no sean "acción", que podría ser "valor1 valor2".fuente
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')para omitir todos los objetivos antes y simplemente considerar los siguientes como argumentos:make target1 target2 action value1 value2%:y@:no puedo encontrar información sobre lo que hacen esas "directivas" (o como se llamen). ¿Podría explicar por favor?%:y@:es una regla . El nombre del objetivo%significa que es una regla que coincide con cualquier cosa ; es decir, si Make no puede encontrar otra forma de construir lo que le dice que construya, ejecutará esa regla. El@:es una receta ; los:medios no hacen nada y los@medios lo hacen en silencio.%:era en realidad% :, un nombre de destino de tipo comodín. Sin@:embargo , no veo nada en esa página del manual con respecto a ... sí sugiere que una regla de "no hacer nada" simplemente tendría un;después de la especificación de destino, por lo que, ¿no sería más preciso escribir% : ;como el "comodín hacer -¿Nada "regla?filter-outno funciona cuando la acción es una dependencia del objetivo especificado en la línea de comando, porque$@se establecerá en el nombre de la dependencia, no en el argumento original llamado en la línea de comando. En cambio, lo asignoMAKECMDGOALSa una matriz de shell y luego elimino el primer elemento:@ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")Aquí hay una solución de trabajo genérica basada en @ Beta
Estoy usando GNU Make 4.1
SHELL=/bin/bashencima de mi Makefile, ¡así que YMMV!Esto nos permite aceptar argumentos adicionales (al no hacer nada cuando obtenemos un trabajo que no coincide, en lugar de arrojar un error).
Y esta es una macro que obtiene los argumentos para nosotros:
Aquí hay un trabajo que podría llamar a este:
El resultado sería:
¡Nota! Puede que sea mejor utilizar un "archivo de tareas", que es un patrón bash que funciona de manera similar, solo que sin los matices de Maketools. Ver https://github.com/adriancooney/Taskfile
fuente
tabantes@echo, nospace.Enfoque mucho más sencillo. Considere una tarea:
Ahora, cuando quiero llamarlo, simplemente ejecuto algo como:
AT="build assets" make provisiono solo:
make provisionen este casoATes una cadena vacíafuente
no intentes hacer esto
en su lugar, cree un script:
y haz esto:
para obtener más explicaciones de por qué hacer esto y las advertencias de la piratería de archivos Makefile, lea mi respuesta a otra pregunta muy similar pero aparentemente no duplicada: Pasar argumentos para "hacer correr"
fuente