2019年10月30日 星期三

make file

基本結構如下:

#--------------------------------------------------------------
target(要生成的文件): dependencies(被依賴的文件, Prerequisites)
#命令前面用的是「tab」而非空格。誤用空格是初學者容易犯的錯誤。
        command1
        command2
        command3
          .
          .
          .
        commandn
#可用「\」表示換行繼續,「\」後不能有空格
#--------------------------------------------------------------

說明:
1. target與dependencies中間用冒號(:)分隔開來
2. command前面是tab,不能是空白符號( ),會有錯誤,指令最後面也不能有空白符號( )
3. 註解(comment):符號為#
4. dependencies: 要完成target或產生target檔案,所需要的檔案
5. target: 透過dependencies與下面的command來完成


特殊target:

#--------------------------------------------------------------
clean:
        command1
        command2
        command3
#--------------------------------------------------------------
說明:
1. 這種沒目標文件或間接關聯,不會自動執行,不過我們執行: make clean

偽目標 .PHONY

#--------------------------------------------------------------
.PHONY: clean
clean:
        rm *.o
        rm *.exe
 #--------------------------------------------------------------
說明:
.PHONY 會將目標設成假target,使 make目錄下沒有目標檔案或目標檔案為最新時,仍可執行 make <target>
make預設的假target有 all, install, clean, distclean, TAGS, info 和 check

變數

#--------------------------------------------------------------
cc = gcc
src = a.cpp b.cpp c.cpp
program : $(src)
        $(cc) -c $(src)
#--------------------------------------------------------------
說明:
1. 變數宣告時,使用 = 或 := 給予初始值
2. 取用時,加入$(),如上面的$(src)
3. 特殊變數
3-1. $@ : target檔名
3-2. $< : 第一個dependencies檔名
3-3. $^ : 所有個dependencies的檔名, 並以空格隔開這些檔名(已經拿掉重複的檔名)
3-4. $* : target主檔名,但不含副檔名
4. 特殊等號
4-1. ?= : 若變數未定義,則替它指定新的值。否則,採用原有的值。
4-2. := : 變數的值決定於它在 Makefile 中的位置,而不是整個 Makefile 展開後最終的值
4-3. = : 變數的值為整個 Makefile 展開後最終的值
4-4. += : 把+=後面的內容,放入+=前面

萬用字元

#--------------------------------------------------------------
CC = gcc

%.o: %.c
  $(CC) -c -o $@ $<
#--------------------------------------------------------------
說明:
makefile中所用的萬用字元是 %,代表所有可能的字串。
target、個dependencies檔名可以接指定的字串來表示某些固定樣式的字串。
例:%.c 表示結尾是.c 的所有字串。

特別字元

#--------------------------------------------------------------
.PHONY: clean
clean:
    @echo "Clean..."
    -rm *.o
#--------------------------------------------------------------
說明:
1. @ : 不要顯示執行的command,因執行make後,會在終端機印出正在執行的指令
2. - : 即使執行出錯,也不會中斷執行,因make只要遇到錯誤,就會中斷執行。
故像上面沒有任何檔案可以rm時,rm傳回錯誤值,會導致 make 中斷執行。
利用 - 來關閉錯誤中斷功能,讓make不會因而中斷。

範例:

用makefile 建立資料夾
#--------------------------------------------------------------
OBJDIR = ./obj
$(OBJDIR):
    mkdir -p $@

makeDir: ${OBJDIR}
#--------------------------------------------------------------

沒有留言:

張貼留言