1. 程式人生 > >makefile規則整理

makefile規則整理

makefile規則整理

實際開發中,makefile改的多,寫的少。

為了後面不要在編譯連結這種地方花費太多的時間,在這裡系統性的整理其規則:

基本格式
TARGET : PREREQUISITES
    command1
    command2
    ...

TARGET:1個目標(.o,lable,可執行檔案等等)

PREREQUISITES: 一個或者多個,依賴的檔案

command:
  任意的shell命令;
  當依賴的檔案中,只要有檔案修改日期比TARGET的修改日期新,或者TARGET不存 在,就會觸發下面的command執行;
  命令需要以TAB鍵開頭,預設的是/bin/sh;
  如果下一個命令需要建立在上一個執行,那麼需要寫到同一行,用分號分隔開;
  命令失敗,make會退出規則執行,命令前加一個'-'可以忽略出錯,繼續執行;
makefile的查詢順序

預設情況下,當前目錄下依次查詢:“GNUmakefile”、“makefile”、“Makefile”
makefile中的“include”可以將其餘位置的makefile檔案內容展開到當前檔案;
makefile的執行順序

第一個目標是終極目標,終極目標有且僅有一個;
不跟lable的make命令執行,會找到第一個目標開始生成,一層一層往下找依賴關係生成目標,直到第一個TARGET生成後結束;
其中的command命令執行失敗,不會影響make的繼續執行;
但是依賴檔案的生成失敗,會導致makefile報錯退出;
用.PHONY可以宣告一些labe,控制make的執行順序;
makefile特殊變數

VPATH:尋找依賴檔案時,當前路徑下沒有的情況下,可以自動去這個變數路徑找
makefile自動變數

[email protected]
 規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,"[email protected]"就是匹配於目標中模式定義的集合。

$<
 依賴目標中的第一個目標名字

$?
 所有比目標新的依賴目標的集合。以空格分隔

$^
 所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,去除重複的依賴目標,只保留一份

$+
 所有依賴目標的集合。不去除重複的依賴目標

靜態規則
TARGETS:TARGET-PATTERN:PRE-PATTERN
    command

這個用法其實就是將“多目標規則”和“目標依賴檔案模式通配”相結合。
TARGET-PATTERN通配TARGETS,PRE-PATTERN是對TARGET-PATTERN進行一個二次解析的替換,最終類似與:TARGETS:PRE-PATTERN的效果。
命令引數

make -h :輸出help資訊(其實有這個就足夠了)
make -n :不執行命令,只顯示命令,用於除錯
make -s :禁止命令顯示
make -C :cd到一個目錄,然後執行make
make -f :指定make檔案
make -B :認為所有的目標都更新,重編譯
變數的使用

1. $(var)進行var的使用;
2. $$,表示$字元
3. := ,覆蓋之前的值,值決定於它在makefile中的位置,而不是整個makefile展開後的最終值
4. ?= ,如果沒有被賦值過就賦予等號後面的值
5.  = , make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile中最後被指定的值
6. +=, 追加變數的值