Méthodes de débogage
Dans cette partie, nous parlerons des techniques et problèmes de débogage courants. En fin de compte, le débogage est un méli-mélo de tout ce qui fonctionne dans une situation donnée. Ces méthodes fonctionnent pour moi et doivent compter sur elles même en cas de problèmes avec les makefiles les plus simples . Peut-être qu'ils vous aideront aussi.
Débogage du Makefile / partie 1 /
Un bogue très ennuyeux dans make
3.80 était le message d'erreur dans le makefile , où make
le numéro de ligne et généralement le numéro de ligne étaient incorrects. Je n'ai pas pris la peine d'enquêter sur les raisons de ce problème: à cause de fichiers importés, d'affectations à des variables multilignes ou à cause de macros personnalisées. Habituellement, make
donne un numéro de ligne supérieur à ce qu'il devrait. Dans les makefiles complexes , il arrive que le nombre ne coïncide pas avec 20 lignes.
Souvent, le moyen le plus simple de voir la valeur d'une variable est de l'imprimer lors de l'exécution de la cible. Bien qu'il soit facile d'imprimer avec de l'aide warning
, à long terme, cela peut gagner beaucoup de temps, un peu d'effort en ajoutant une cible commune debug
pour la sortie des variables. Voici un exemple de code cible 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)
Si vous ajoutez par inadvertance un script de commande à un tel makefile , un make
avertissement de remplacement sera émis.