1. 程式人生 > 其它 >make使用總結(3)-Makefile語法

make使用總結(3)-Makefile語法

技術標籤:make使用總結Makefile變數

make使用總結(3)-Makefile語法

變數

Makefile中的變數主要是用來儲存、處理字串。變數名區分大小寫.引用變數時使用$(variableName)的格式,如$(BIN).由於$有特殊含義,所以當遇到真實的$時用$$來表示。可以使用$$$$列印當前程序id。

Makefile中變數的使用如下

BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj

SRCS :=  $(wildcard *.c);

變數賦值可以分為兩種:

  1. 立即賦值:賦值時使用:=::=。如BIN := main
    就是立即賦值。在變數賦值時就會展開。如SRCS := $(wildcard *.c),在賦值過程中就會展開wildcard()函式,將函式的返回值賦值給SRCS變數。推薦使用此方式賦值。
  2. 延時賦值:賦值時使用=。如SRCPATH = src1為延時賦值。在變數被規則使用到時才進行展開。

為了方便Makefile檔案編寫,還可以使用如下賦值:

  1. +=:對變數進行追加.eg:SRCPATH += src2.
  2. ?=:在變數未定義時進行賦值.eg:OBJPATH ?= obj.

為了方便規則編寫,make還定義了一些自動變數。主要是為了方便獲取規則中的具體的目標名和依賴項.

  1. [email protected]
    :當前規則的目標
  2. $<:第一個依賴項
  3. $^:所有的依賴項列表,重名依賴項被忽略
  4. $?:所有比目標檔案新的依賴項列表
  5. $+:包括重名依賴項的所有依賴項列表
  6. $*:模式規則或靜態模式規則中的莖,也即%所代表的部分
  7. 上述七個自動化變數除了直接引用外,還可以在其後增加D或者F字元獲取目錄名和檔名,如: ( @ D ) 表 示 目 標 文 件 的 目 錄 名 , (@D)表示目標檔案的目錄名, (@D)(@F)表示目標檔案的檔名

為了方便Makefile編寫,make定義了一些有固定含義的變數,如下:

  1. VPATH:這個變數在編寫makefile時經常遇到。主要用來指定依賴檔案的搜尋路徑,使用空格或冒號將多個路徑分開.當規則的依賴檔案或目標檔案不在當前目錄時,make會在此變數指定的目錄下去尋找依賴檔案。
  2. vpath:功能同VPATH,但比VPATH更靈活,可以使用模式匹配來指定搜尋路徑,還可以清除搜尋路徑.用法如下
    1. vpath PATTERN DIR:為匹配PATTERN模式的檔案指定搜尋目錄。eg:vpath %.c ../wild_code/指定所有.c檔案的搜尋路徑
    2. vpath PATTERN:清除匹配PATTERN模式的檔案設定的搜尋目錄。
    3. vpath:清除全部搜尋目錄。
  3. CURDIR:make會自動設定為當前目錄的路徑.
  4. MAKECMDGOALS:make時命令列上指定的目標列表
  5. GPATH:如果不希望在當前目錄下生成目標檔案,可以使用GPATH變數.
  6. MAKE:指make命令。在Makefile檔案中呼叫$(MAKE)來執行一次make命令操作。在工程中存在多個Makefile時,會使用在根Makefile中使用$(MAKE)來執行其他子Makefile。此時一般需要-c選項來指定目錄。

在使用makefile的變數中我們需要注意,來在於不同地方的變數:

  1. 系統環境變數:就是Linux系統自帶的環境變數,在Makefile中可以使用。
  2. make定義的全域性變數:如VPATH等。
  3. 命令列變數:在執行make時指定的命令列變數會覆蓋Makefile中同名的變數定義,如果希望變數不被覆蓋則需要使用override關鍵字。
  4. 自定義變數:使用者自定的變數。自定義變數優先順序高於環境變數。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
微信公眾號:嵌入式的日常
如果上面的文章對你有用,歡迎打賞、點贊、評論。二維碼