linux下make工具使用系列6

一、概述

Makefile中使用的變量類似於C/C++中的宏,代表一個字符串。在Makefile執行過程中,變量會被替換成所代表的字符串。
變量的命名可以包含數字、字符、下劃線,但不可以有“:”“#”“=”或者空字符。傳統的Makefile變量全部大寫,爲避免和系統變量衝突,可能會大小寫搭配。

二、變量的基礎

變量在聲明的時候需要給予初值,而在使用的時候,在變量名前加上“$(OBJECT)使$使$ 表示。

三、變量的變量

Makefile可以使使用變量值來構造變量。有兩種方式,
a、使用“=”,此時=右側的變量可以是之前沒有定義的值,可以使用後面才定義的變量值;

b、使用“:=”,右側只能是前面已經定義好的變量值。
“?=”表示如果變量沒有被定義過,則值等於右側的值。

四、變量的高級用法

1、變量值的替換
可以替換變量中共有的部分,格式爲“$(var:a=b)”或者“${var:a=b}”,含義爲將變量var中的字母a替換爲字母b。

foo:=a.o b.o c.o
ret:=${foo:o=c}

則ret爲a.c b.c c.c

2、變量值再當變量

嵌套定義

x=y
y=z
a:=$($(x))

則a爲z

五、追加變量值

使用“+=”操作符表示給變量追加值:
如果變量之前沒有被賦值,則“+=”會自動變爲“=”;如果變量之前有賦值,則會自動繼承之前的賦值,繼續增加新的值;如果變量之前是以“:=”賦值,則“+=”自動以“:=”賦值。

obj =a.o b.o
obj +=c.o
$(obj)

最後的$(obj)的值爲a.o b.o c.o

六、override提示符

如果有變量是通常make的命令行參數設置的,那麼Makefile中對該值的賦值會被忽略;而如果想在Makefile中設置該參數值,可以通過override進行設置。格式

override <variable>=<value>或者
override <varibale>:=<value>

七、多行變量

使用define關鍵字,其後跟上變量名,另起一行爲變量值,以endef結束。define前加Tab。如

    define two-lines
    echo a
    echo b
    endef

八、環境變量

系統的環境變量可以在make運行時載入到Makefile中,但如果Makefile中已經定義了這個環境變量或者make的命令行參數中已經指定了該環境變量參數,那麼在該make運行時,系統變量值會被覆蓋。
如果make運行時,指定了參數“e”,則Makefile中的環境變量值會被系統的環境變量值覆蓋。
因此,如果系統設置了“CFLAGS”環境變量,則可以在所有的Makefile中使用該變量值。
當make嵌套調用時,上層Makefile中定義的變量會以系統環境變量的方式傳遞到下層Makefile中。默認情況下,只有通過命令行設置的參數纔會傳遞,也可以通過在文件的變量前設置“export”表示可傳遞。

九、目標變量

之前提及的在Makefile中定義的變量均屬於“全局性變量”,整個文件中均可訪問。
自動化變量屬於“規則型變量”,依賴於規則的目標和依賴目標的定義,也可以設置局部變量。
格式爲

<target>:<varible-assignment>
或者
<target>:override <varible-assignment>

局部變量可以和全局變量名相同,但是在局部變量所屬的規則及連帶規則中,變量值爲局部變量值。

prog:CFLAGS=-g
prog:prog.o main.o
    $(CC) $(CFLAGS) prog.o main.o

此處CFLAGS爲-g,不管全局變量值爲多少。

十、模式變量

也可以將變量定義在符合某種模式的目標上,如%.o:CFLAGS=-o
格式爲

<pattern>:<varible-assignment>
或者
<pattern>:override <varible-assignment>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章