Debugging the Makefile / part 2 /

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.








All Articles