ABC ?= abc
上面表示如果 $(ABC) 未定義,則值等於 abc。
我們可以在呼叫 make 前,在 Shell 下 export ABC=ddd,則 Makefile 中就可以看到被定義成 ddd,另外一種方式則是 make ABC=ddd xxxx_target。
如果在 Makefile 中寫成 export ABC ?= abc,則這個 $(ABC) 可以傳遞到其他的程序。
假設是這樣執行 $(shell ./test.sh),即使用了 export,test.sh 中也看不到 $ABC 這個變數,這部份待確認?
順帶一提,在 Shell 下使用 export 則是將變數傳給其他的程序,比如另一個 shell script 或是執行檔等,像 C 語言可以用 getenv 取的環境變數。
02. 只看 make 執行過程,不真正執行
make -n 即可。
03. 使用 wildcard, abspath, notdir
像是在 Makefile 印出當前目錄下的所有檔案但不包括目錄本身,如果要絕對路徑則是用 abspath 取代 notdir 即可。
$(foreach log, $(notdir $(wildcard ./*.log), $(info $(log)))
另外,foreach 語法如下:
$(foreach n, list, text)
list 是一串用空白分隔的字串,n 是當前取到的單一字串,text 則是你要做的事。
04. $@, $^, $<, $?, $*
有一 rule 如下:
main.o: main.c def.h
gcc -c main.c
假設 def.h 有更動過。
$@ = main.o --> target
$^ = main.c def.h --> dependence
$< = main.c --> first dependence
$? = def.h --> changed file
$* = main --> the primary name of target
故 gcc -c main.c 可以寫成 gcc -c $<。
另外,假設 target = all,則 $* 是空字串,因為 all 沒有副檔名。
沒有留言:
張貼留言