Makefile 一些基礎摘要:
1. 用井號 # 標記為註解, 例如:
# 這一行是註解
2. 用等號 = 賦予變數內容, 例如:
cc = gcc
3. 變數前頭加錢號 $ 隨後將變數用小括號 ( ) 前後括住, 代表引用變數內容, 例如:
compile = $(cc) -c
4. $ 括號變數, 甚至能執行 shell 命令, 例如:
user_path = $(shell pwd)
5. 用冒號 : 描述檔案相關性的規則(rule), 每條規則從開頭起, 至換行字元結束. 冒號前面是目標, 後面是來源, 代表著目標與來源相關, 不同的目標就分別寫個別的規則, 當個別規則的來源很多時, 就用空白字元分開一一列表
6. 針對目標要執行的命令就寫在該目標的下一行, 為了要與規則有所區別, 所有命令列的開頭處都要先插入一個 Tab 字元(不能用空白字元), 不同的命令就隨後寫在不同行
7. 在命令列用的常用內建$變數:
$@ 就是目標
$< 來源中第一個
$^ 來源全數列表
$(@D) 目標只剩目錄名
$(@F) 目標只剩檔名(移除目錄名), 等同 $(notdir $@)
$(*D) 目標只剩主目錄名(移除副檔名)
$(*F) 目標只剩主檔名(移除目錄及副檔名)
$(<D)來源中第一個, 但只剩目錄名
$(<F)來源中第一個, 但剩檔名(移除目錄名)
$(^D) 來源全數列表, 但只剩目錄名
8. 隱性規則代表內含很多條規則, 顯性規則就很明確只有一條規則, 內建通用的隱姓規則
.c: .o 代表所有副檔名 .c 與個別的 .o 相關
9. 自訂通用隱性規則, 使用 % 代表通通適用
%.cc: %.oo 代表所有副檔名 .cc 與個別的 .oo 相關
10. 當執行 make 時, 預設會用第 1 條顯性規則執行隨後命令
11. 一個簡單的範例:
#Makefile
main = tutor.cpp
exefile = tutor
$(exefile): $(main)
g++ $< -lGLESv2 -lglfw -lGLEW -o $@ && ./$@
libgl:
sudo apt-get install libglfw3-dev libglew-dev libgles2-mesa-dev glew-utils
glinfo:
glewinfo | grep "GL_VERSION" || make libgl
run:
./tutor
clean:
rm -f $(exefile) *.o
沒有留言:
張貼留言