makefile學習之路——變量

        在makefile中,支持程序設計語言中變量的概念,所有的變量只代表文本數據。

一、變量的定義和使用

#變量的定義
CC := gcc
TARGET := hello.out

#變量的使用
$(TARGET) : func.o main.o
    $(CC) -o $(TARGET) func.o main.o

        

二、變量的賦值方式

    1. 簡單賦值        :=

        只針對當前語句的變量有效

    image.png


    2. 遞歸賦值        =

    賦值操作可能影響多個其他變量,所有與目標變量相關的其他變量都將受到影響

image.png

    3. 條件賦值        ?=

    如果變量未定義,使用賦值符號中的值定義變量,如果已定義,賦值無效

image.png


    4. 追加賦值        +=

    原變量值之後加上一個新值,原變量值和新值之間由空格隔開

image.png


三、預定義變量

1、自動變量

$@   當前規則中觸發命令被執行的目標

$^    當前規則中的所有依賴  

$<    當前規則中的第一個依賴

1.1  自動變量的使用

image.png

image.png


2、特殊變量

這部分根據需要再去查詢make手冊


四、變量的高級用法

   1、變量值的替換

    1.1 使用指定字符替換變量值中的後綴字符

    1.2 語法格式:$(var:a=b)或${var:a=b}

image.png


   2. 變量的模式替換

    2.1 使用%保留變量值中的指定字符,替換其他字符

    2.2 語法格式: $(var:a=b)或${var:a=b}

image.png

    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)"

    image.png


4、規則中的模式替換

image.png

示例如下:


image.png

可以看成下面的代碼

func.o main.o : %.o : %.c
    gcc -o $@ -c $^

分別進行匹配過後,就得到了圖中的結果


5、變量值的嵌套引用

    5.1 一個變量名之中可以包含對其他變量的引用

    5.2 嵌套引用的本質是使用一個變量表示另外一個變量

image.png


6、命令行變量

    6.1 運行make時,在命令行定義變量

image.png

    6.2 命令行變量默認覆蓋makefile中定義的變量

image.png


7. override關鍵字

        使用override關鍵字以後,makefile中定義的變量不會因爲make的命令行變量而改變

image.png

8、define關鍵字

    定義多行變量時,使用define關鍵字,同時可以配合override關鍵字防止變量被覆蓋,

define定義的變量等價於使用=定義的變量

image.png


9、環境變量

    環境變量是操作系統本身的變量,makefile可以直接使用這些變量,但如果在makefile中定義了同名變量,那麼將在當前的makefile中覆蓋環境變量。運行make時。指定-e選項,可以優先使用環境變量



10、變量在不同makefile之間的傳遞方式

    10.1 直接在外部定義環境變量進行傳遞

    10.2 使用export定義變量進行傳遞

    10.3 定義make命令行變量進行傳遞    


11、目標變量

    作用域只在指定目標及連帶規則中

image.png

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)"

運行結果如下:

image.png

由於another和test存在依賴關係,因此,定義的局部變量也會對another生效


12、模式變量

    模式變量是目標變量的擴展,可以根據相應的規則,找到符合規則的目標

image.png




交流QQ羣:199546072


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章