變數的名字可以包含字元、數字、下劃線(可以是數字開頭,在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 變數名 值 引用變數可在之後定義 ...