Gibt es eine Befehlszeile Weg in make
um herauszufinden, welche der Voraussetzungen eines Ziels nicht aktualisiert wird?Debugging GNU make
Antwort
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 wiemake -d
undmake --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'.
Ein anderer Vorschlag, dass, wenn Sie integrierte implizite Regeln loswerden wollen, Sie '-r' Flag neben dem bloßen' -d' verwenden können. –
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
.
Das ist mein Favorit, '-d' ist viel zu ausführlich (sogar' --debug = b'). Vor allem, wenn du mit rekursivem make (hugh!) –
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
Ich wollte $ vorschlagen? auch –
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
Es gibt auch GNU machen mit einem Debugger und eine bessere Spur/Fehlerausgang: Remake
Screencasts:
http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Einige Male Ich habe auch verwendet this (alt, aber immer noch arbeiten) interaktiv machen Debugger von John Graham-Cumming
Was ich normalerweise tun ist nicht mit -d wie vorherige Beantworter sagte.
ich entweder:
- 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.
- Heavy Verwendung von $ (info) -Funktion.
- 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
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
- 1. GNU make Wildcard-Alternative?
- 2. BSD Make und GNU Make kompatibles Makefile
- 3. Umfassende gnu make/gcc tutorial
- 4. MinGW/GNU Make - "mehrere Zielmuster"
- 5. Boost bjam gegen GNU make
- 6. GNU make - Prune Ausgabe auf eine niedrigere Debugging-Ebene (oder zwei Debug-Ausgaben)
- 7. Erstellen einer Cygwin-Version von GNU make
- 8. GNU Make: Wie $ (Wildcard) innerhalb von $ (eval)
- 9. Was macht der `%` Charakter in GNU Make?
- 10. GNU make und Liste der Objekte
- 11. Speedup GNU make Build-Prozess - Parallelität?
- 12. GNU make 3.81: Eval-Funktion funktioniert nicht?
- 13. läuft grep aus innerhalb von GNU make
- 14. Gnu-make-Regel als Funktion anwenden
- 15. GNU make --jobs Option in QMAKE
- 16. GNU Make: Exportieren eine einfach Expanded Variable
- 17. Mehr Wildcard Muster Regeln der GNU Make
- 18. Zwei-Schritt-Kompilierungsverfahren mit gnu make
- 19. Standard Link-Skript in GNU Make
- 20. Was ist das Flag -lrt in gnu-make?
- 21. Gibt es eine Cygwin-Version von GNU make?
- 22. Gibt es ein Unit Testing Framework für GNU make?
- 23. GNU make 3.81 - wie zu tun ‚--output-sync = target‘
- 24. Wechsel zwischen GNU Make und Clearmake Compiler während eines Builds
- 25. wie man $ (eval $ (shell ...)) in GNU make macht
- 26. Iterieren über ein Verzeichnis von Dateien mit GNU Make
- 27. Bedingte Kopie einer möglicherweise nicht vorhandenen Datei mit gnu make
- 28. GNU Make - Setzen eines Flags, wenn mehrere Dateien existieren
- 29. Wie kann ich zweite Variable in Gnu make Ziele
- 30. Richtige Methode für Wildcard-Ziele in GNU Make
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