makefile rules
1.target
Makefile basic grammar:
target: prerequisites
command
target
是編譯目標,在編譯的時候輸入“make target”
就可以執行 target
的規則。target
既可以是目標文件,也可以是可執行文件,還可以使一個標籤,如前面的 all
。
prerequisites
是依賴關係文件,即生產 target
所需要的文件或者目標。
command
是生成 target
所需執行的命令。
2.false-target
makefile
all:
gcc name.c
.PHONYL:all
.PHONY:all is false-target .
3.self define variable
make
支持在 Makefile
文件中定義變量。合理使用變量,能增強 Makefile
文件的通用性,
並簡化 Makefile
文件編寫。
一般的Makefile
文件編寫中,通常會爲源文件、可執行文件以及編譯參數等分別定義
一個變量,並予以賦值,在編譯規則中則直接引用這些變量。
變量的定義和賦值方法通常是:
VAR=value
4.makefile 變量
這個 Makefile 和前面看到過的相比,增加了幾點內容:
(1) 增加了目標和依賴;
(2) 編譯多個 c 文件,多個文件用空格隔開;
(3) 使用了自動變量。
5.隱式規則和顯式規則
再回頭看圖 10.31 和圖 10.33 的範例的 EXE:$(OBJ),EXE
依賴於 OBJ
,但是整個
Makefile
只定義了 EXE
的生成規則,並沒有給出 OBJ
的生成規則。可是怎麼編譯卻沒有出
錯呢?
這是因爲 make
有一些既定的目標生成規則,稱之爲隱式規則。例如對於一個 file.o
文
件,make
會優先尋找同名的 file.c
文件,並按照 gcc -c file.c -o file.o
的編譯規則生成 file.o
文件。對於不同語言,有不同的隱式規則,所以一般來說,不推薦用隱式規則。
顯式規則是用戶自定義的規則。在使用隱式規則有隱患的情況下,更應當使用顯式規則,
明確指定生成規則。例如前面提到的隱式規則,用顯式規則來定義可爲:
OBJ:$(SRC)
$(CC) -o $(OBJ) -c $^
如果不用自定義變量,還可以這麼寫,也稱爲模式規則:
%.o:%.c
$(CC) -o $(OBJ) -c $@