Makefile學習筆記(四)

2021-10-17 08:44:26 字數 3818 閱讀 2004

變數的名字可以包含字元、數字、下劃線(可以是數字開頭,在c中只允許字母和下劃線開頭),但不應該含有「:」、「#」、「=」或者空字元,比如回車,空格。

變數區分大小寫。

變數在初始化時需要給予初值,而在使用時需要在變數名前加上「$$」符號

但最好用小括號「()」或者大括號「{} 」把變數名給包括起來。如果想使用""這個

字元的話

,那麼你

需要用「

"這個字元的話,那麼你需要用「

"這個字元的

話,那麼

你需要用

「$$」來表示

變數可以用在許多地方,如規則中的「 目標 」,「 依賴 」,「 命令 」以及新的變數中。

例:

objects = program.o foo.o utils.o

program : $(objects)

cc -o program $(objects)

$(objects)

: defs.h

另外,給變數加上括號也是為了呼叫是起到安全可靠的作用,不會出現意外的錯誤,這也是和c語言裡面的巨集類似,加上括號編譯器會把它看成乙個整體,不加括號,它就是零散的,很有可能在呼叫時出現因為優先順序的運算順序導致最終結果錯誤

在makefile中有兩種方式來定義變數的值

第一種方式就是利用「=」來進行定義,「=」的左側是變數,右側是變數的值。

例:

foo = $(bar)

bar = $(ugh)

ugh = huh?

all:

echo $(foo)

當執行make all時,將輸出「huh?」

第二種方式是「 := 」操作符

例:

x :

= foo

y := $(x) bar

x := later

其等價於:

y :

= foo bar

x := later

注意:前面的變數不能使用後面的變數,只能使用前面定義好的變數。

比如:

y :

= $(x) bar

x := foo

那麼最終y的值是「bar」,而不是「foo bar」

舉個栗子:

nullstring :

= space :

= $(nullstring) # end of the line

nullstring是乙個空變數empty,但是space其實是賦值為乙個空格

最後乙個比較特殊的定義操作符「?=」,舉例:

abc  ?=  abcd
這句的意思是如果abc之前沒有被定義過,那麼現在將會被賦值為abcd,但是如果之前被定義過了,那麼現在就什麼也不做。等價於:

ifeq  ($(origin  abc)

, undefine)

abc = abcd

endif

第一種:

可以替換變數中的共有部分,其格式是「$(abc:a=b)」或是「 $」,其意思是,把變數「abc」中所有以「a」字元結尾的「a」替換成「b」,這裡的結尾意思是空格或者結束符。

舉例:

efg  :

= a.o b.o c.o

abc :

= $(efg:

.o=.c)

這段**的意思就是把以.o檔案字尾的檔案全部改為.c字尾的檔案

另外一種 替換方法 :

以 「靜態模式」

efg  :

= a.o b.o c.o

abc :

= $(efg:

%.o=

%.c)

這依賴於被替換字串中有相同的模式,功能和第一種是一樣的。

第二種:

x = y

y = z

a := $($(x)

)

在這個例子中,$(x)的值是「y」,所以$($(x)

)就是$(y)

於是$(a)的值就是「z」。(注意,是「x=y」,而不是「x=$(y)」)

「+=」就是追加變數值的操作符

舉例:

objects = main.o foo.o bar.o utils.o

objects +

= another.o

所以,$(objects)的值就變成了main.o foo.o bar.o utils.o another.o

如果有變數是使用make命令列引數設定的,那麼makefile中就會忽略對這個變數的賦值。但是如果想在makefile中設定這類引數的值,那麼就可以使用override這個操作符來設定。語法規則:

override < variable > = < value >

override < variable > = < value >

它也可以追加:

override < variable>+=

< more text>

對於多行的變數定義,可以使用定義命令包。

舉例:

override define foo

barendef

舉例:

define two-lines

echo foo

echo $(bar)

endef

從define到endef前面都不要有[tab]鍵,不然make就會認為這是乙個命令

「自動化變數」屬於「規則型變數」,這種變數的值依賴於規則的目標和依賴目標的定義。

也可以為某個目標設定區域性變數,這種變數被稱為「target-specific variable」,它允許和全域性變數(之前講的變數)同名。

區域性變數的語法規則:

: < variable-assignment>

: overide < variable-assignment>

< variable-assignment>可以是前面講過的各種賦值表示式,如「=」、「:=」、「+=」或是「?=」

第二個語法是針對於make命令列帶入的變數,或是系統環境變數。(overide)

舉例:

prog : cflags =

-g prog : prog.o foo.o bar.o

$(cc) $(cflags) prog.o foo.o bar.o

prog.o : prog.c

$(cc) $(cflags) prog.c

foo.o : foo.c

$(cc) $(cflags) foo.c

bar.o : bar.c

$(cc) $(cflags) bar.c

在這個例子中,不管全域性變數$(cflags )的值是多少,

在prog目標中,以及這個目標所引發的規則中$(cflags )的值都是「-g」,

這就是區域性變數

通過上面的目標變數,可以清楚變數可以定義在某個目標上。模式變數的好處就是我們可以給定一種模式,然後把變數定義在符合這種模式的基礎上的變數,比如:%.o : cflags = -o

同樣,模式變數的語法和「目標變數」一樣。

: < variable-assignment>

: overide < variable-assignment>

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

Makefile學習筆記

makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...

Makefile學習筆記

本文為學習筆記,僅供參考,如有好的建議歡迎指出!makefile規則 目標檔案 依賴檔案 tab 命令 命令前必須有乙個tab exp test main.c gcc main.c o test 隱式規則 o c 同名匹配 變數 類似於c中的巨集,引用方式 arg 變數名 值 引用變數可在之後定義 ...