2018年12月3日 星期一

有關 Makefile 一些語法

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

沒有留言: