Makefile之静态模式(7)
靜態(tài)模式
????? makefile中,一個(gè)規(guī)則中可以有多個(gè)目標(biāo),規(guī)則所定義的命令對(duì)所有的目標(biāo)有效。一個(gè)具有多目標(biāo)的規(guī)則相當(dāng)于多個(gè)規(guī)則。使用多目標(biāo)可以使makefile文件變得簡(jiǎn)潔。
????? 靜態(tài)模式規(guī)則是這樣一個(gè)規(guī)則:規(guī)則存在多個(gè)目標(biāo),并且不同的目標(biāo)可以根據(jù)目標(biāo)文件的名字來自動(dòng)構(gòu)造出依賴文件。
????? 靜態(tài)模式可以更加容易地定義多目標(biāo)的規(guī)則,可以讓我們的規(guī)則變得更加的有彈性和靈活。我們還是先來看一下語法:
?? <targets ...>: <target-pattern>: <prereq-patterns ...>
??????????? <commands>
??????????? ...
??? targets定義了一系列的目標(biāo)文件,可以有通配符。是目標(biāo)的一個(gè)集合。
??? target-parrtern是指明了targets的模式,也就是的目標(biāo)集模式。
??? prereq-parrterns是目標(biāo)的依賴模式,它對(duì)target-parrtern形成的模式再進(jìn)行一次依賴目標(biāo)的定義。
?????? 簡(jiǎn)單的解釋一下:如果我們的<target-parrtern>定義成 “%.o”,意思是我們的<target>集合中都是以“.o”結(jié)尾的,而如果我們的<prereq-parrterns>定義成“%.c”,意思是對(duì)<target-parrtern>所形成的目標(biāo)集進(jìn)行二次定義,其計(jì)算方法是,取<target- parrtern>模式中的“%”(也就是去掉了[.o]這個(gè)結(jié)尾),并為其加上[.c]這個(gè)結(jié)尾,形成的新集合。
所以,我們的“目標(biāo)模式”或是“依賴模式”中都應(yīng)該有“%”這個(gè)字符,如果你的文件名中有“%”那么你可以使用反斜杠“\”進(jìn)行轉(zhuǎn)義,來標(biāo)明真實(shí)的“%”字符。
看一個(gè)例子:
??? objects = foo.o bar.o
??? all: $(objects)
??? $(objects): %.o: %.c
??????????? $(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我們的目標(biāo)從$object中獲取,“%.o”表明要所有以“.o”結(jié)尾的目標(biāo),也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴目標(biāo)就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動(dòng)化變量(見[makefile筆記]之七),“$<”表示所有的依賴目標(biāo)集(也就是 “foo.c bar.c”),“$@”表示目標(biāo)集(也就是“foo.o bar.o”)。于是,上面的規(guī)則展開后等價(jià)于下面的規(guī)則:
??? 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”有幾百個(gè),那種我們只要用這種很簡(jiǎn)單的“靜態(tài)模式規(guī)則”就可以寫完一堆規(guī)則,實(shí)在是太有效率了
總結(jié)
以上是生活随笔為你收集整理的Makefile之静态模式(7)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile之嵌套执行(9)
- 下一篇: 收藏 | 来自微软大神的机器学习秘籍!