模式规则及自动化变量
生活随笔
收集整理的這篇文章主要介紹了
模式规则及自动化变量
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
模式規(guī)則
模式規(guī)則類似于普通規(guī)則。只是在模式規(guī)則中,目標名中需要包含有模式字符“%”(一個),包含有模式字符“%”的目標被用來匹配一個文件名,“%”可以匹配任何非空字符串。規(guī)則的依賴文件中同樣可以使用“%”,依賴文件中模式字符“%”的取值情況由目標中的“%”來決定。例如:對于模式規(guī)則“%.o : %.c”,它表示的含義是:所有的.o文件依賴于對應的.c文件。
有一點需要注意的是,"%"的展開發(fā)生在變量和函數(shù)的展開之后,變量和函數(shù)的展開發(fā)生在make載入Makefile時,而模式規(guī)則中的"%"則發(fā)生在運行時。
1、模式規(guī)則介紹
模式規(guī)則中,至少在規(guī)則的目標定義中要包含"%",否則,就是一般的規(guī)則。目標中的"%"定義表示對文件名的匹配,"%"表示長度任意的非空字符串。例如:"%.c"表示以".c"結尾的文件名(文件名的長度至少為3),而"s.%.c"則表示以"s."開頭,".c"結尾的文件名(文件名的長度至少為5)。
如果"%"定義在目標中,那么,目標中的"%"的值決定了依賴目標中的"%"的值,也就是說,目標中的模式的"%"決定了依賴目標中"%"的樣子。例如有一個模式規(guī)則如下:
??? %.o : %.c
??? <command ......>
其含義是,指出了怎么從所有的[.c]文件生成相應的[.o]文件的規(guī)則。如果要生成的目標是"a.o b.o",那么"%c"就是"a.c b.c"。
一旦依賴目標中的"%"模式被確定,那么,make會被要求去匹配當前目錄下所有的文件名,一旦找到,make就會規(guī)則下的命令,所以,在模式規(guī)則中,目標可能會是多個的,如果有模式匹配出多個目標,make就會產生所有的模式目標,此時,make關心的是依賴的文件名和生成目標的命令這兩件事。
2、模式規(guī)則示例
下面這個例子表示了,把所有的[.c]文件都編譯成[.o]文件.
??? %.o : %.c
??? $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
其中,"$@"表示所有的目標的挨個值,"$<"表示了所有依賴目標的挨個值。這些奇怪的變量我們叫"自動化變量",后面會詳細講述。
自動化變量
模式規(guī)則中,規(guī)則的目標和依賴文件名代表了一類文件名;規(guī)則的命令是對所有這一類文件重建過程的描述,顯然,在命令中不能出現(xiàn)具體的文件名,否則模式規(guī)則失去意義。那么在模式規(guī)則的命令行中該如何表示文件,將是本小節(jié)的討論的重點。
假如你需要書寫一個將.c文件編譯到.o文件的模式規(guī)則,那么你該如何為gcc書寫正確的源文件名?當然了,不能使用任何具體的文件名,因為在每一次執(zhí)行模式規(guī)則時源文件名都是不一樣的。為了解決這個問題,就需要使用“自動環(huán)變量”,自動化變量的取值是根據(jù)具體所執(zhí)行的規(guī)則來決定的,取決于所執(zhí)行規(guī)則的目標和依賴文件名。所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直至所有的符合模式的文件都取完了。這種自動化變量只應出現(xiàn)在規(guī)則的命令中。
下面是所有的自動化變量及其說明:
$@
??? 表示規(guī)則中的目標文件集。在模式規(guī)則中,如果有多個目標,那么,"$@"就是匹配于目標中模式定義的集合。
$%
??? 僅當目標是函數(shù)庫文件中,表示規(guī)則中的目標成員名。例如,如果一個目標是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目標不是函數(shù)庫文件(Unix下是[.a],Windows下是[.lib]),那么,其值為空。
$<
??? 依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
??? 所有比目標新的依賴目標的集合。以空格分隔。
$^
??? 所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。
$+
??? 這個變量很像"$^",也是所有依賴目標的集合。只是它不去除重復的依賴目標。
$*
?? 這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",并且目標的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。這個變量對于構造有關聯(lián)的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值就是"foo"。這個特性是GNU make的,很有可能不兼容于其它版本的make,所以,你應該盡量避免使用"$*",除非是在隱含規(guī)則或是靜態(tài)模式中。如果目標中的后綴是make所不能識別的,那么"$*"就是空值。 文章來自:http://hi.baidu.com/kj_28/blog/item/aa3b13d8c9abbf3c33fa1cab.html
模式規(guī)則類似于普通規(guī)則。只是在模式規(guī)則中,目標名中需要包含有模式字符“%”(一個),包含有模式字符“%”的目標被用來匹配一個文件名,“%”可以匹配任何非空字符串。規(guī)則的依賴文件中同樣可以使用“%”,依賴文件中模式字符“%”的取值情況由目標中的“%”來決定。例如:對于模式規(guī)則“%.o : %.c”,它表示的含義是:所有的.o文件依賴于對應的.c文件。
有一點需要注意的是,"%"的展開發(fā)生在變量和函數(shù)的展開之后,變量和函數(shù)的展開發(fā)生在make載入Makefile時,而模式規(guī)則中的"%"則發(fā)生在運行時。
1、模式規(guī)則介紹
模式規(guī)則中,至少在規(guī)則的目標定義中要包含"%",否則,就是一般的規(guī)則。目標中的"%"定義表示對文件名的匹配,"%"表示長度任意的非空字符串。例如:"%.c"表示以".c"結尾的文件名(文件名的長度至少為3),而"s.%.c"則表示以"s."開頭,".c"結尾的文件名(文件名的長度至少為5)。
如果"%"定義在目標中,那么,目標中的"%"的值決定了依賴目標中的"%"的值,也就是說,目標中的模式的"%"決定了依賴目標中"%"的樣子。例如有一個模式規(guī)則如下:
??? %.o : %.c
??? <command ......>
其含義是,指出了怎么從所有的[.c]文件生成相應的[.o]文件的規(guī)則。如果要生成的目標是"a.o b.o",那么"%c"就是"a.c b.c"。
一旦依賴目標中的"%"模式被確定,那么,make會被要求去匹配當前目錄下所有的文件名,一旦找到,make就會規(guī)則下的命令,所以,在模式規(guī)則中,目標可能會是多個的,如果有模式匹配出多個目標,make就會產生所有的模式目標,此時,make關心的是依賴的文件名和生成目標的命令這兩件事。
2、模式規(guī)則示例
下面這個例子表示了,把所有的[.c]文件都編譯成[.o]文件.
??? %.o : %.c
??? $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
其中,"$@"表示所有的目標的挨個值,"$<"表示了所有依賴目標的挨個值。這些奇怪的變量我們叫"自動化變量",后面會詳細講述。
自動化變量
模式規(guī)則中,規(guī)則的目標和依賴文件名代表了一類文件名;規(guī)則的命令是對所有這一類文件重建過程的描述,顯然,在命令中不能出現(xiàn)具體的文件名,否則模式規(guī)則失去意義。那么在模式規(guī)則的命令行中該如何表示文件,將是本小節(jié)的討論的重點。
假如你需要書寫一個將.c文件編譯到.o文件的模式規(guī)則,那么你該如何為gcc書寫正確的源文件名?當然了,不能使用任何具體的文件名,因為在每一次執(zhí)行模式規(guī)則時源文件名都是不一樣的。為了解決這個問題,就需要使用“自動環(huán)變量”,自動化變量的取值是根據(jù)具體所執(zhí)行的規(guī)則來決定的,取決于所執(zhí)行規(guī)則的目標和依賴文件名。所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直至所有的符合模式的文件都取完了。這種自動化變量只應出現(xiàn)在規(guī)則的命令中。
下面是所有的自動化變量及其說明:
$@
??? 表示規(guī)則中的目標文件集。在模式規(guī)則中,如果有多個目標,那么,"$@"就是匹配于目標中模式定義的集合。
$%
??? 僅當目標是函數(shù)庫文件中,表示規(guī)則中的目標成員名。例如,如果一個目標是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目標不是函數(shù)庫文件(Unix下是[.a],Windows下是[.lib]),那么,其值為空。
$<
??? 依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
??? 所有比目標新的依賴目標的集合。以空格分隔。
$^
??? 所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。
$+
??? 這個變量很像"$^",也是所有依賴目標的集合。只是它不去除重復的依賴目標。
$*
?? 這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",并且目標的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。這個變量對于構造有關聯(lián)的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值就是"foo"。這個特性是GNU make的,很有可能不兼容于其它版本的make,所以,你應該盡量避免使用"$*",除非是在隱含規(guī)則或是靜態(tài)模式中。如果目標中的后綴是make所不能識別的,那么"$*"就是空值。 文章來自:http://hi.baidu.com/kj_28/blog/item/aa3b13d8c9abbf3c33fa1cab.html
轉載于:https://blog.51cto.com/norawoo/284742
總結
以上是生活随笔為你收集整理的模式规则及自动化变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts标签和OGNL表达式
- 下一篇: Expression Blend实例中文