Makefile的常用技術總結

###一、MAKE中的自動變量:

$@: 表示target的名字
$%: 僅當目標是函數庫文件中,表示規則中的目標成員名。 例如,如果一個目標是"foo.a(bar.o)",那麼,"$%"就是"bar.o","$@"就是"foo.a"。
$<: 表示第一個依賴條件的名字
$?: 表示所有比target更新的依賴條件的名字列表
$^: 表示所有依賴條件的名字,同時去除依賴列表中重複的條件
$+: 同$^的功能基本相同,但是他並不去除依賴列表中的重複條件
自動變量的另外一類擴展為,其中D為directory,F為File
$(@D): 如果$@為/sbin/ifconfig 那麼$(@D)為sbin
$(@F): 如果$@為/sbin/ifconfig 那麼$(@F)為ifconfig
其他自動變量均依此類推.

二、虛擬路徑:

VPATH=variables (這裡VPATH是內部變量)
vpath pattern directory-list (這裡vpath是內部指令)

表示make搜尋target和prerequisite的目錄,但是命令部分不會利用虛擬目錄,他可以包含一組以空格分開的目錄列表。
VPATH=include src
vpath %.c src1 src2 (目錄可以有多個,模式只能有一個)
vpath %.h include

三、後綴規則:

.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l 以上是後綴規則中的缺省內置規則。
.SUFFIXES: .pdf .fo .html .xml,表示自定義的後綴規則。
.SUFFIXES: 如果沒有定義任何必要條件,則表示打算刪除所有的缺省後綴規則。

.o.cpp:
g++ -I ./include -c $< -o $@
等效於
%.o: %.cpp
g++ -I ./include -c $< -o $@

###四、常用命令行選項:

make -n = --just-print 只是顯示命令,但並不真正執行他們,方便用於調試
make -f = --file 可以靈性制定makefile的名字
make -C = --directory 指出makefile的執行目錄
make -s = --silent 所有的命令都不顯示
make -i = --ignore-errors 忽略命令中失敗的命令,​​仍然繼續執行
make -B = --always-make 認為所有的目標都需要更新(重編譯)。
make -e = --environment-overrides 指明環境變量的值覆蓋makefile中定義的變量的值。
make -h = --help
make -I = --include-dir 指定一個被包含makefile的搜索目標。 可以使用多個“-I”參數來指定多個目錄
make -r = --no-builtin-rule 禁止make使用任何隱含規則
make -v = --version
make -w = --print-directory 輸出運行makefile之前和之後的信息。 這個參數對於跟蹤嵌套式調用make時很有用。
make -o = --old-file 不重新生成的指定的<file>,即使這個目標的依賴文件新於它。

书籍推荐