pretty code

2023年12月29日 星期五

Some tips in Makefile - 002

01. export 

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 沒有副檔名。

沒有留言: