2011-01-17 15 views
41

En mi archivo MAKE, me gustaría verificar la existencia de una biblioteca y dar un mensaje de error informativo. He creado un condicional que debe salir del proceso de maquillaje cuando no se encuentra el archivo:GNU make yields "los comandos comienzan antes del primer objetivo" error

9: ifeq ($(${JSONLIBPATH}),) 
10: JSONLIBPATH = ${ALTJSONLIBDIR}/${LIBJSON} 
11: endif 
12: ifeq ($(${JSONLIBPATH}),) 
13: $(error JSON library is not found. Please install libjson before building) 
14: endif 

Mi makefile se queda atascado en la línea 13:

Makefile:13: *** commands commence before first target. Stop. 

Después de la línea 13, mi makefile tiene sus objetivos.

Intenté poner este bloque condicional en un destino (por ejemplo, un objetivo llamado isJSONLibraryInstalled) pero esto no se ejecuta correctamente.

¿Cómo verificaría la existencia de un archivo y manejaría el caso de error antes de procesar los objetivos? Disculpas si esta es una pregunta tonta.

Respuesta

62

En primer lugar, está mirando el contenido de una variable que lleva el nombre de la ruta actual, que probablemente no sea la que desea. Una referencia de variable de entorno simple es $ (nombre) o $ {nombre}, no $ ($ {nombre}). Debido a esto, la línea 13 siempre se evalúa.

En segundo lugar, creo que se está ahogando en la sangría de la expresión $ (error ...). Mientras que la expresión se resuelve en una cadena vacía, todavía hay un carácter de tabulación al comienzo de la línea, que indica un comando, que a su vez no puede existir fuera de una regla.

Creo que usar espacios en lugar de pestañas para sangrar funcionaría.

+9

Más rico: Estuve atascado con esto por mucho tiempo, donde utilicé pestañas en lugar de espacios y obtuve comandos '*** comienzan antes primer error de destino Usted salvó el día. Muchas gracias ... :) – NeonGlow

+0

Gracias por ahorrarme mi tiempo ... –

+2

Gran observación ... pestaña en el lugar prohibido :) –

1

Para mí era un espacio en blanco innecesario antes del conector que causaba esto. En slickEdit, seleccioné la opción para ver todos los caracteres especiales y noté la oveja negra.

+0

Cerrar, es el carácter innecesario de la pestaña antes de la sustitución '$ (error ...' que está causando el error Al eliminarlo o reemplazarlo con espacios, el error desaparecería. –

3

Al llegar hacer que los mensajes de error, compruebe siempre la documentación Mensaje de error http://www.gnu.org/software/make/manual/make.html#Error-Messages En GNU Make 3.81 (parece haber sido eliminado de las versiones más recientes de error), que dice:

Esto significa que la primera hora de la makefile parece ser parte de un script de comando: comienza con un caracter TAB y no parece ser un comando legal make (como una asignación de variable). Los scripts de comando siempre deben estar asociados con un objetivo.

Lo que hace que las cosas sean más confusas es que la parte "no parece ser un comando legal". Eso explica por qué en:

a := b 
    $(error a) 

el error ocurre en la línea 2 y no 1: hacer simplemente acepta las declaraciones que se puede analizar como la asignación, por lo que las siguientes obras:

a := b 
a: 
    echo $a 

Nota: SO actualmente Convierte pestañas en espacios en el código, por lo que no puede copiar el código anterior en su editor: https://meta.stackexchange.com/questions/143632/tabs-converted-to-spaces

Cuestiones relacionadas