2009-12-09 6 views
11

Estoy buscando una forma de rescatar un archivo MAKE si no se encuentra una cierta cadena al verificar la versión de una herramienta.¿Cómo condicionalizar un archivo MAKE basado en los resultados de grep?

La expresión GREP Busco a coincidir es:

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

que devuelve una línea coincidente si está instalada la versión correcta de DPLUS.

¿Cómo trabajo un condicional en mi archivo MAKE basado en esta expresión?

+0

¿Qué marca es esto? ¿ñu? – Davide

+0

Sí. Específicamente en Cygwin, pero eso es solo GNU. –

Respuesta

12

Ésta es otra manera que funciona en 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 
    ... 

Este objetivo puede ser algo real, o simplemente un objetivo PHONY del que dependen los reales.

+0

Funcionó un hechizo, y el ifeq ... $ (error ...) me dejó arrojar un mensaje de error para que el desarrollador supiera por qué se destruyó su compilación. –

+0

¡Advertencia! '$ (error)' se activa cuando ** se evalúa **. eso significa que si 'DPLUSVERSION' activa la condición de error,' do_things' ** nunca ** se ejecutará. editado para resolver eso. https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html – gcb

+0

@gcb: No creo que hayas probado tu solución. – Beta

3

Aquí es una manera:

.PHONY: check_dplus 

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

Si grep encuentra ninguna coincidencia, se debe dar

make: *** [check_dplus] Error 1 

Luego tienen sus otros objetivos dependen del objetivo check_dplus.

2

Si esto es gnu make, puede hacerlo

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

ver aquí para Makefile contionals

Si su marca no es compatible con los condicionales, siempre se puede hacer

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 
Cuestiones relacionadas