2009-11-17 11 views
61

Gibt es eine Befehlszeile Weg in make um herauszufinden, welche der Voraussetzungen eines Ziels nicht aktualisiert wird?Debugging GNU make

+0

ist es nicht wie ein ausführlicher Modus? Und kannst du nicht einfach in jedes Echo-Debugging bei jedem Ziel gehen, um das herauszufinden? – Earlz

Antwort

85
make -d 

sollten Sie mehr als genug Informationen, um Ihre Make-Datei zu debuggen.

Seien Sie gewarnt: Es wird einige Zeit und Mühe brauchen, um die Ausgabe zu analysieren, aber das Laden der Ausgabe in Ihren Lieblings-Editor und Suchvorgänge werden viel helfen.

Sie können den Umfang der Debugging-Ausgabe erheblich reduzieren, wenn Sie das spezifische Ziel angeben, an dem Sie interessiert sind. Wenn Sie also nur an interessiert sind, können Sie versuchen, hundert verschiedene Dinge zu machen :

make clean 
make -d dodgy 

(vorausgesetzt, Sie haben einen clean Ziel natürlich).

Die make --debug ist identisch mit make -d aber Sie können auch angeben:

make --debug=FLAGS 

wo Flags sein können:

  • a für alle Debugging (das gleiche wie make -d und make --debug).
  • b für grundlegende Debugging.
  • v für etwas ausführlichere grundlegende Debugging.
  • i für implizite Regeln.
  • j für Aufrufinformationen.
  • m für Informationen während makefile Remakes.

Es sieht aus wie make --debug=b ist die beste Option für das, was Sie brauchen, wie in der folgenden Transkript gezeigt:

[email protected]> cat makefile 
c:a b 
    touch c 

[email protected]> touch a b ; make 
touch c 

[email protected]> make 
make: 'c' is up to date. 

[email protected]> 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'. 
+4

Ein anderer Vorschlag, dass, wenn Sie integrierte implizite Regeln loswerden wollen, Sie '-r' Flag neben dem bloßen' -d' verwenden können. –

17

Sind Sie für „Trockenlauf“ Make suchen? Es wird ausgedruckt, was make macht, ohne es tatsächlich zu tun, was Ihnen erlaubt zu sehen, was passiert. Die Flagge ist -n, verwenden Sie sie wie make -n.

+0

Das ist mein Favorit, '-d' ist viel zu ausführlich (sogar' --debug = b'). Vor allem, wenn du mit rekursivem make (hugh!) –

7

Ihre Frage ist ein wenig unklar. Wenn Sie sehen möchten, welche Vorgabendateien in letzter Zeit nicht geändert wurden, verwenden Sie ls -l, um deren Änderungszeit anzuzeigen.Wenn Sie sehen wollen, was machen tut, versuchen Sie dies:

 
# Make will announce when it is making this target, and why. 
sometarget: preq1 preq2 preq3 
    @echo making [email protected] 
    @echo The following preqs are newer than the target: $? 
    do_things 
+0

Ich wollte $ vorschlagen? auch –

+0

Nicht wirklich eine Befehlszeilenlösung, aber dennoch nützlich. Sie könnten es möglicherweise auf Kommandozeilenbasis machen, indem Sie die Echos nur dann ausführen, wenn ein env-var gesetzt ist. – paxdiablo

1

Einige Male Ich habe auch verwendet this (alt, aber immer noch arbeiten) interaktiv machen Debugger von John Graham-Cumming

5

Was ich normalerweise tun ist nicht mit -d wie vorherige Beantworter sagte.

ich entweder:

  1. Verwenden -p um die Datenbank zu drucken, um zu sehen, welche Regeln erstellt wurden. Dies ist praktisch, wenn Sie zweite Erweiterungsregeln haben und Regeln im laufenden Betrieb erstellen, insbesondere rekursives make.
  2. Heavy Verwendung von $ (info) -Funktion.
  3. Sie Tipps und Trick in diesem Artikel beschrieben DrDobbs Debugging Makefiles

Nachfolgend finden Sie einige Code verwende ich für Werte Ausdrucken:

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 
0

ich bin mit Gnu-Vorlagen machen machen das definieren, mache Regeln pro Ziel;

Vorlagen wie Makros, die Regeln schreiben, sie werden hier erklärt https://www.gnu.org/software/make/manual/html_node/Eval-Function.html

diese Funktion ist nützlich, wenn Sie ein Make-System, das einen Kern Make-Datei enthält alle Regeln pro Projekttyp zu erzeugen; wenn es heißt, eine gemeinsam genutzte Bibliothek zu erstellen, schreibt es die Regeln, um eine gemeinsam genutzte Bibliothek zu kompilieren; usw. für andere Arten von Zielen.

In diesem Beispiel: Wenn Sie der make-Befehlszeile SHOW_RULES = 1 hinzufügen, wird auch der Text der Regeln angezeigt, die von PROGRAM_target_setup_template generiert werden. zusammen mit dem Generieren der Regeln selbst (mit Eval).

# this one defines the target for real 
$(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog)))) 

ifneq "$(SHOW_RULES)" "" 
$(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog)))) 
endif 
  • $ (nennen ...) ruft die Vorlage
  • $ (info ...) gibt das Ergebnis der Template-Substitution; (Eval hätte Parsen der Ausgabe und neben der aktuellen Make-Datei aufgerufen)

Mehr über mein Make-Dateien hier: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

Verwandte Themen