Debugging-Methoden
In diesem Teil werden wir über gängige Debugging-Techniken und -Probleme sprechen. Letztendlich ist das Debuggen ein Durcheinander von allem, was in einer bestimmten Situation funktioniert. Diese Methoden funktionieren für mich und ich muss mich auch bei Problemen mit den einfachsten Makefiles auf sie verlassen . Vielleicht helfen sie dir auch.
Debuggen des Makefiles / Teil 1 /
Ein sehr ärgerlicher Fehler in make
3.80 war die Fehlermeldung im Makefile , in der make
die Zeilennummer und normalerweise die Zeilennummer falsch waren. Ich habe nicht untersucht, warum dieses Problem auftritt: aufgrund importierter Dateien, Zuweisungen zu mehrzeiligen Variablen oder aufgrund benutzerdefinierter Makros. Gibt normalerweise make
eine Zeilennummer an, die größer ist als sie sollte. In komplexen Makefiles kommt es vor, dass die Zahl nicht mit 20 Zeilen übereinstimmt.
Der einfachste Weg, den Wert einer Variablen zu sehen, besteht häufig darin, ihn während der Ausführung des Ziels auszudrucken. Während es einfach ist, mit Hilfe zu drucken warning
, kann es auf lange Sicht viel Zeit und Mühe sparen, ein gemeinsames Ziel debug
für die Ausgabe von Variablen hinzuzufügen . Hier ist ein Beispiel für einen Zielcode debug
:
debug: $(for v,$(V), \ $(warning $v = $($v)))
, debug
:
$ make V="USERNAME SHELL" debug makefile:2: USERNAME = Owner makefile:2: SHELL = /bin/sh.exe make: debug is up to date.
, MAKECMDGOALS
, V
:
debug: $(for v,$(V) $(MAKECMDGOALS), \ $(if $(filter debug,$v),,$(warning $v = $($v))))
. , , make
( ) :
$ make debug PATH SHELL makefile:2: USERNAME = Owner makefile:2: SHELL = /bin/sh.exe make: debug is up to date. make: *** No rule to make target USERNAME. Stop.
make
, shell
. , , , . — :
DATE := $(shell date +%F) OUTPUT_DIR = out-$(DATE) make-directories := $(shell [ -d $(OUTPUT_DIR) ] || mkdir -p $(OUTPUT_DIR)) all: ;
sh
, :
$ make SHELL="sh -x" + date +%F + '[' -d out-2004-05-11 ']' + mkdir -p out-2004-05-11
, .
, , :
FIND_TOOL = $(firstword $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))
. :
$(warning $(TOOLPATH)) $(warning $(addsuffix /$(1).exe,$(TOOLPATH))) $(warning $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))
, ( ) .
make
make
. . , , make
, , . .
make
:
makefile:n: *** message. Stop
:
make:n: *** message. Stop.
makefile — . — , , , , , .
, make
, , makefile . , - , - . , — . , make
.
: , , .
make
:
foo: for f in $SOURCES; \ do \ … \ done
, make
$S
, OURCES
f
. , f
, :
OURCES: No such file or directory
. — .
missing separator
:
makefile:2:missing separator. Stop.
( GNU make — .):
makefile:2:missing separator (did you mean TAB instead of 8 spaces?). Stop.
make
, :, =, . , - .
commands commence before first target
makefile, ( ). make
, , , , make
.
unterminated variable reference
, . , . make
Lisp! , , Emacs.
: , , , .
" ", .
:
bash: foo: command not found
, foo
. , PATH
. , PATH
, .profile (Bourne shell), .bashrc (bash) .cshrc (C shell). , PATH
makefile, PATH
make
.
, . , make
:
$ make touch /foo/bar touch: creating /foo/bar: No such file or directory make: *** [all] Error 1
touch
, . — make
. makefile , . , , make
.
, @
. .
make
, make
.
No Rule to Make Target
:
make: *** No rule to make target XXX. Stop.
:
make: *** No rule to make target XXX, needed by YYY. Stop.
, make
XXX, make
. make
.
:
- makefile . .
- makefile — .
make
. makefile , .make
. ,
make
- , ,make
. ,make
. — VCS. ,make
- , - . , .
Overriding Commands for Target
make
( «::» , ). ,make
:
makefile:5: warning: overriding commands for target foo
:
makefile:2: warning: ignoring old commands for target foo
, ; .
makefile , . , , .
, :
# Create a jar file. $(jar_file): $(JAR) $(JARFLAGS) -f $@ $^
makefile . makefile:
# Set the target for creating the jar and add prerequisites jar_file = parser.jar $(jar_file): $(class_files)
Wenn Sie einem solchen Makefile versehentlich ein Befehlsskript hinzufügen , wird eine make
Überschreibungswarnung ausgegeben.