2009-12-09 6 views
11

Sto cercando un modo per eseguire il salvataggio di un makefile se una determinata stringa non viene trovata quando si controlla la versione di uno strumento.Come condizionare un makefile in base ai risultati grep?

L'espressione grep che sto cercando di abbinare è:

dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28' 

che restituisce una riga corrispondente se è installata la versione corretta di stato implementato Dplus ™.

Come lavoro un condizionale nel mio makefile basato su questa espressione?

+0

Quale marca è questa? gnu? – Davide

+0

Sì. Specificamente in Cygwin, ma questo è solo GNU. –

risposta

12

Ecco un altro modo che funziona in GNU Marca:

 
DPLUSVERSION = $(shell dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28') 

target_of_interest: do_things do_things_that_uses_dplus 

do_things: 
    ... 


do_things_that_uses_dplus: 
ifeq ($(DPLUSVERSION),) 
    $(error proper version of dplus not installed) 
endif 
    ... 

Questo obiettivo può essere qualcosa di reale o solo un obiettivo PHONY da cui dipendono quelli reali.

+0

Ha funzionato un incantesimo, e l'ifeq ... $ (errore ...) mi consente di generare un messaggio di errore che consente allo sviluppatore di sapere perché la sua build è stata uccisa. –

+0

Attenzione! '$ (errore)' si attiva quando è ** valutato **. ciò significa che se 'DPLUSVERSION' attiva la condizione di errore,' do_things' ** non scade mai **. modificato per risolverlo. https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html – gcb

+0

@ gcb: Non penso che tu abbia testato la tua soluzione. – Beta

3

Ecco un modo:

.PHONY: check_dplus 

check_dplus: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" 

Se grep trova alcuna corrispondenza, dovrebbe dare

make: *** [check_dplus] Error 1 

Poi hanno i tuoi altri obiettivi dipendono dalla destinazione check_dplus.

2

Se questo è gnu make, si può fare

your-target: $(objects) 
    ifeq (your-condition) 
     do-something 
    else 
     do-something-else 
    endif 

vedi qui per Makefile contionals

Se il tuo make non supporta condizionali, si può sempre fare

your-target: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" || $(MAKE) -s another-target; exit 0 
    do-something 

another-target: 
    do-something-else 
Problemi correlati