78 votes

Débogage de GNU make

Existe-t-il un moyen en ligne de commande pour make pour savoir lequel des prérequis d'une cible n'est pas mis à jour ?

0 votes

Il n'y a pas un mode verbeux ? Et ne pouvez-vous pas simplement entrer echo déboguer sur chaque cible pour le découvrir ?

113voto

paxdiablo Points 341644
make -d

devrait vous donner plus assez d'informations pour déboguer votre makefile.

Attention : l'analyse des résultats demandera un certain temps et des efforts, mais le fait de charger les résultats dans votre éditeur préféré et d'effectuer des recherches vous aidera beaucoup.

Vous pouvez réduire considérablement la quantité de sorties de débogage si vous spécifiez la cible spécifique qui vous intéresse. Ainsi, si vous n'êtes intéressé que par le dodgy au lieu de simplement make -d qui peut faire une centaine de choses différentes, essayez :

make clean
make -d dodgy

(en supposant que vous ayez un clean cible bien sûr).

Le site make --debug est identique à make -d mais vous pouvez également spécifier :

make --debug=FLAGS

où les drapeaux peuvent être :

  • a pour tout débogage (comme make -d et make --debug ).
  • b pour le débogage de base.
  • v pour un débogage de base légèrement plus verbeux.
  • i pour les règles implicites.
  • j pour les informations d'invocation.
  • m pour information lors des remakes de makefile.

On dirait que make --debug=b est la meilleure option pour ce dont vous avez besoin, comme le montre la transcription suivante :

pax@paxbox> cat makefile
c:a b
    touch c

pax@paxbox> touch a b ; make
touch c

pax@paxbox> make
make: 'c' is up to date.

pax@paxbox> touch a ; make --debug=b
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc. Blah, blah, blah.
Reading makefiles...
Updating goal targets....
 Prerequisite 'a' is newer than target 'c'.
Must remake target 'c'.
touch c
Successfully remade target file 'c'.

7 votes

Une autre suggestion est que si vous voulez vous débarrasser des règles implicites intégrées, vous pouvez utiliser -r à côté de simples -d .

26voto

LiraNuna Points 21565

Vous cherchez la "marche à vide" de Make ? Il imprimera ce que Make fait sans le faire réellement, ce qui vous permettra de voir ce qui se passe.

Le drapeau est -n utilisez-le comme make -n .

0 votes

C'est mon préféré, -d est beaucoup trop verbeux (même --debug=b ). Surtout si vous êtes coincé avec un make récursif (ugh !).

8voto

rocky Points 96

Il y a aussi GNU make avec un débogueur et une meilleure sortie trace/erreur : Remake

Ces deux documents, bien que toujours pertinents, sont un peu vieux.

7voto

Beta Points 37745

Votre question est un peu floue. Si vous voulez voir quels fichiers prérequis n'ont pas été modifiés récemment, utilisez ls -l pour voir leur temps de modification. Si vous voulez voir ce que make est en train de faire, essayez ceci :

\# Make will announce when it is making this target, and why.
sometarget: preq1 preq2 preq3
    @echo making $@
    @echo The following preqs are newer than the target: $?
    do\_things

0 votes

J'allais également suggérer $ ?

0 votes

Ce n'est pas vraiment une solution en ligne de commande, mais elle est néanmoins utile. Vous pourriez éventuellement la rendre basée sur la ligne de commande en ne faisant les échos que si une env-var est définie.

7voto

George André Points 120

Ce que je fais habituellement, c'est de ne pas utiliser -d comme les réponses précédentes l'ont dit.

Moi non plus :

  1. Utilisez -p pour imprimer la base de données, pour voir quelles règles ont été créées. Ceci est pratique si vous avez des règles de seconde expansion et que vous créez des règles à la volée, en particulier des règles récursives.
  2. Utilisation intensive de la fonction $(info).
  3. Utilisez les conseils et astuces décrits dans cet article du DrDobbs. Déboguer les Makefiles

Voici le code que j'utilise pour imprimer les valeurs :

define pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef

define pva
$(foreach t,$(1),$(call pv,$(t)))
endef

define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X