$@
表示規則中的目標文件集。在模式規則中,如果有多個目標,那么,"$@"就是匹配於目標中模式定義的集合。
$%
僅當目標是函數庫文件中,表示規則中的目標成員名。例如,如果一個目標是"foo.a (bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目標不是函數庫文件(Unix下是[.a],Windows下是 [.lib]),那么,其值為空。
$<
依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
所有比目標新的依賴目標的集合。以空格分隔。
$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。
$+
這個變量很像"$^",也是所有依賴目標的集合。只是它不去除重復的依賴目標。
$*
這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",並且目標的模式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。這個變量對於構造有關聯的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是 make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值 就是"foo"。這個特性是GNU make的,很有可能不兼容於其它版本的make,所以,你應該盡量避免使用"$*",除非是在隱含規則或是靜態模式中。如果目標中的后綴是make所不 能識別的,那么"$*"就是空值。
下面語句分析:
makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含義
$(filter-out $(PHONY) $(wildcard $^),$^)
常用用法為$(wildcard *.c)
表示列舉當前目錄下的所有.c文件
這里$^因為會包含依賴的文件名,如果包含的該文件存在,那么將返回其含路徑的文件名
所以$(wildcard $^)就是用來過濾$^包含的所有文件並且該文件確實在本地存在.
自動化變量$?代表依賴文件列表中被改變過的所有文件。
自動化變量$^代表所有通過目錄搜索得到的依賴文件的完整路徑名(目錄 + 一般文件名)列表。
自動化變量$@代表規則的目標。
自動化變量$<代表規則中通過目錄搜索得到的依賴文件列表的第一個依賴文件。
自動化變量$(@D)
The directory part of the file name of the target,
with the trailing slash removed. If the value of ‘$@’ is dir/foo.o
then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
http://www.gnu.org/software/make/manual/make.html
自動化變量$(@F)
The file-within-directory part of the file name of
the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o.
‘$(@F)’ is equivalent to ‘$(notdir $@)’.
-----------------------------------------------