跟我一起寫Makefile 讀書筆記
.PHONY 僞目標
. %
.靜態模式
目標:目標模式:依賴模式
$< 表示依賴目標集 $@ 表示目標集
. @命令 顯示命令
make [-n|--just-print] 只顯示命令,調試makefile
-s --silent 全面禁止命令顯示
. shell 命令用; 隔開才起作用
"-" 忽略命令出錯 如-rm -f *.o
make -i --ignore-errors 全局忽略出錯
以 .IGNORE 爲目標的
-k --keep-going 若規則出錯,終止該規則,繼續其他規則
.嵌套執行
export 變量
-w 參數顯示目錄信息
.定義命令包
define 名字
(Tab) command
endef
.變量
變量的命名字可以包含字符、數字,下劃線(可以是數字開頭),但不應該含有“:”,“#”,“=”或是空字
符(空格、回車等)
變量的變量 最好用":="定義, 因爲"="可以使用後面定義的變量 "+="追加變量值 "?="未定義變量就賦值
使用 #的方法來定義一個空格變量
變量替換: ${var:a=b}
把變量的值再當變量 可以用在操作符的左右兩邊
.override
如果有變量是通常 make 的命令行參數設置的,那麼 Makefile 中對這個變量的賦值會被忽略。如果
你想在 Makefile 中設置這類參數的值,那麼,你可以使用“override”指示符。
.目標變量
.函數
${<function> <arguments>} 參數間以逗號“,”分隔,而函數名和參數之間以“空格”分隔
1) subst
$(subst <from>,<to>,<text>) 把字串<text>中的<from>字符串替換成<to>。
2) patsubst
$(patsubst <pattern>,<replacement>,<text>)
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o],返回結果是“x.c.o bar.o”
3) strip
$(strip <string>) 去掉<string>字串中開頭和結尾的空字符。
4) findstring
$(findstring <find>,<in>) 功能:在字串<in>中查找<find>字串。
返回:如果找到,那麼返回<find>,否則返回空字符串。
5) filter
$(filter <pattern...>,<text>) 以<pattern>模式過濾<text>字符串中的單詞,
保留符合模式<pattern>的單詞。可以有多個模式。
6) filter-out
$(filter-out <pattern...>,<text>) 以<pattern>模式過濾<text>字符串中的單詞,
去除符合模式<pattern>的單詞。可以有多個模式
7) sort
$(sort <list>) 給字符串<list>中的單詞排序(升序)。備註:sort 函數會去掉<list>中相同的單詞。
8) word
$(word <n>,<text>) 取字符串<text>中第<n>個單詞。(從一開始)
9) wordlist
$(wordlist <s>,<e>,<text>) 從字符串<text>中取從<s>開始到<e>的單詞串。<s>和<e>是一個數字。
10) words
$(words <text>) 統計<text>中字符串中的單詞個數。備註:如果我們要取<text>中最後的一個單
詞,我們可以這樣:$(word $(words <text>),<text>)。
11) firstword
$(firstword <text>) 取字符串<text>中的第一個單詞。
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
如 果 我 們 的 “$(VPATH)” 值 是 “src:../headers” , 那 麼
“$(patsubst%,-I%,$(subst :, ,$(VPATH)))”將返回“-Isrc -I../headers”,
這正是 cc 或 gcc 搜索頭文件路徑的參數。
文件名操作函數
1. dir
$(dir <names...>) 從文件名序列<names>中取出目錄部分。
2. notdir
$(notdir <names...>) 從文件名序列<names>中取出非目錄部分。就是文件名
3. suffix
$(suffix <names...>) 從文件名序列<names>中取出各個文件名的後綴。
4. basename
$(basename <names...>) 從文件名序列<names>中取出各個文件名的後綴。
5. addsuffix
$(addsuffix <suffix>,<names...>) 把後綴<suffix>加到<names>中的每個單詞後面。
6. addprefix
$(addprefix <prefix>,<names...>) 把前綴<prefix>加到<names>中的每個單詞後面。
7. join
$(join <list1>,<list2>) 把<list2>中的單詞對應地加到<list1>的單詞後面。如果<list1>的單
詞個數要比<list2>的多,那麼,<list1>中的多出來的單詞將保持原樣。如果<list2>的單個數要比
<list1>多,那麼,<list2>多出來的單詞將被複制到<list2>中。
8. foreach 函數
$(foreach <var>,<list>,<text>)
names := a b c d
files := $(foreach n,$(names),$(n).o)
上面的例子中,$(name)中的單詞會被挨個取出,並存到變量“n”中,“$(n).o”每次
根據“$(n)”計算出一個值,這些值以空格分隔,最後作爲 foreach 函數的返回,所以,
$(files)的值是“a.o b.o c.o d.o”。
9. if
$(if <condition>,<then-part>) $(if <condition>,<then-part>,<else-part>)
如果<condition>爲真(非空字符串),那個<then-part>會是整個函數的返回值,如果<condition>爲
假(空字符串),那麼<else-part>會是整個函數的返回值,此時如果<else-part>沒有被定義,那麼,
整個函數返回空字串。
10. call
$(call <expression>,<parm1>,<parm2>,<parm3>...)
如:
reverse = $(2) $(1)
foo = $(call reverse,a,b) 此時的 foo 的值就是“b a”。
11. origin
$(origin <variable>)
返回值:undefined, default, file, command line, override, automatic
12. shell
. %
.靜態模式
目標:目標模式:依賴模式
$< 表示依賴目標集 $@ 表示目標集
. @命令 顯示命令
make [-n|--just-print] 只顯示命令,調試makefile
-s --silent 全面禁止命令顯示
. shell 命令用; 隔開才起作用
"-" 忽略命令出錯 如-rm -f *.o
make -i --ignore-errors 全局忽略出錯
以 .IGNORE 爲目標的
-k --keep-going 若規則出錯,終止該規則,繼續其他規則
.嵌套執行
export 變量
-w 參數顯示目錄信息
.定義命令包
define 名字
(Tab) command
endef
.變量
變量的命名字可以包含字符、數字,下劃線(可以是數字開頭),但不應該含有“:”,“#”,“=”或是空字
符(空格、回車等)
變量的變量 最好用":="定義, 因爲"="可以使用後面定義的變量 "+="追加變量值 "?="未定義變量就賦值
使用 #的方法來定義一個空格變量
變量替換: ${var:a=b}
把變量的值再當變量 可以用在操作符的左右兩邊
.override
如果有變量是通常 make 的命令行參數設置的,那麼 Makefile 中對這個變量的賦值會被忽略。如果
你想在 Makefile 中設置這類參數的值,那麼,你可以使用“override”指示符。
.目標變量
.函數
${<function> <arguments>} 參數間以逗號“,”分隔,而函數名和參數之間以“空格”分隔
1) subst
$(subst <from>,<to>,<text>) 把字串<text>中的<from>字符串替換成<to>。
2) patsubst
$(patsubst <pattern>,<replacement>,<text>)
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o],返回結果是“x.c.o bar.o”
3) strip
$(strip <string>) 去掉<string>字串中開頭和結尾的空字符。
4) findstring
$(findstring <find>,<in>) 功能:在字串<in>中查找<find>字串。
返回:如果找到,那麼返回<find>,否則返回空字符串。
5) filter
$(filter <pattern...>,<text>) 以<pattern>模式過濾<text>字符串中的單詞,
保留符合模式<pattern>的單詞。可以有多個模式。
6) filter-out
$(filter-out <pattern...>,<text>) 以<pattern>模式過濾<text>字符串中的單詞,
去除符合模式<pattern>的單詞。可以有多個模式
7) sort
$(sort <list>) 給字符串<list>中的單詞排序(升序)。備註:sort 函數會去掉<list>中相同的單詞。
8) word
$(word <n>,<text>) 取字符串<text>中第<n>個單詞。(從一開始)
9) wordlist
$(wordlist <s>,<e>,<text>) 從字符串<text>中取從<s>開始到<e>的單詞串。<s>和<e>是一個數字。
10) words
$(words <text>) 統計<text>中字符串中的單詞個數。備註:如果我們要取<text>中最後的一個單
詞,我們可以這樣:$(word $(words <text>),<text>)。
11) firstword
$(firstword <text>) 取字符串<text>中的第一個單詞。
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
如 果 我 們 的 “$(VPATH)” 值 是 “src:../headers” , 那 麼
“$(patsubst%,-I%,$(subst :, ,$(VPATH)))”將返回“-Isrc -I../headers”,
這正是 cc 或 gcc 搜索頭文件路徑的參數。
文件名操作函數
1. dir
$(dir <names...>) 從文件名序列<names>中取出目錄部分。
2. notdir
$(notdir <names...>) 從文件名序列<names>中取出非目錄部分。就是文件名
3. suffix
$(suffix <names...>) 從文件名序列<names>中取出各個文件名的後綴。
4. basename
$(basename <names...>) 從文件名序列<names>中取出各個文件名的後綴。
5. addsuffix
$(addsuffix <suffix>,<names...>) 把後綴<suffix>加到<names>中的每個單詞後面。
6. addprefix
$(addprefix <prefix>,<names...>) 把前綴<prefix>加到<names>中的每個單詞後面。
7. join
$(join <list1>,<list2>) 把<list2>中的單詞對應地加到<list1>的單詞後面。如果<list1>的單
詞個數要比<list2>的多,那麼,<list1>中的多出來的單詞將保持原樣。如果<list2>的單個數要比
<list1>多,那麼,<list2>多出來的單詞將被複制到<list2>中。
8. foreach 函數
$(foreach <var>,<list>,<text>)
names := a b c d
files := $(foreach n,$(names),$(n).o)
上面的例子中,$(name)中的單詞會被挨個取出,並存到變量“n”中,“$(n).o”每次
根據“$(n)”計算出一個值,這些值以空格分隔,最後作爲 foreach 函數的返回,所以,
$(files)的值是“a.o b.o c.o d.o”。
9. if
$(if <condition>,<then-part>) $(if <condition>,<then-part>,<else-part>)
如果<condition>爲真(非空字符串),那個<then-part>會是整個函數的返回值,如果<condition>爲
假(空字符串),那麼<else-part>會是整個函數的返回值,此時如果<else-part>沒有被定義,那麼,
整個函數返回空字串。
10. call
$(call <expression>,<parm1>,<parm2>,<parm3>...)
如:
reverse = $(2) $(1)
foo = $(call reverse,a,b) 此時的 foo 的值就是“b a”。
11. origin
$(origin <variable>)
返回值:undefined, default, file, command line, override, automatic
12. shell
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.