1. 程式人生 > 其它 >Makefile學習筆記

Makefile學習筆記

  • 賦值符“=”
    "="右邊變數的值可能出現在賦值語句之前或者之後
  • 賦值符“:=”
    ":="右邊變數的值只能出現在賦值語句之前
  • 賦值符“?=”
    "?="左邊的變數未定義時賦值才會發生
  • 變數追加“+=”
    追加前會自動新增空格
  • 模式規則
    至少在規則的目標定義中要包涵“%”,否則就是一般規則
    目標中的“%”表示對檔名的匹配,“%”表示長度任意的非空字串
    當“%”出現在目標中的時候,目標中“%”所代表的值決定了依賴中的“%”值
  • 自動變數
    自動化變數就是這種變數會把模式中所
    定義的一系列的檔案自動的挨個取出,直至所有的符合模式的檔案都取完,自動化變數只應該出現在規則的命令中
自動化變數 描述
$@ 規則中的目標集合,在模式規則中,如果有多個目標的話,“$@”表示匹配模式中定義的目標集合。
$% 當目標是函式庫的時候表示規則中的目標成員名,如果目標不是函式庫檔案,那麼其值為空。
$< 依賴檔案集合中的第一個檔案,如果依賴檔案是以模式(即“%” )定義的,那麼“$<”就是符合模式的一系列的檔案集合。
$? 所有比目標新的依賴目標集合,以空格分開。
$^ 所有依賴檔案的集合,使用空格分開,如果在依賴“$^”會去除重複的依賴檔案,值保留一份。
$+ 和“$^”類似,但是當依賴檔案存在重複的話不會去除重複的依賴檔案。
$* 這個變量表示目標模式中"%"及其之前的部分,如果目標是 test/a.test.c,目標模式為 a.%.c,那麼“$*”就是 test/a.test。
  • Makefile 偽目標
    當有和目標同名的檔案時,規則因為沒有依賴檔案,所以目標被認為是最新的
    使用.PHONY:宣告
  • 條件判斷
    ifeq,ifneq,ifdef,ifndef
    語法為:
    ifeq...endif或者ifeq...else...endif
  • 函式
    不支援自定義函式
    用法為$(函式名 引數集合)
    subst:用來完成字串替換
    patsubst:用來完成模式字串替換
    dir:用來獲取目錄
    notdir:獲取檔名
    foreach:迴圈
    wildcard:萬用字元“%”只能用在規則中,只有在規則中它才會展開,如果在變數定義和函式使用時,萬用字元不會自動展開,這個時候就要用到函式 wildcard