1. 程式人生 > >makefile學習之路——變量

makefile學習之路——變量

makefile 變量

在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學習之路——變量