Pregunta ¿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

74
2018-06-08 02:32


origen


Respuestas:


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" deletreados en la línea de comando, p. "acción valor1 valor2".

$@ es un 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. Asi que $(filter-out bar, foo bar baz) devoluciones foo baz (puede ser más sutil, pero no necesitamos sutileza aquí).

Pon esto juntos y $(filter-out $@,$(MAKECMDGOALS)) devuelve la lista de objetivos especificada en la línea de comando que no sea "acción", que podría ser "value1 value2".


139
2018-06-08 03:13



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


6
2018-02-17 10:39



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

Estoy usando GNU Make 4.1 con SHELL=/bin/bash encima de 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

3
2017-10-30 05:16