Langue: 日本語 | Español | Français | Português | 中文 | English
Précédent | Suivant | Sommaire | Version originale anglaise (gnu.org)

Annexe B Erreurs générées par make

Voici une liste des erreurs les plus courantes que make peut produire, accompagnée de quelques informations sur leur signification et sur la manière de les corriger.

Les erreurs de make ne sont pas toujours fatales, en particulier lorsqu'un préfixe - est présent sur une ligne de recette (recipe), ou lorsque l'option -k est utilisée sur la ligne de commande. Les erreurs fatales sont préfixées par la chaîne ***.

Tous les messages d'erreur sont préfixés soit par le nom du programme (généralement « make »), soit, si l'erreur est détectée dans un makefile, par le nom du fichier et le numéro de ligne contenant le problème.

Dans le tableau ci-dessous, ces préfixes communs sont omis.

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

Ces erreurs ne sont pas réellement des erreurs de make. Elles signifient qu'un programme que make a invoqué dans le cadre d'une recette a retourné un code d'erreur différent de 0 (« Error NN »), ce que make interprète comme un échec, ou bien qu'il s'est terminé d'une autre manière anormale (avec un signal d'un type quelconque). Voir Erreurs dans les recettes.

Si aucun *** n'est attaché au message, cela signifie que le sous-processus a échoué, mais que la règle du makefile était préfixée par le caractère spécial -, si bien que make a ignoré l'erreur.

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

Cela signifie que make n'a presque rien pu comprendre à la ligne du makefile qu'il vient de lire. GNU make recherche divers séparateurs (:, =, caractères de préfixe de recette, etc.) afin de déterminer quel type de ligne il analyse. Ce message signifie qu'il n'a pu trouver aucun séparateur valide.

L'une des raisons les plus fréquentes de ce message est que vous (ou peut-être votre éditeur trop serviable, comme c'est le cas de nombreux éditeurs sous MS-Windows) avez tenté d'indenter vos lignes de recette avec des espaces au lieu d'un caractère de tabulation. Dans ce cas, make utilisera la deuxième forme de l'erreur ci-dessus. Rappelez-vous que chaque ligne de la recette doit commencer par un caractère de tabulation (sauf si vous définissez .RECIPEPREFIX ; voir Autres variables spéciales). Huit espaces ne suffisent pas. Voir Syntaxe d'une règle.

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

Cela signifie que le premier élément du makefile semble faire partie d'une recette : la ligne commence par un caractère de préfixe de recette et ne paraît pas être une directive make légale (comme une affectation de variable). Les recettes doivent toujours être associées à une cible.

La deuxième forme est produite si le premier caractère non blanc de la ligne est un point-virgule ; make interprète cela comme signifiant que vous avez oublié la partie « target: prerequisite » d'une règle. Voir Syntaxe d'une règle.

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

Cela signifie que make a décidé qu'il devait construire une cible, mais qu'il n'a trouvé dans le makefile aucune instruction sur la manière de le faire, ni explicite ni implicite (y compris dans la base de données des règles par défaut).

