Idioma: 日本語 | Español | Français | Português | 中文 | English
Anterior | Siguiente | Índice | Original en inglés (gnu.org)

Apéndice B Errores generados por make

Aquí tiene una lista de los errores más comunes que puede ver generados por make, junto con cierta información sobre qué significan y cómo corregirlos.

A veces los errores de make no son fatales, sobre todo cuando hay un prefijo - en una línea de receta (recipe), o cuando se ha indicado la opción de línea de órdenes -k. Los errores que sí son fatales llevan como prefijo la cadena ***.

Todos los mensajes de error llevan como prefijo el nombre del programa (normalmente «make») o, si el error se encuentra en un makefile, el nombre del archivo y el número de línea que contienen el problema.

En la tabla siguiente, estos prefijos comunes se omiten.

«[foo] Error NN»
«[foo] signal description»

En realidad, estos errores no son errores de make en absoluto. Significan que un programa que make invocó como parte de una receta devolvió un código de error distinto de 0 («Error NN»), que make interpreta como un fallo, o bien que terminó de alguna otra forma anómala (con una señal de algún tipo). Véase Errores en las recetas.

Si al mensaje no se le adjunta ***, significa que el subproceso falló, pero la regla del makefile llevaba el carácter especial - como prefijo, de modo que make ignoró el error.

«missing separator. Stop.»
«missing separator (did you mean TAB instead of 8 spaces?). Stop.»

Esto significa que make no pudo entender casi nada de la línea del makefile que acaba de leer. GNU make busca distintos separadores (:, =, los caracteres de prefijo de receta, etc.) para determinar qué clase de línea está analizando. Este mensaje significa que no pudo encontrar uno válido.

Una de las causas más frecuentes de este mensaje es que usted (o quizá su tan servicial editor, como ocurre con muchos editores de MS-Windows) haya intentado sangrar las líneas de receta con espacios en lugar de con un carácter de tabulación. En ese caso, make usará la segunda forma del error anterior. Recuerde que toda línea de la receta debe comenzar con un carácter de tabulación (salvo que establezca .RECIPEPREFIX; véase Otras variables especiales). Ocho espacios no sirven. Véase Sintaxis de las reglas.

«recipe commences before first target. Stop.»
«missing rule before recipe. Stop.»

Esto significa que lo primero que aparece en el makefile parece ser parte de una receta: comienza con un carácter de prefijo de receta y no tiene aspecto de ser una directiva legítima de make (como una asignación de variable). Las recetas deben estar siempre asociadas a un objetivo.

La segunda forma se genera cuando el primer carácter no en blanco de la línea es un punto y coma; make lo interpreta como que ha omitido la parte «target: prerequisite» de una regla. Véase Sintaxis de las reglas.

«No rule to make target `xxx'.»
«No rule to make target `xxx', needed by `yyy'.»

Esto significa que make decidió que necesitaba construir un objetivo, pero luego no pudo encontrar en el makefile ninguna instrucción sobre cómo hacerlo, ni explícita ni implícita (incluida la base de datos de reglas predeterminadas).

Si quiere que ese archivo se construya, tendrá que añadir al makefile una regla que describa cómo puede construirse ese objetivo. Otras causas posibles de este problema son los errores tipográficos en el makefile (si el nombre del archivo es incorrecto) o un árbol de fuentes dañado (si ese archivo no debería construirse, sino que solo es un prerrequisito (prerequisite) que falta).

«No targets specified and no makefile found. Stop.»
«No targets. Stop.»

La primera significa que no indicó ningún objetivo que construir en la línea de órdenes y que make no pudo encontrar ningún makefile que leer. La segunda significa que se encontró algún makefile, pero no contenía ninguna meta predeterminada y tampoco se indicó ninguna en la línea de órdenes. En estas situaciones, GNU make no tiene nada que hacer. Véase Argumentos para especificar el makefile.

«Makefile `xxx' was not found.»
«Included makefile `xxx' was not found.»

No se encontró un makefile especificado en la línea de órdenes (primera forma) o incluido con include (segunda forma).

«warning: overriding recipe for target `xxx'»
«warning: ignoring old recipe for target `xxx'»

