make使用總結(3)-Makefile語法
阿新 • • 發佈:2020-12-22
技術標籤:make使用總結Makefile變數
make使用總結(3)-Makefile語法
變數
Makefile中的變數主要是用來儲存、處理字串。變數名區分大小寫.引用變數時使用$(variableName)
的格式,如$(BIN)
.由於$
有特殊含義,所以當遇到真實的$
時用$$
來表示。可以使用$$$$
列印當前程序id。
Makefile中變數的使用如下
BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj
SRCS := $(wildcard *.c);
變數賦值可以分為兩種:
立即賦值
:賦值時使用:=
或::=
。如BIN := main
SRCS := $(wildcard *.c)
,在賦值過程中就會展開wildcard()
函式,將函式的返回值賦值給SRCS變數。推薦使用此方式賦值。延時賦值
:賦值時使用=
。如SRCPATH = src1
為延時賦值。在變數被規則使用到時才進行展開。
為了方便Makefile檔案編寫,還可以使用如下賦值:
+=
:對變數進行追加.eg:SRCPATH += src2
.?=
:在變數未定義時進行賦值.eg:OBJPATH ?= obj
.
為了方便規則編寫,make還定義了一些自動變數
。主要是為了方便獲取規則
中的具體的目標
名和依賴項
.
[email protected]
:當前規則的目標
名$<
:第一個依賴項
名$^
:所有的依賴項列表,重名依賴項被忽略$?
:所有比目標檔案新的依賴項列表$+
:包括重名依賴項的所有依賴項列表$*
:模式規則或靜態模式規則中的莖,也即%
所代表的部分- 上述七個自動化變數除了直接引用外,還可以在其後增加D或者F字元獲取目錄名和檔名,如: ( @ D ) 表 示 目 標 文 件 的 目 錄 名 , (@D)表示目標檔案的目錄名, (@D)表示目標文件的目錄名,(@F)表示目標檔案的檔名
為了方便Makefile編寫,make定義了一些有固定含義的變數,如下:
VPATH
:這個變數在編寫makefile時經常遇到。主要用來指定依賴檔案的搜尋路徑,使用空格或冒號將多個路徑分開.當規則的依賴檔案或目標檔案不在當前目錄時,make會在此變數指定的目錄下去尋找依賴檔案。vpath
:功能同VPATH
,但比VPATH更靈活,可以使用模式匹配來指定搜尋路徑,還可以清除搜尋路徑.用法如下- vpath PATTERN DIR:為匹配PATTERN模式的檔案指定搜尋目錄。eg:
vpath %.c ../wild_code/
指定所有.c檔案的搜尋路徑 - vpath PATTERN:清除匹配PATTERN模式的檔案設定的搜尋目錄。
- vpath:清除全部搜尋目錄。
- vpath PATTERN DIR:為匹配PATTERN模式的檔案指定搜尋目錄。eg:
CURDIR
:make會自動設定為當前目錄的路徑.MAKECMDGOALS
:make時命令列上指定的目標列表GPATH
:如果不希望在當前目錄下生成目標檔案,可以使用GPATH變數.MAKE
:指make命令。在Makefile檔案中呼叫$(MAKE)
來執行一次make命令操作。在工程中存在多個Makefile時,會使用在根Makefile中使用$(MAKE)來執行其他子Makefile。此時一般需要-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
微信公眾號:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。