Si vous souhaitez que ce fichier soit construit, vous devrez ajouter à votre makefile une règle décrivant comment cette cible peut être construite. Les autres causes possibles de ce problème sont des fautes de frappe dans le makefile (si le nom du fichier est erroné) ou une arborescence source corrompue (si ce fichier n'est pas censé être construit, mais devrait n'être qu'un prérequis (prerequisite)).

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

La première signifie que vous n'avez fourni aucune cible à construire sur la ligne de commande, et que make n'a trouvé aucun makefile à lire. La seconde signifie qu'un makefile a bien été trouvé, mais qu'il ne contenait aucun but par défaut et qu'aucun but n'a été indiqué sur la ligne de commande. Dans de telles situations, GNU make n'a rien à faire. Voir Arguments pour spécifier le makefile.

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

Un makefile spécifié sur la ligne de commande (première forme) ou inclus (deuxième forme) n'a pas été trouvé.

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

GNU make n'autorise qu'une seule recette par cible (à l'exception des règles à double deux-points). Si vous donnez une recette pour une cible qui en possède déjà une, cet avertissement est émis et la deuxième recette écrase la première. Voir Plusieurs règles pour une seule cible.

« Circular xxx <- yyy dependency dropped. »

Cela signifie que make a détecté une boucle dans le graphe des dépendances : après avoir suivi le prérequis yyy de la cible xxx, puis ses propres prérequis, etc., l'un d'eux dépendait à nouveau de xxx.

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

Cela signifie que vous avez défini une variable make normale (à expansion récursive) xxx qui, lorsqu'elle est développée, finit par se référer à elle-même (xxx). Cela n'est pas autorisé : utilisez soit des variables à expansion simple (« := » ou « ::= »), soit l'opérateur d'ajout (append) (« += »). Voir Comment utiliser les variables.

« Unterminated variable reference. Stop. »

Cela signifie que vous avez oublié de fournir la parenthèse ou l'accolade fermante correspondante dans votre référence de variable ou de fonction.

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

Cela signifie que vous n'avez pas fourni le nombre d'arguments requis pour cette fonction. Consultez la documentation de la fonction pour une description de ses arguments. Voir Fonctions de transformation de texte.

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

Ces erreurs sont produites pour des règles de motif statiques mal formées (voir Syntaxe des règles de motif statiques). La première signifie que la partie motif-cible de la règle est vide ; la deuxième signifie qu'il y a plusieurs caractères de motif (%) dans la partie motif-cible ; la troisième signifie qu'il n'y a aucun caractère de motif dans la partie motif-cible ; et la quatrième signifie que les trois parties de la règle de motif statique contiennent des caractères de motif (%) — or la première partie ne doit pas contenir de caractères de motif.

Si vous voyez ces erreurs sans pour autant chercher à créer une règle de motif statique, vérifiez la valeur des variables utilisées dans vos listes de cibles et de prérequis afin de vous assurer qu'elles ne contiennent pas de deux-points.

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

Cet avertissement et le suivant sont émis lorsque make détecte des conditions d'erreur liées au traitement parallèle sur des systèmes où les sous-make peuvent communiquer (voir Communiquer des options à un sous-make). Cet avertissement est émis lorsqu'une invocation récursive d'un processus make est forcée d'avoir « -jN » dans sa liste d'arguments (où N est supérieur à un). Cela peut se produire, par exemple, si vous définissez la variable d'environnement MAKE à « make -j2 ». Dans ce cas, le sous-make ne communique pas avec les autres processus make et se comporte simplement comme s'il disposait de deux tâches (jobs) qui lui sont propres.

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

Pour que les processus make puissent communiquer, le parent transmet des informations à l'enfant. Comme cela pourrait poser problème si le processus enfant n'était pas réellement un make, le parent ne le fait que s'il pense que l'enfant est un make. Le parent utilise les algorithmes habituels pour le déterminer (voir Comment fonctionne la variable MAKE). Si le makefile est construit de telle sorte que le parent ne sait pas que l'enfant est un processus make, alors l'enfant ne recevra qu'une partie des informations nécessaires. Dans ce cas, l'enfant émet ce message d'avertissement et poursuit sa construction de manière séquentielle.

« warning: ignoring prerequisites on suffix rule definition »

Selon POSIX, une règle de suffixe ne peut pas contenir de prérequis. Si une règle qui pourrait être une règle de suffixe possède des prérequis, elle est interprétée comme une simple règle explicite, avec un nom de cible inhabituel. Cette exigence est respectée lorsque le mode de conformité POSIX est activé (la cible .POSIX est définie). Dans les versions de GNU make antérieures à la 4.3, aucun avertissement n'était émis et une règle de suffixe était créée, mais tous les prérequis étaient ignorés et ne faisaient pas partie de la règle de suffixe. À partir de GNU make 4.3, le comportement est le même, et cet avertissement est en outre émis. Dans une future version, le comportement conforme à POSIX sera le seul comportement : aucune règle ayant un prérequis ne pourra être une règle de suffixe et cet avertissement sera supprimé.


Précédent | Suivant | Sommaire | Version originale anglaise (gnu.org)