GNU make solo permite especificar una receta por objetivo (salvo en las reglas de doble dos puntos). Si da una receta para un objetivo que ya tiene una definida, se emite esta advertencia y la segunda receta sobrescribe la primera. Véase Múltiples reglas para un objetivo.

«Circular xxx <- yyy dependency dropped.»

Esto significa que make detectó un bucle en el grafo de dependencias: tras seguir el prerrequisito yyy del objetivo xxx, y sus prerrequisitos, etc., uno de ellos volvía a depender de xxx.

«Recursive variable `xxx' references itself (eventually). Stop.»

Esto significa que ha definido una variable de make normal (de expansión recursiva) xxx que, al expandirse, acaba haciendo referencia a sí misma (xxx). Esto no está permitido; use variables de expansión simple («:=» o «::=») o el operador de añadido («+=»). Véase Cómo usar las variables.

«Unterminated variable reference. Stop.»

Esto significa que olvidó poner el paréntesis o la llave de cierre correspondientes en su referencia a una variable o a una función.

«insufficient arguments to function `xxx'. Stop.»

Esto significa que no ha proporcionado el número de argumentos requerido para esta función. Consulte la documentación de la función para una descripción de sus argumentos. Véase Funciones para transformar texto.

«missing target pattern. Stop.»
«multiple target patterns. Stop.»
«target pattern contains no `%'. Stop.»
«mixed implicit and static pattern rules. Stop.»

Estos errores se generan para reglas de patrón estáticas mal formadas (véase Sintaxis de las reglas de patrón estáticas). El primero significa que la parte del patrón de objetivo de la regla está vacía; el segundo, que hay varios caracteres de patrón (%) en la parte del patrón de objetivo; el tercero, que no hay ningún carácter de patrón en la parte del patrón de objetivo; y el cuarto, que las tres partes de la regla de patrón estática contienen caracteres de patrón (%) —la primera parte no debería contener caracteres de patrón.

Si ve estos errores y no está intentando crear una regla de patrón estática, compruebe el valor de cualquier variable de sus listas de objetivos y de prerrequisitos para asegurarse de que no contengan dos puntos.

«warning: -jN forced in submake: disabling jobserver mode.»

Esta advertencia y la siguiente se generan si make detecta condiciones de error relacionadas con el procesamiento en paralelo en sistemas donde los sub-make pueden comunicarse (véase Comunicar opciones a un sub-make). Esta advertencia se genera si una invocación recursiva de un proceso make se ve forzada a tener «-jN» en su lista de argumentos (donde N es mayor que uno). Esto podría ocurrir, por ejemplo, si establece la variable de entorno MAKE con «make -j2». En este caso, el sub-make no se comunica con otros procesos make y simplemente fingirá que tiene dos tareas propias.

«warning: jobserver unavailable: using -j1. Add `+' to parent make rule.»

Para que los procesos make se comuniquen, el padre pasa información al hijo. Como esto podría provocar problemas si el proceso hijo no es realmente un make, el padre solo lo hace si cree que el hijo es un make. El padre usa los algoritmos habituales para determinarlo (véase Cómo funciona la variable MAKE). Si el makefile está construido de tal modo que el padre no sabe que el hijo es un proceso make, entonces el hijo solo recibirá parte de la información necesaria. En ese caso, el hijo generará este mensaje de advertencia y continuará su construcción de manera secuencial.

«warning: ignoring prerequisites on suffix rule definition»

Según POSIX, una regla de sufijo no puede contener prerrequisitos. Si una regla que podría ser una regla de sufijo tiene prerrequisitos, se interpreta como una regla explícita simple, con un nombre de objetivo extraño. Este requisito se respeta cuando está activado el modo de conformidad con POSIX (cuando está definido el objetivo .POSIX). En las versiones de GNU make anteriores a la 4.3, no se emitía ninguna advertencia y se creaba una regla de sufijo, pero todos los prerrequisitos se ignoraban y no formaban parte de la regla de sufijo. A partir de GNU make 4.3 el comportamiento es el mismo y, además, se genera esta advertencia. En una versión futura, el comportamiento conforme a POSIX será el único: ninguna regla con un prerrequisito podrá ser una regla de sufijo y esta advertencia se eliminará.


Anterior | Siguiente | Índice | Original en inglés (gnu.org)