Debuggen von GNU machen


75

Gibt es eine Befehlszeile, makeum herauszufinden, welche der Voraussetzungen eines Ziels nicht aktualisiert werden?


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'.

7
Ein weiterer Vorschlag: Wenn Sie integrierte implizite Regeln entfernen möchten, können Sie -rneben bloßem Flag auch das Flag verwenden -d.
P Shved

24

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.


Dies ist mein Favorit, -dist viel zu ausführlich (gerade --debug=b). Besonders wenn du mit rekursivem make feststeckst (ugh!).
Adam Lindberg


7

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

Ich wollte $ vorschlagen? auch
nur jemand

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:

  1. 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.
  2. Starke Nutzung der $ (info) -Funktion.
  3. Verwenden Sie die in diesem DrDobbs-Artikel Debugging Makefiles beschriebenen Tipps und Tricks

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

1

Einige Male habe ich auch diesen (alten, aber immer noch funktionierenden) interaktiven Make-Debugger von John Graham-Cumming verwendet


0

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
  • $ (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)

Weitere Informationen zu meinen Make-Dateien finden Sie hier: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.