1. 程式人生 > >$^,$@,$?,$<,$(@D),$(@F) of makefile

$^,$@,$?,$<,$(@D),$(@F) of makefile

使用方法 filter dir put pil big lose rul name

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 $@)’.

4.12 靜態模式
靜態模式規則是這樣一個規則:
規則存在多個目標,並且不同的目標可以根據目標文件的名字來自動構造出依賴文件。
靜態模式規則比多目標規則更通用,它不需要多個目標具有相同的依賴。但是靜態模式規則中的依賴文件必須是相類似的而不是完全相同的。

我們來看一個例子,它根據相應的.c 文件來編譯生成“foo.o”和“bar.o”文件:


objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@


例子中,規則描述了所有的.o文件的依賴文件為對應的.c文件,對於目標“foo.o”,取其莖“foo”替代對應的依賴模式“%.c”中的模式字符“%”之後可得到目標的依賴文件“foo.c”。

這就是目標“foo.o”的依賴關系“foo.o: foo.c”,規則的命令行描述了如何完成由“foo.c”編譯生成目標“foo.o”。命令行中“$<”和“$@”是自動化變量,“$<”表示規則中的第一個依賴文件,

“$@”表示規則中的目標文件。上邊的這個規則描述了以下兩個具體的規則:


foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o


在使用靜態模式規則時,指定的目標必須和目標模式相匹配,否則執行make時將
會得到一個錯誤提示。
如果存在一個文件列表,
其中一部分符合某一種模式而另外一部
分符合另外一種模式,這種情況下我們可以使用“filter”函數(可參考 第八章 make
的內嵌函數)來對這個文件列表進行分類,在分類之後對確定的某一類使用模式規則。
例如:
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $<
其中;$(filter %.o,$(files))的結果為“bar.o lose.o”“filter”函數過濾不符合“%.o”

模式的文件名而返回所有符合此模式的文件列表。
第一條靜態模式規則描述了這些目標
文件是通過編譯對應的.c 源文件來重建的。同樣第二條規則也是使用這種方式。
我們通過另外一個例子來看一下自動環變量“$*”在靜態模式規則中的使用方法:
bigoutput littleoutput : %output : text.g
generate text.g -$* > $@
當執行此規則的命令時,
自動環變量
“$*”
被展開為
“莖” 在這裏就是

“big” “little”


靜態模式規則對一個較大工程的管理非常有用。
它可以對整個工程的同一類文件的
重建規則進行一次定義,而實現對整個工程中此類文件指定相同的重建規則。比如,可
以用來描述整個工程中所有的.o 文件的依賴規則和編譯命令。通常的做法是將生成同
一類目標的模式定義在一個 make.rules 的文件中。在工程各個模塊的 Makefile 中包含
此文件。

$^,$@,$?,$<,$(@D),$(@F) of makefile