七、靜態模式
靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活。我們還是先來看一下語法:
<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中更大的彈性。
makefile: 靜態模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.