makefile檔案編寫_Makefile變數的定義和使用
變數對於我們來說是不陌生的,在學習各種程式語言時會經常用到。就拿C語言來說,變數的使用是十分常見的,變數可以用來儲存一個值或者是使用變數進行運算操作。Makefile 中的變數也是這樣,我們可以利用它來表示某些多處使用而又可能發生變化的內容,不僅可以節省重複修改的工作,還可以避免遺漏。
變數的定義
Makefile 檔案中定義變數的基本語法如下:
變數的名稱=值列表
Makefile 中的變數的使用其實非常的簡單,因為它並沒有像其它語言那樣定義變數的時候需要使用資料型別。變數的名稱可以由大小寫字母、阿拉伯數字和下劃線構成。等號左右的空白符沒有明確的要求,因為在執行 make 的時候多餘的空白符會被自動的刪除。至於值列表,既可以是零項,又可以是一項或者是多項。如:
VALUE_LIST = one two three
呼叫變數的時候可以用 "$(VALUE_LIST)" 或者是 "${VALUE_LIST}" 來替換,這就是變數的引用。例項:
OBJ=main.o test.o test1.o test2.otest:$(OBJ)gcc -o test $(OBJ)
這就是引用變數後的 Makefile 的編寫,比我們之前的編寫方式要簡單的多。當要新增或者是刪除某個依賴檔案的時候,我們只需要改變變數 "OBJ" 的值就可以了。
變數的基本賦值
知道了如何定義,下面我們來說一下 Makefile 的變數的四種基本賦值方式:
簡單賦值 ( := ) 程式語言中常規理解的賦值方式,只對當前語句的變數有效。
遞迴賦值 (=) 賦值語句可能影響多個變數,所有目標變數相關的其他變數都受影響。
條件賦值 ( ?= ) 如果變數未定義,則使用符號中的值定義變數。如果該變數已經賦值,則該賦值語句無效。
追加賦值 ( += ) 原變數用空格隔開的方式追加一個新值。
簡單賦值
x:=foo
y:=$(x)b
x:=new
test:
@echo "y=>$(y)"
@echo "x=>$(x)"
在 shell 命令列執行make test
我們會看到:
y=>foob
遞迴賦值
x=foo
y=$(x)b
x=new
test:
@echo "y=>$(y)"
@echo "x=>$(x)"
在 shell 命令列執行make test
我們會看到:
y=>newb
x=>new
條件賦值
x:=foo
y:=$(x)b
x?=new
test:
@echo "y=>$(y)"
@echo "x=>$(x)"
在 shell 命令列執行make test
我們會看到:
y=>foob
x=>foo
追加賦值
x:=foo
y:=$(x)b
x+=$(y)
test:
@echo "y=>$(y)"
@echo "x=>$(x)"
在 shell 命令列執行make test
我們會看到:
y=>foob
x=>foo foob
不同的賦值方式會產生不同的結果,我們使用的時候應該根據具體的情況選擇相應的賦值規則。變數使用的範圍很廣,它可以出現在規則的模式中,也可以出現在規則的命令中或者是作為 Makefile 函式的引數來使用。總之,變數的使用在我們的 Makefile 編寫中還是非常廣泛的,可以說我們的 Makefile 中必不可少的東西。其實變數在我們的 Makefile 中還是有很多種類的,它們的意義是不相同的。比如我們的環境變數,自動變數,模式指定變數等。其他的變數我們會在其他的文章裡做介紹。