2009-12-08 11 views
43

Quiero detectar una condición en mi archivo MAKE donde una herramienta es la versión incorrecta y forzar a la marca a fallar con un mensaje de error que indica que el elemento no es la versión correcta.Cómo forzar un error en un archivo gnumake

¿Alguien puede dar un ejemplo de esto?

He intentado lo siguiente pero no es la sintaxis correcta:

ifeq "$(shell svnversion --version | sed s/[^0-9\.]*://)" "1.4" 
$error("Bad svnversion v1.4, please install v1.6") 
endif 

Gracias.

+0

Es posible que desee para comprobar esto contra 1.4. Tengo 1.4.4 instalado y el resultado '--version' contiene mucho más que el número de versión. Pruebe con algo como' ifeq "$ (shell svn --version | sed -nE -e '/ version/s /^.* ([0-9] + \. [0-9] \ +) \ .. * $$/\ 1/p ') "" 1.4 "' en su lugar –

+0

Mi sed no acepta el -E: "sed: opción inválida - E" – WilliamKF

+1

¿Tiene que hacerse? Tiendo a escribir estas pruebas en la configuración. –

Respuesta

54

Desde el manual:

$(error Bad svn version v1.4, please install v1.6) 

Esto dará lugar a make un error fatal:

$ make 
Makefile:2: *** Bad svn version v1.4, please install v1.6. Stop. 
+2

Como nota al margen, quería dar salida a un mensaje de error de líneas múltiples. , puede 'definir err_mesg = su mensaje de error de líneas múltiples ... endef', y luego,' $ (error $ (err_mesg)) '. Make mantendrá y generará' err_mesg' tal como fue escrito. – Alberto

+0

Peligro menor: si fuera de una receta, no puede haber espacios en blanco antes del '$' –

3

Las necesidades condicionales alguna atención también.

 
ifeq ($(shell svnversion --version | sed s/[^0-9\.]*://), 1.4) 
    $(error Bad svnversion v1.4, please install v1.6) 
endif 
6

Mientras $ (error ... de obras, a veces es más fácil de usar una regla que no

test_svn_version: 
     @if [ $$(svn --version --quiet | \ 
       perl -ne '@a=split(/\./); \ 
          print $$a[0]*10000 + $$a[1]*100 + $$a[2]') \ 
       -lt 10600 ]; \ 
     then \ 
      echo >&2 "Svn version $$(svn --version --quiet) too old; upgrade to v1.6"; 
      false; \ 
     fi 

Entonces haces test_svn_version un requisito previo de su objetivo de nivel superior.

+0

Esto no funciona, obtengo: /bin/sh: -c: línea 0: EOF inesperado al buscar el correspondiente ') ' /bin/sh : -c: línea 1: error de sintaxis: final inesperado de fi le – WilliamKF

+1

@WilliamKF - Hay un espacio espúreo después de un \ al final de una línea que causa ese problema. También arreglé la falta | –

Cuestiones relacionadas