學習Makefile第四課 使用變數

2021-06-25 10:14:08 字數 3506 閱讀 5148

使用地方:目標,依賴目標,命令,其他地方

命名規則:①字元,數字,下劃線(不應該有「:」,「#」,「=」,「  」)

②大小寫敏感

③推薦大小寫搭配

④與自動變數不同

(一).變數的基礎

宣告時需要給於初值,使用時需要在變數前加「¥」符合,最好用()或{}把變數包括起來,使用「¥」用「¥

¥」。例:objects = program.o  foo.o  utils.o

program:¥(objects)

cc  -o  program  ¥(objects)

¥(objects):defs.h

(二)變數中的變數

第一種:foo = ¥(bar)   

bar = ¥(ugh)

ugh = huh?

all:

echo¥(foo)

執行make all 時,將會輸出 huh?

優點:前面的值可以使用後面的值

缺點:有時候會陷入遞迴

第二種:避免陷入遞迴方法:使用「:=」

例:x := foo

y := ¥(x)bar     等價於     y := foo bar 

x :=later                               x := later

前面的變數不能使用後面的值

第三種:空格變數

nullstring :=

space := ¥(nullstring)#end of the line

dir:=/foo/bar    #directory  to put the frobs in  bar後面還有四個空格

第四種:「?=」

例: foo ?=bar ----如果foo沒被定義過,其變數的值就是bar,如果已被定義,這條語句什麼也不做

(三)高階變數

1.變數值的替換

①例:foo:=a.o b.o  c.o       ------定義foo變數

bar:=¥(foo:.o=.c)-------把foo中的所有以.o結尾變成以.c結尾,結果:a.c b.c  c.c

②靜態模式

例:foo := a.o b.o c.o 

bar := $(foo:%.o=%.c) 

這依賴於被替換字串中的有相同的模式,模式中必須包含乙個「%」字元,這個例子同樣讓

$(bar)變數的值為「a.c b.c c.c」。

2.把變數的值再當成變數

例:x = y

y = z

a:=¥(¥(x))

在這個例子中,$(x)的值是「y」,所以$($(x))就是$(y),於是$(a)的值就是「z」。(注意,是

「x=y」,而不是「x=$(y)」)

(四)追加變數「+=」

例1:objects = main.o foo.o bar.o utils.o

objects +=anther.o

¥(objects)值就變成:main.o foo.o bar.o utils.o  anther.o

例2:objects = main.o foo.o bar.o utils.o 

objects := $(objects) another.o 

¥(objects)值就變成:main.o foo.o bar.o utils.o  anther.o,但使用「+=」更為簡潔

如果使用「+=」之前,變數沒定義,自動變成「=」,前一次使用「:=」會以「:=」賦值

如:variable := value 

variable += more 

等價於:

variable := value 

variable :=$(variable) more 

(五)override  

如果有變數是通常make的命令列引數設定的,那麼makefile中對這個變數的賦值會被忽略。

如果你想在makefile中設定這類引數的值,那麼,你可以使用「override」指示符。其語法

是:override =

override :=

還可以追加:

override +=

對於多行的變數定義,我們用define指示符,在define指示符前,也同樣可以使用ovveride

指示符,如:

override define foo 

bar 

endef 

(六)多行變數

用define設定變數的值,工作方式和「=」一樣,沒有tab開頭,變數的值可以包含函式 命令  文字 其他變數

例:define two-lines

echo foo

echo ¥(bar)

endef

(七)環境變數

1.系統環境變數在make執行時被載入到makefile檔案中,但是如果已定義這個變數,或是由make命令列

帶入,系統的環境變數將被覆蓋,如果make指定-e引數,系統覆蓋makefile中的環境變數

2.我們設定cflags環境變數,可以再所有的makefile中使用,如果makefile中定義cflags,則使用makefile

中的這個變數

3.make巢狀使用時,上層makefile中定義的變數以系統環境變數的方式專遞到下層的makefile中。預設只

有通過命令列設定的變數被專遞,而在檔案中的變數,需要使用exprot宣告才能專遞。

(八)目標變數

為某個目標設定區域性變數

1.語法:

: : overide

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

2.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目標,以及其所引發的所有規

則中(prog.o foo.o bar.o的規則),$(cflags)的值都是「-g」

(九)模式變數

持模式變數(pattern-specific variable),通過上面的目標變數中,可以知道變數可以定義在某個目標上

。模式變數的好處就是,我們可以給定一種「模式」,可以把變數定義在符合這種模式的所有目標上。make的

「模式」一般是至少含有乙個「%」的,所以,我們可以以如下方式給

所有以[.o]結尾的目標定義目標變數:

%.o : cflags = -o 

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

: : override

override同樣是針對於系統環境傳入的變數,或是make命令列指定的變數。

內容來自《跟我一起寫makefile》

鋼琴第四課

因為此前每天都練琴,曲譜也都記住了,所以,週六,臨時被老師喊去時,非常自信。學到了很多知識。1.連貫性方面 連貫性要注意 其實,連貫性在於對曲目的熟練程度,手指的靈活程度,還有不同音之間的連貫跳躍 音要連續 不同音,要連續連線在一起 這個音落下,上個音才起來 2.節奏方面 四分音符要短快,彈到了,立...

C 學習第四課 串

字串 兩種形式,一種是c模式,一種是c 模式 c模式 char a 6 char a hello 幾種函式 strcpy str1,str2 將str2的內容複製到str1上 strcat str1,str2 將str2連到str1的後面 strlen str1 求取字串str1的長度 strcmp...

FPGA學習第四課 使用IP核

本篇內容 ip核開發例項 計數器級聯 使用ip核 後面具體的操作就可以跟著教程做了,在此就先不一一枚舉。檔案 counter tb.v 是延時 repet 迴圈 注意counter tb和counter tb,昨晚我因為這個地方沒有注意,一直報錯 optimization failed error ...