tutorial make create makefile gnu

makefile - make - GNU hace que los rendimientos "comiencen los comandos antes del primer objetivo" error



makefile linux c (3)

Cuando obtenga los mensajes de error, siempre verifique la documentación del mensaje de error

En GNU Make 3.81 (el error parece haber sido eliminado de las versiones más nuevas), dice:

Esto significa que lo primero en el archivo MAKE parece ser parte de un script de comando: comienza con un carácter 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 esa 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 en 1: make simplemente acepta sentencias que puede analizar, como la asignación, por lo que funciona lo siguiente:

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.

En mi archivo MAKE, me gustaría verificar la existencia de una biblioteca y dar un mensaje de error informativo. Creé un condicional que debería salir del proceso make cuando el archivo no se encuentra:

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 archivo se queda atascado en la línea 13:

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

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

Traté de poner este bloque condicional en un objetivo (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.


En primer lugar, está mirando los contenidos 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 $(name) o ${name} , no $(${name}) . 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.


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.