Gibt es nicht einen ausführlichen Modus? Und können Sie nicht einfach echoan jedem Ziel ein Debugging durchführen, um das herauszufinden?
Earlz
Antworten:
107
make -d
sollte Ihnen mehr als genug Informationen geben, um Ihr Makefile zu debuggen.
Seien Sie gewarnt: Es wird einige Zeit und Mühe dauern, die Ausgabe zu analysieren, aber das Laden der Ausgabe in Ihren bevorzugten Editor und das Durchführen von Suchvorgängen 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 dem dodgyZiel interessiert sind , anstatt nur make -dhundert verschiedene Dinge zu bewirken, versuchen Sie Folgendes:
make clean
make -d dodgy
(vorausgesetzt, Sie haben cleannatürlich ein Ziel).
Das make --debugist identisch mit, make -daber Sie können auch angeben:
make --debug=FLAGS
wo Flaggen sein können:
afür alle Debugging (wie make -dund make --debug).
b für das grundlegende Debuggen.
v für etwas ausführlicheres grundlegendes Debuggen.
i für implizite Regeln.
j für Aufrufinformationen.
m Informationen während Makefile-Remakes.
Es sieht so aus, als wäre make --debug=bes die beste Option für das, was Sie brauchen, wie im folgenden Transkript gezeigt:
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'.
Ihre Frage ist etwas unklar. Wenn Sie sehen möchten, welche vorausgesetzten Dateien in letzter Zeit nicht geändert wurden, verwenden Sie ls -l, um deren Änderungszeit anzuzeigen. Wenn Sie sehen möchten, was make tut, versuchen Sie Folgendes:
# Make gibt bekannt, wann und warum dieses Ziel erreicht wird.
Sometarget: preq1 preq2 preq3
@echo macht $ @
@echo Die folgenden Voraussetzungen sind neuer als das Ziel: $?
Dinge tun
Nicht wirklich eine Kommandozeilenlösung, aber dennoch nützlich. Sie können es möglicherweise befehlszeilenbasiert machen, indem Sie die Echos nur ausführen, wenn eine env-var festgelegt ist.
Paxdiablo
7
Normalerweise benutze ich -d nicht, wie die vorherigen Antwortenden sagten.
Ich entweder:
Verwenden Sie -p, um die Datenbank zu drucken und zu sehen, welche Regeln erstellt wurden. Dies ist praktisch, wenn Sie zweite Erweiterungsregeln haben und Regeln im laufenden Betrieb erstellen, insbesondere rekursive Marken.
Starke Nutzung der $ (info) -Funktion.
Verwenden Sie die in diesem DrDobbs-Artikel Debugging Makefiles beschriebenen Tipps und Tricks
Unten ist ein Code, den ich zum Ausdrucken von Werten verwende:
Diese Funktion ist nützlich, wenn Sie ein Make-System haben, das ein Kern-Makefile enthält, um alle Regeln pro Projekttyp zu generieren. Wenn es heißt, eine gemeinsam genutzte Bibliothek zu erstellen, schreibt es die Regeln zum Kompilieren einer gemeinsam genutzten Bibliothek. usw. für andere Arten von Zielen.
In diesem Beispiel: Wenn Sie der Befehlszeile make SHOW_RULES = 1 hinzufügen, wird auch der Text der Regeln angezeigt, die von PROGRAM_target_setup_template generiert werden. zusammen mit der Generierung 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
$ (call ...) ruft die Vorlage auf
$ (info ...) gibt das Ergebnis der Vorlagenersetzung aus. (eval hätte das Parsen der Ausgabe und das Hinzufügen zur aktuellen make-Datei ausgelöst)
echo
an jedem Ziel ein Debugging durchführen, um das herauszufinden?Antworten:
sollte Ihnen mehr als genug Informationen geben, um Ihr Makefile zu debuggen.
Seien Sie gewarnt: Es wird einige Zeit und Mühe dauern, die Ausgabe zu analysieren, aber das Laden der Ausgabe in Ihren bevorzugten Editor und das Durchführen von Suchvorgängen 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 dem
dodgy
Ziel interessiert sind , anstatt nurmake -d
hundert verschiedene Dinge zu bewirken, versuchen Sie Folgendes:(vorausgesetzt, Sie haben
clean
natürlich ein Ziel).Das
make --debug
ist identisch mit,make -d
aber Sie können auch angeben:wo Flaggen sein können:
a
für alle Debugging (wiemake -d
undmake --debug
).b
für das grundlegende Debuggen.v
für etwas ausführlicheres grundlegendes Debuggen.i
für implizite Regeln.j
für Aufrufinformationen.m
Informationen während Makefile-Remakes.Es sieht so aus, als wäre
make --debug=b
es die beste Option für das, was Sie brauchen, wie im folgenden Transkript gezeigt:quelle
-r
neben bloßem Flag auch das Flag verwenden-d
.Suchen Sie nach Make's "Trockenlauf"? Es wird ausgedruckt, was make tut, ohne es tatsächlich zu tun, sodass Sie sehen können, was passiert.
Die Flagge ist
-n
, benutze es wiemake -n
.quelle
-d
ist viel zu ausführlich (gerade--debug=b
). Besonders wenn du mit rekursivem make feststeckst (ugh!).Es gibt auch GNU make mit einem Debugger und einer besseren Trace- / Fehlerausgabe: Remake
Beide sind zwar immer noch relevant, aber etwas alt.
quelle
Ihre Frage ist etwas unklar. Wenn Sie sehen möchten, welche vorausgesetzten Dateien in letzter Zeit nicht geändert wurden, verwenden Sie ls -l, um deren Änderungszeit anzuzeigen. Wenn Sie sehen möchten, was make tut, versuchen Sie Folgendes:
quelle
Normalerweise benutze ich -d nicht, wie die vorherigen Antwortenden sagten.
Ich entweder:
Unten ist ein Code, den ich zum Ausdrucken von Werten verwende:
quelle
Einige Male habe ich auch diesen (alten, aber immer noch funktionierenden) interaktiven Make-Debugger von John Graham-Cumming verwendet
quelle
Ich benutze make gnu make Vorlagen, um die make Regeln pro Ziel zu definieren.
Vorlagen sind 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 haben, das ein Kern-Makefile enthält, um alle Regeln pro Projekttyp zu generieren. Wenn es heißt, eine gemeinsam genutzte Bibliothek zu erstellen, schreibt es die Regeln zum Kompilieren einer gemeinsam genutzten Bibliothek. usw. für andere Arten von Zielen.
In diesem Beispiel: Wenn Sie der Befehlszeile make SHOW_RULES = 1 hinzufügen, wird auch der Text der Regeln angezeigt, die von PROGRAM_target_setup_template generiert werden. zusammen mit der Generierung der Regeln selbst (mit eval).
Weitere Informationen zu meinen Make-Dateien finden Sie hier: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
quelle