makefile學習之路——變量
一、變量的定義和使用
#變量的定義 CC := gcc TARGET := hello.out #變量的使用 $(TARGET) : func.o main.o $(CC) -o $(TARGET) func.o main.o
二、變量的賦值方式
1. 簡單賦值 :=
只針對當前語句的變量有效
2. 遞歸賦值 =
賦值操作可能影響多個其他變量,所有與目標變量相關的其他變量都將受到影響
3. 條件賦值 ?=
如果變量未定義,使用賦值符號中的值定義變量,如果已定義,賦值無效
4. 追加賦值 +=
原變量值之後加上一個新值,原變量值和新值之間由空格隔開
三、預定義變量
1、自動變量
$@ 當前規則中觸發命令被執行的目標
$^ 當前規則中的所有依賴
$< 當前規則中的第一個依賴
1.1 自動變量的使用
2、特殊變量
這部分根據需要再去查詢make手冊
四、變量的高級用法
1、變量值的替換
1.1 使用指定字符替換變量值中的後綴字符
1.2 語法格式:$(var:a=b)或${var:a=b}
2. 變量的模式替換
2.1 使用%保留變量值中的指定字符,替換其他字符
2.2 語法格式: $(var:a=b)或${var:a=b}
3. 測試代碼
src1 := a.cc b.cc c.cc obj1 := $(src1:cc=o) test1 : @echo "obj1 => $(obj1)" src2 := a11b.c a22b.c a33b.c obj2 := $(src2:a%b.c=x%y) test2 : @echo "obj2 => $(obj2)"
4、規則中的模式替換
示例如下:
可以看成下面的代碼
func.o main.o : %.o : %.c gcc -o $@ -c $^
分別進行匹配過後,就得到了圖中的結果
5、變量值的嵌套引用
5.1 一個變量名之中可以包含對其他變量的引用
5.2 嵌套引用的本質是使用一個變量表示另外一個變量
6、命令行變量
6.1 運行make時,在命令行定義變量
6.2 命令行變量默認覆蓋makefile中定義的變量
7. override關鍵字
使用override關鍵字以後,makefile中定義的變量不會因為make的命令行變量而改變
8、define關鍵字
定義多行變量時,使用define關鍵字,同時可以配合override關鍵字防止變量被覆蓋,
define定義的變量等價於使用=定義的變量
9、環境變量
環境變量是操作系統本身的變量,makefile可以直接使用這些變量,但如果在makefile中定義了同名變量,那麽將在當前的makefile中覆蓋環境變量。運行make時。指定-e選項,可以優先使用環境變量
10、變量在不同makefile之間的傳遞方式
10.1 直接在外部定義環境變量進行傳遞
10.2 使用export定義變量進行傳遞
10.3 定義make命令行變量進行傳遞
11、目標變量
作用域只在指定目標及連帶規則中
var := D.T.Software new := TDelphi test : var := test-var %e : override new := test-new test : another @echo "test :" @echo "var => $(var)" @echo "new => $(new)" another : @echo "another :" @echo "var => $(var)" @echo "new => $(new)"
運行結果如下:
由於another和test存在依賴關系,因此,定義的局部變量也會對another生效
12、模式變量
模式變量是目標變量的擴展,可以根據相應的規則,找到符合規則的目標
makefile學習之路——變量