在下面代碼中,定義了一個值爲x的x變量,以延時變量的方式將它的值賦給y,以即時變量的方式將它的值賦給z。
由於y爲延時變量,因此y的取值並不會當即計算,而是在整個文件解析完成以後纔開始計算y的值。
由於z爲即時變量,因此運行到z:=$(x)
這句話時,z的值當即計算得出。java
x = x y = $(x) z := $(x) x = nothing one: @echo $(x) two: @echo $(y) three: @echo $(z)
運行命令make one two three
輸出爲編程
nothing nothing x
$@
規則目標的文件名.若是目標是檔案文件的一個成員,"$@
"就是檔案文件的名稱
$%
當目標是檔案文件的一個成員時,"$%
"是該成員的名稱.不然"$%
"爲空
$<
第一個依賴文件的名稱
$?
以空格隔開的比目標新的全部依賴文件名.若依賴文件是檔案文件的成員,只使用成員的名稱
$^
以空格隔開的全部依賴文件名.若依賴文件是檔案文件的成員,只使用成員名稱.不管一個依賴文件出現過多少次,"$^
"值中只包含其名稱的一個拷貝
$+
與"$^
"類似,但屢次列出的依賴文件按照它們在構造文件中出現的順序複製.這對於連接命令中以特定順序重複出現的庫文件名有做用
$*
隱含規則匹配的詞幹.若目標爲"dir/a.foo.b"且目標模式爲"a.%.b",則詞幹爲"dir/foo".對靜態模式規則,詞幹是文件名中與目標模式中"%"匹配的部分.應避免在隱含規則或靜態模式規則以外使用"$*
"
$(@D)
刪除結尾斜槓的目標文件名的目錄部分.若"$@
"的值爲"dir/foo.o",則"$(@D)
"爲"dir".若"$@
"不包含斜槓,則"$(@D)
"爲"."
$(@F)
目標文件名中目錄下的文件部分.若是"$@
"的值爲"dir/foo.o",那麼"$(@F)
"爲"foo.o".它等同於"$(notdir $@)
"
$(*D)
詞幹中的目錄部分,例如上例中的"dir"
$(*F)
詞幹中的目錄下文件部分,例如上例中的"foo"
$(%D)
目標檔案文件成員的目錄部分.僅對形爲"archive(member)"的檔案文件成員目標有意義,且僅在member包含目錄名時有用
$(%F)
目標檔案文件成員中的目錄下文件部分
$(<D)
第一個依賴文件的目錄部分
$(<F)
第一個依賴文件的目錄下文件部分
$(^D)
全部依賴文件的目錄部分
$(^F)
全部依賴文件的目錄下文件部分
$(?D)
比目標新的全部依賴文件的目錄部分
$(?F)
比目標新的全部依賴文件的目錄部分this
one.java:two.java three.java @echo 目標名稱:$@ @echo 不帶擴展名的目標名稱(這個變量只能在含有%目標名的命令中使用):$* @echo 第一個依賴文件的名稱:$< @echo 所有依賴,去重:$^ @echo 所有依賴,不去重,按照出現順序出現:$+ @echo 所有須要從新構建的依賴:$? %.java: @echo this is $*.java
輸入make命令,輸出爲:code
this is two.java this is three.java 目標名稱:one.java 不帶擴展名的目標名稱: 第一個依賴文件的名稱:two.java 所有依賴,去重:two.java three.java 所有依賴,不去重,按照出現順序出現:two.java three.java 所有須要從新構建的依賴:two.java three.java
AR 歸檔維護程序的名稱,默認值爲 ar。
ARFLAGS 歸檔維護程序的選項。
AS 彙編程序的名稱,默認值爲 as。
ASFLAGS 彙編程序的選項。
CC C編譯器的名稱,默認值爲 cc。
CCFLAGS C編譯器的選項。
CPP C預編譯器的名稱,默認值爲$(CC) -E
。
CPPFLAGS C預編譯的選項。
CXX C++編譯器的名稱,默認值爲 g++。
CXXFLAGS C++編譯器的選項。
FC FORTRAN編譯器的名稱,默認值爲 f77。
FFLAGS FORTRAN編譯器的選項。three