Come passare argomenti a Makefile dalla riga di comando?

Come passare argomenti a Makefile dalla riga di comando?

Capisco che posso fare

$ make action VAR="value" $ value 

con Makefile

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

Come ottengo il seguente comportamento?

 $ make action value value 

?

Che ne dite di

 $make action value1 value2 value1 value2 

Probabilmente non dovresti farlo; stai rompendo il modello di base di come funziona Make. Ma eccolo qui:

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

MODIFICARE:
Per spiegare il primo comando,

$(MAKECMDGOALS) è la lista di “target” specificati nella riga di comando, ad esempio “action value1 value2”.

[email protected] è una variabile automatica per il nome della destinazione della regola, in questo caso “azione”.

filter-out è una funzione che rimuove alcuni elementi da un elenco. Quindi $(filter-out bar, foo bar baz) restituisce foo baz (può essere più sottile, ma non abbiamo bisogno di sottigliezza qui).

Metti questi insieme e $(filter-out [email protected],$(MAKECMDGOALS)) restituisce l’elenco dei target specificati sulla riga di comando diversi da “action”, che potrebbe essere “valore1 valore2”.

Dal mio punto di vista molto più facile fare qualcosa come un esempio qui sotto. Considera un compito:

 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 

Ora, quando voglio chiamarlo, eseguo qualcosa come:

AT="build assets" make provision

o semplicemente:

make provision in questo caso AT è una stringa vuota

Ecco una soluzione di lavoro generica basata su @ Beta

Sto usando GNU Make 4.1 con SHELL=/bin/bash sul mio Makefile, quindi YMMV!

Questo ci permette di accettare argomenti extra (non facendo nulla quando otteniamo un lavoro che non corrisponde, piuttosto che lanciare un errore).

 %: @: 

E questa è una macro che ottiene gli argomenti per noi:

 args = `arg="$(filter-out [email protected],$(MAKECMDGOALS))" && echo $${arg:-${1}}` 

Ecco un lavoro che potrebbe chiamare questo:

 test: @echo $(call args,defaultstring) 

Il risultato sarebbe:

 $ make test defaultstring $ make test hi hi