Gibt es eine Befehlszeile, make
um herauszufinden, welche der Voraussetzungen eines Ziels nicht aktualisiert werden?
Antworten:
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 dodgy
Ziel interessiert sind , anstatt nur make -d
hundert verschiedene Dinge zu bewirken, versuchen Sie Folgendes:
make clean
make -d dodgy
(vorausgesetzt, Sie haben clean
natürlich ein Ziel).
Das make --debug
ist identisch mit, make -d
aber Sie können auch angeben:
make --debug=FLAGS
wo Flaggen sein können:
a
für alle Debugging (wie make -d
und 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=b
es 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'.
-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 wie make -n
.
-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.
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
Normalerweise benutze ich -d nicht, wie die vorherigen Antwortenden sagten.
Ich entweder:
Unten ist ein Code, den ich zum Ausdrucken von Werten verwende:
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 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).
# 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
Weitere Informationen zu meinen Make-Dateien finden Sie hier: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
echo
an jedem Ziel ein Debugging durchführen, um das herauszufinden?