gnu make項目管理(3)變量與宏

變量的賦值
  • =
    經過遞歸擴展的變量
  • :=
    經過簡單擴展的變量
  • +=
    追加運算符
  • ?=
    附帶條件的變量
變量擴展規則

2個階段
1.make會讀進makefile以及被引入的任何其他makefile,這時變量和規則都會被加載進入make的內部數據庫,建立依存圖
2.make會分析依存圖並且判斷需要跟新的工作目標然後執行腳本已完成所需要的更新動作。
在這裏插入圖片描述
在這裏插入圖片描述
下面例子
在這裏插入圖片描述
$(OUTPUT_DIR)/very_big_file會被立即擴展,因爲工作目標和必要條件中所用到的變量會被立即擴展,接着make繼續讀取makefile,$(free-space)不會被擴展,而是讀取並將之存儲起來。
free-space會被立即擴展,當然這裏不需要擴展,但是宏裏面具體內容不會被立即擴展而是存儲起來。
接下來BIN、PRINTF、DF、AWK會被立即擴展,因爲他們都是簡單變量
最後執行make整個規則變成下面這樣
在這裏插入圖片描述

變量來源
  • 文件
    變量可以被定義再makefile文件中,或者是被makefile引入(include)
  • 命令行
    在這裏插入圖片描述
    注意,如果想要忽略命令行變量,可以再makefile文件定義變量時加上override如,
    在這裏插入圖片描述
    make時,所有環境變量都自動的被定義成make的變量,但是這些變量比makefile文件或者命令行賦值的變量優先級低,會被覆蓋掉,如果不想被覆蓋向使用環境變量的話使用-e命令行選項
條件指令

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
注意,條件指令前不是shell命令,不要有tab鍵,而ifeq ifneq只能忽略都好之後的空格,要注意空格問題,可以使用strip函數
在這裏插入圖片描述
在這裏插入圖片描述

include 指令

一個makefile可以引入其他文件,用include,當沒有這個文件時make會彙報問題繼續讀取剩餘makefile,當讀完後找到更新要include文件的規則,找不到就報錯(如果想忽略的話就用sinclude),找到的話則清除內部數據庫並重新make。
include文件路徑問題
如果include的參數時絕對路徑則直接讀取該文件,如果時相對路徑則make先到當前路徑查找,找不到的話就到你make命令行-I選項指定路徑目錄繼續查找。
在這裏插入圖片描述
在這裏插入圖片描述

標準的make變量
  • MAKE_VERSION
    GNU make的版本號 如3.80
  • CURDIR
    正在執行make進程的當前工作目錄,此變量就是shell中PWD的值
  • MAKEFILE_LIST
    make所讀取的各個makefile文件名稱所構成的列表,包括默認的makefile以及命令行或者include指令所指定的makefile,在每個makefile被讀進make之前,其文件名都會被追加到MAKEFILE_LIST變量裏,所以任何makefile查看此變量最後一項就是自己的文件名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章