跟我一起寫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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章