Metode debug
Pada bagian ini, kita akan berbicara tentang teknik dan masalah debugging yang umum. Pada akhirnya, debugging adalah gado-gado dari segala sesuatu yang berfungsi dalam situasi tertentu. Metode ini berfungsi untuk saya dan harus mengandalkannya bahkan jika ada masalah dengan makefile yang paling sederhana . Mungkin mereka akan membantu Anda juga.
Debugging the Makefile / part 1 /
Salah satu bug yang sangat mengganggu di make
3.80 adalah pesan error di makefile , dimana make
nomor baris dan biasanya nomor baris salah. Saya tidak repot-repot menyelidiki mengapa masalah ini terjadi: karena file yang diimpor, penugasan ke variabel multi-baris, atau karena makro kustom. Biasanya make
memberikan nomor baris yang lebih besar dari yang seharusnya. Dalam makefile kompleks , kebetulan jumlahnya tidak sama dengan 20 baris.
Seringkali cara termudah untuk melihat nilai variabel adalah dengan mencetaknya selama eksekusi target. Meskipun mudah untuk mencetak dengan bantuan warning
, dalam jangka panjang ini dapat menghemat banyak waktu untuk sedikit usaha menambahkan tujuan umum debug
untuk mengeluarkan variabel. Berikut beberapa contoh kode target 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)
Jika Anda secara tidak sengaja menambahkan skrip perintah ke makefile semacam itu , make
peringatan penggantian akan dikeluarkan.