Makefile之變量賦值
2015-02-05 北京-海淀區
首先Makefile 的語法規則是這樣的:
targets : prerequisites
command
.........
或是這樣:
targets : prerequisites ; command
command
.........
targets是文件名,以空格分開,可以使用通配符。一般來說,我們的目標基本上是一個文件,但也有可能是多個文件。
command是命令行,如果其不與“targetrerequisites”在一行,那麼,必須以[Tab鍵]開頭,如果和prerequisites在一行,那麼可以用分號做爲分隔。
prerequisites也就是目標所依賴的文件(或依賴目標)。如果其中的某個文件要比目標文件要新,那麼,目標就被認爲是“過時的”,被認爲是需要重新編譯生成的。
因爲,makefile關係到了整個工程的編譯規則。一個工程中的源文件比較多,其按類型、功能、模塊分別放在若干個目錄中,當我們修改,添加,刪除某些源文件時,要修改相應的Makefile,如果該源文件在Makefile中多處被依賴使用,那麼我們要修改Makefile多處地方,這樣會帶來諸多不便,爲了使makefile的更容易維護,在makefile中我們可以使用變量。makefile的變量也就是一個字符串,理解成C語言中的宏可能會更好。
對變量的賦值有一下幾種方式。這裏面讓人多少有些疑惑的是“=”和“:=”賦值的區別~
= 是遞歸展開式變量
value1 = 1
value2 = $(value1)
value1 = 2
最終$(value2)就變成了2
:= 是直接展開式變量
value1 := 1
value2 := $(value1)
value1 := 2
最終$(value2)是1
?= 是條件賦值
value ?= abc 意思是,當value之前沒有使用的話,就給value賦值abc;當value之前已經使用的話,就不給value賦值
+= 追加賦值
value = filename1.o filename2.o
value += filename3.o
則$(value)爲filename1.o filename2.o filename3.o
給變量賦值時,如果在一行放不下,可以用\符號將他們連接起來