make使用總結(3)-Makefile文法
變量
Makefile中的變量主要是用來儲存、處理字元串。變量名區分大小寫.引用變量時使用
$(variableName)
的格式,如
$(BIN)
.由于
$
有特殊含義,是以當遇到真實的
$
時用
$$
來表示。可以使用
$$$$
列印目前程序id。
Makefile中變量的使用如下
BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj
SRCS := $(wildcard *.c);
變量指派可以分為兩種:
-
:指派時使用立即指派
或:=
。如::=
就是立即指派。在變量指派時就會展開。如BIN := main
,在指派過程中就會展開SRCS := $(wildcard *.c)
函數,将函數的傳回值指派給SRCS變量。推薦使用此方式指派。wildcard()
-
:指派時使用延時指派
。如=
為延時指派。在變量被規則使用到時才進行展開。SRCPATH = src1
為了友善Makefile檔案編寫,還可以使用如下指派:
-
:對變量進行追加.eg:+=
.SRCPATH += src2
-
:在變量未定義時進行指派.eg:?=
.OBJPATH ?= obj
為了友善規則編寫,make還定義了一些
自動變量
。主要是為了友善擷取
規則
中的具體的
目标
名和
依賴項
.
-
:目前規則的[email protected]
名目标
-
:第一個$<
名依賴項
-
:所有的依賴項清單,重名依賴項被忽略$^
-
:所有比目标檔案新的依賴項清單$?
-
:包括重名依賴項的所有依賴項清單$+
-
:模式規則或靜态模式規則中的莖,也即$*
所代表的部分%
- 上述七個自動化變量除了直接引用外,還可以在其後增加D或者F字元擷取目錄名和檔案名,如: ( @ D ) 表 示 目 标 文 件 的 目 錄 名 , (@D)表示目标檔案的目錄名, (@D)表示目标檔案的目錄名,(@F)表示目标檔案的檔案名
為了友善Makefile編寫,make定義了一些有固定含義的變量,如下:
-
:這個變量在編寫makefile時經常遇到。主要用來指定依賴檔案的搜尋路徑,使用空格或冒号将多個路徑分開.當規則的依賴檔案或目标檔案不在目前目錄時,make會在此變量指定的目錄下去尋找依賴檔案。VPATH
-
:功能同vpath
,但比VPATH更靈活,可以使用模式比對來指定搜尋路徑,還可以清除搜尋路徑.用法如下VPATH
- vpath PATTERN DIR:為比對PATTERN模式的檔案指定搜尋目錄。eg:
指定所有.c檔案的搜尋路徑vpath %.c ../wild_code/
- vpath PATTERN:清除比對PATTERN模式的檔案設定的搜尋目錄。
- vpath:清除全部搜尋目錄。
- vpath PATTERN DIR:為比對PATTERN模式的檔案指定搜尋目錄。eg:
-
:make會自動設定為目前目錄的路徑.CURDIR
-
:make時指令行上指定的目标清單MAKECMDGOALS
-
:如果不希望在目前目錄下生成目标檔案,可以使用GPATH變量.GPATH
-
:指make指令。在Makefile檔案中調用MAKE
來執行一次make指令操作。在工程中存在多個Makefile時,會使用在根Makefile中使用$(MAKE)來執行其他子Makefile。此時一般需要$(MAKE)
選項來指定目錄。-c
在使用makefile的變量中我們需要注意,來在于不同地方的變量:
- 系統環境變量:就是Linux系統自帶的環境變量,在Makefile中可以使用。
- make定義的全局變量:如
等。VPATH
- 指令行變量:在執行make時指定的指令行變量會覆寫Makefile中同名的變量定義,如果希望變量不被覆寫則需要使用
關鍵字。override
- 自定義變量:使用者自定的變量。自定義變量優先級高于環境變量。make的
選項可防止環境變量被同名變量覆寫。-e
替換引用
我們在編寫Makefile檔案時,經常會遇到将所有的所有
xxx.c
檔案名替換為
xxx.o
檔案名。除了使用函數可以實作這一目的,變量的替換引用也可以做到這一點。
文法:
$(var:a=b) 或 ${var:a=b}
含義:把變量var中每一個字元串結尾的a用b替換掉。
如下面的例程OBJS變量的最終結果為
OBJS := test1.o test2.o test3.o
SRCS := test1.c test2.c test3.c
OBJS := $(SRCS:.c=.o)
關于技術交流
此處後的文字已經和題目内容無關,可以不看。
qq群:825695030
微信公衆号:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。