Makefile之静态模式(7)
靜態模式
????? makefile中,一個規則中可以有多個目標,規則所定義的命令對所有的目標有效。一個具有多目標的規則相當于多個規則。使用多目標可以使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.o bar.o
??? all: $(objects)
??? $(objects): %.o: %.c
??????????? $(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的目標,也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴目標就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動化變量(見[makefile筆記]之七),“$<”表示所有的依賴目標集(也就是 “foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.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
試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”就可以寫完一堆規則,實在是太有效率了
總結
以上是生活随笔為你收集整理的Makefile之静态模式(7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile之嵌套执行(9)
- 下一篇: 收藏 | 来自微软大神的机器学习秘籍!