makefile: 靜態模式

七、靜態模式

靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法:

<targets...>;:<target-pattern>;:<prereq-patterns...>;
<commands>;
...


targets定義了一系列的目標文件,可以有通配符。是目標的一個集合。

target-parrtern是指明瞭targets的模式,也就是的目標集模式。

prereq-parrterns是目標的依賴模式,它對target-parrtern形成的模式再進行一次依賴目標的定義。

這樣描述這三個東西,可能還是沒有說清楚,還是舉個例子來說明一下吧。如果我們的<target-parrtern>;定義成“%.o”,意思是我們的<target>;集合中都是以“.o”結尾的,而如果我們的<prereq-parrterns>;定義成“%.c”,意思是對<target-parrtern>;所形成的目標集進行二次定義,其計算方法是,取<target-parrtern>;模式中的“%”(也就是去掉了[.o]這個結尾),併爲其加上[.c]這個結尾,形成的新集合。

所以,我們的“目標模式”或是“依賴模式”中都應該有“%”這個字符,如果你的文件名中有“%”那麼你可以使用反斜槓“\”進行轉義,來標明真實的“%”字符。

看一個例子:

objects=foo.obar.o

all:$(objects)

$(objects):%.o:%.c
$(CC)-c$(CFLAGS)$<-o$@


上面的例子中,指明瞭我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的目標,也就是“foo.obar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foobar”,併爲其加下“.c”的後綴,於是,我們的依賴目標就是“foo.cbar.c”。而命令中的“$<”和“$@”則是自動化變量,“$<”表示所有的依賴目標集(也就是“foo.cbar.c”),“$@”表示目標集(也就是“foo.obar.o”)。於是,上面的規則展開後等價於下面的規則:

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

試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”就可以寫完一堆規則,實在是太有效率了。“靜態模式規則”的用法很靈活,如果用得好,那會一個很強大的功能。再看一個例子:


files=foo.elcbar.olose.o

$(filter%.o,$(files)):%.o:%.c
$(CC)-c$(CFLAGS)$<-o$@
$(filter%.elc,$(files)):%.elc:%.el
emacs-fbatch-byte-compile$<


$(filter%.o,$(files))表示調用Makefile的filter函數,過濾“$filter”集,只要其中模式爲“%.o”的內容。其的它內容,我就不用多說了吧。這個例字展示了Makefile中更大的彈性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章