Makefile 常用函數表

來源:互聯網
上載者:User

Makefile 常用函數表<br />一、字串處理函數<br />1.$(subst FROM,TO,TEXT)<br />函數名稱:字串替換函數—subst。<br />函數功能:把字串“TEXT”中的“FROM”字元替換為“TO”。<br />傳回值:替換後的新字串。<br />2.$(patsubst PATTERN,REPLACEMENT,TEXT)<br />函數名稱:模式替換函數—patsubst。<br />函數功能:搜尋“TEXT”中以空格分開的單詞,將否符合模式“TATTERN”替換為“REPLACEMENT”。參數“PATTERN”中可以使用模<br />式萬用字元“%”來代表一個單詞中的若干字元。如果參數“REPLACEMENT”中也包含一個“%”,那麼“REPLACEMENT”中的“%”將是<br />“TATTERN”中的那個“%”所代表的字串。在“TATTERN”和“REPLACEMENT”中,只有第一個“%”被作為模式字元來處理,後續的作為字元本上來處理。在兩個參數中當使用第一個“%”本是字元本身時,可使用反斜線“/”對它進行轉義處理。<br />傳回值:替換後的新字串。<br />函數說明:參數“TEXT”單詞之間的多個空格在處理時被合并為一個空格,但前置和結尾空格忽略。<br />3.$(strip STRINT)<br />函數名稱:去空格函數—strip。<br />函數功能:去掉字串(若干單詞,使用若干Null 字元分割)“STRINT”開頭和結尾的Null 字元,並將其中多個連續Null 字元合并為一個Null 字元。<br />傳回值:無前置和結尾Null 字元、使用單一空格分割的多單詞字串。<br />函數說明:Null 字元包括空格、[Tab]等不可顯示字元。<br />4.$(findstring FIND,IN)<br />函數名稱:尋找字串函數—findstring。<br />函數功能:搜尋字串“IN”,尋找“FIND”字串。<br />傳回值:如果在“IN”之中存在“FIND”,則返回“FIND”,否則返回空。<br />函數說明:字串“IN”之中可以包含空格、[Tab]。搜尋需要是嚴格的文本匹配。<br />5.$(filter PATTERN…,TEXT)<br />函數名稱:過濾函數—filter。<br />函數功能:過濾掉字串“TEXT”中所有不符合模式“PATTERN”的單詞,保留所有符合此模式的單詞。可以使用多個模式。模式中一般需要包含模式字元“%”。存在多個模式時,模式運算式之間使用空格分割。<br />傳回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。<br />函數說明:“filter”函數可以用來去除一個變數中的某些字串,我們下邊的例子中就是用到了此函數。<br />6.$(filter-out PATTERN...,TEXT)<br />函數名稱:反過濾函數—filter-out。<br />函數功能:和“filter”函數實現的功能相反。過濾掉字串“TEXT”中所有符合模式“PATTERN”的單詞,保留所有不符合此模式的單詞。可以有多個模式。存在多個模式時,模式運算式之間使用空格分割。。<br />傳回值:空格分割的“TEXT”字串中所有不符合模式“PATTERN”的字串。<br />函數說明:“filter-out”函數也可以用來去除一個變數中的某些字串,(實現和“filter”函數相反)。<br />7.$(sort LIST)<br />函數名稱:排序函數—sort。<br />函數功能:給字串“LIST”中的單詞以首字母為準進行排序(升序),並取掉重複的單詞。<br />傳回值:空格分割的沒有重複單詞的字串。<br />函數說明:兩個功能,排序和去字串中的重複單詞。可以單獨使用其中一個功能。<br />8.$(word N,TEXT)<br />函數名稱:取單詞函數—word。<br />函數功能:取字串“TEXT”中第“N”個單詞(“N”的值從1開始)。<br />傳回值:返回字串“TEXT”中第“N”個單詞。<br />函數說明:如果“N”值大於字串“TEXT”中單詞的數目,返回Null 字元串。如果“N”為0,出錯!<br />9.$(wordlist S,E,TEXT)<br />函數名稱:取字串函數—wordlist。<br />函數功能:從字串“TEXT”中取出從“S”開始到“E”的單詞串。“S”和“E”表示單詞在字串中位置的數字。<br />傳回值:字串“TEXT”中從第“S”到“E”(包括“E”)的單詞字串。<br />函數說明:“S”和“E”都是從1開始的數字。<br />當“S”比“TEXT”中的字數大時,返回空。如果“E”大於“TEXT”字數,返回從“S”開始,到“TEXT”結束的單詞串。如果“S”大於“E”,返回空。<br />10.$(words TEXT)<br />函數名稱:統計單詞數目函數—words。<br />函數功能:字算字串“TEXT”中單詞的數目。<br />傳回值:“TEXT”字串中的單詞數。<br />11.$(firstword NAMES…)<br />函數名稱:取首單詞函數—firstword。<br />函數功能:取字串“NAMES…”中的第一個單詞。<br />傳回值:字串“NAMES…”的第一個單詞。<br />函數說明:“NAMES”被認為是使用空格分割的多個單詞(名字)的序列。函數忽略“NAMES…”中除第一個單詞以外的所有的單詞。<br />二、檔案名稱處理函數<br />1.$(dir NAMES…)<br />函數名稱:取目錄函式—dir。<br />函數功能:從檔案名稱序列“NAMES…”中取出各個檔案名稱目錄部分。檔案名稱的目錄部分就是包含在檔案名稱中的最後一個斜線(“/”)(包括斜線)之前的部分。<br />傳回值:空格分割的檔案名稱序列“NAMES…”中每一個檔案的目錄部分。<br />函數說明:如果檔案名稱中沒有斜線,認為此檔案為目前的目錄(“./”)下的檔案。<br />2.$(notdir NAMES…)<br />函數名稱:取檔案名稱函數——notdir。<br />函數功能:從檔案名稱序列“NAMES…”中取出非目錄部分。目錄部分是指最後一個斜線(“/”)(包括斜線)之前的部分。刪除所有檔案名稱中的目錄部分,只保留非目錄部分。<br />傳回值:檔案名稱序列“NAMES…”中每一個檔案的非目錄部分。<br />函數說明:如果“NAMES…”中存在不包含斜線的檔案名稱,則不改變這個檔案名稱。以反斜線結尾的檔案名稱,是用空串代替,因此當“NAMES…”中存在多個這樣的檔案名稱時,返回結果中分割各個檔案名稱的空格數目將不確定!這是此函數的一個缺陷。<br />3.$(suffix NAMES…)<br />函數名稱:取尾碼函數—suffix。<br />函數功能:從檔案名稱序列“NAMES…”中取出各個檔案名稱的尾碼。尾碼是檔案名稱中最後一個以點“.”開始的(包含點號)部分,如果檔案名稱中不包含一個點號,則為空白。<br />傳回值:以空格分割的檔案名稱序列“NAMES…”中每一個檔案的尾碼序列。<br />函數說明:“NAMES…”是多個檔案名稱時,傳回值是多個以空格分割的單詞序列。如果檔案名稱沒有尾碼部分,則返回空。<br />4.$(basename NAMES…)<br />函數名稱:取首碼函數—basename。<br />函數功能:從檔案名稱序列“NAMES…”中取出各個檔案名稱的首碼部分(點號之後的部分)。首碼部分指的是檔案名稱中最後一個點號之前的部分。<br />傳回值:空格分割的檔案名稱序列“NAMES…”中各個檔案的首碼序列。如果檔案沒有首碼,則返回空字串。<br />函數說明:如果“NAMES…”中包含沒有尾碼的檔案名稱,此檔案名稱不改變。如果一個檔案名稱中存在多個點號,則傳回值為此檔案名稱的最後一個點號之前的檔案名稱部分。<br />5.$(addsuffix SUFFIX,NAMES…)<br />函數名稱:加尾碼函數—addsuffix。<br />函數功能:為“NAMES…”中的每一個檔案名稱添加尾碼“SUFFIX”。參數“NAMES…”為空白格分割的檔案名稱序列,將“SUFFIX”追加到此序列的每一個檔案名稱的末尾。<br />傳回值:以單空格分割的添加了尾碼“SUFFIX”的檔案名稱序列。<br />6.$(addprefix PREFIX,NAMES…)<br />函數名稱:加首碼函數—addprefix。<br />函數功能:為“NAMES…”中的每一個檔案名稱添加首碼“PREFIX”。參數“NAMES…”是空格分割的檔案名稱序列,將“SUFFIX”添加到此序列的每一個檔案名稱之前。<br />傳回值:以單空格分割的添加了首碼“PREFIX”的檔案名稱序列。<br />7.$(join LIST1,LIST2)<br />函數名稱:單詞串連函數——join。<br />函數功能:將字串“LIST1”和字串“LIST2”各單詞進行對應串連。就是將“LIST2”中的第一個單詞追加“LIST1”第一個單詞字後合并為一個單詞;將“LIST2”中的第二個單詞追加到“LIST1”的第一個單詞之後併合並為一個單詞,……依次列推。<br />傳回值:單空格分割的合并後的字(檔案名稱)序列。<br />函數說明:如果“LIST1”和“LIST2”中的字數目不一致時,兩者中多餘部分將被作為返回序列的一部分。<br />8.$(wildcard PATTERN)<br />函數名稱:擷取匹配模式檔案名稱函數—wildcard<br />函數功能:列出目前的目錄下所有符合模式“PATTERN”格式的檔案名稱。<br />傳回值:空格分割的、存在目前的目錄下的所有符合模式“PATTERN”的檔案名稱。<br />函數說明:“PATTERN”使用shell可識別的萬用字元,包括“?”(單字元)、“*”(多字元)等。<br />三、其它函數<br />1.$(foreach VAR,LIST,TEXT)<br />函數功能:函數“foreach”不同於其它函數。它是一個迴圈函數。類似於Linux的shell中的迴圈(for語句)。這個函數的工作過程是這樣<br />的:如果必要(存在變數或者函數的引用),首先展開變數“VAR”和“LIST”;而運算式“TEXT”中的變數引用不被展開。執行時把“LIST”中使<br />用空格分割的單詞依次取出賦值給變數“VAR”,然後執行“TEXT”運算式。重複直到“LIST”的最後一個單詞(為空白時結束)。“TEXT”中的變數<br />或者函數引用在執行時才被展開,因此如果在“TEXT”中存在對“VAR”的引用,那麼“VAR”的值在每一次展開式將會到的不同的值。<br />傳回值:空格分割的多次運算式“TEXT”的計算的結果。<br />2.$(if CONDITION,THEN-PART[,ELSE-PART])<br />函數功能:函數“if”提供了一個在函數上下文中實現條件判斷的功能。就像make所支援的條件陳述式—ifeq。第一個參數“CONDITION”,在函<br />數執行時忽略其前置和結尾Null 字元並展開。“CONDITION”的展開結果非空,則條件為真,就將第二個參數“THEN_PATR”作為函數的計算表達<br />式,函數的傳回值就是第二運算式的計算結果;“CONDITION”的展開結果為空白,將第三個參數<br />“ELSE-PART”作為函數的運算式,返回結果為第三個運算式的計算結果。<br />傳回值:根據條件決定函數的傳回值是第一個或者第二個參數運算式的計算結果。當不存在第三個參數“ELSE-PART”,並且“CONDITION”展開為空白,函數返回空。<br />函數說明:函數的條件運算式“CONDITION”決定了,函數的傳回值只能是“THEN-PART”或者“ELSE-PART”兩個之一的計算結果。<br />3.$(call VARIABLE,PARAM,PARAM,...)<br />函數功能:“call”函數是唯一一個可以建立定製參數化的函數的引用函數。我們可以將一個變數定義為一個複雜的運算式,用“call”函數根據不同的參數對它進行展開來獲得不同的結果。<br />在執行時,將它的參數“PARAM”依次賦值給臨時變數“$(1)”、“$(2)”(這些臨時變數定義在“VARIABLE”的值中,參考下邊的例<br />子)……<br />call函數對參數的數目沒有限制,也可以沒有參數值,沒有參數值的“call”沒有任何實際存在的意義。執行時變數“VARIABLE”被展開為在函數<br />上下文有效臨時變數,變數定義中的“$(1)”作為第一個參數,並將函數參數值中的第一個參數賦值給它;變數中的“$(2)”一樣被賦值為函數的第二個<br />參數值;依此類推(變數$(0)代表變數“VARIABLE”本身)。之後對變數“VARIABLE” 運算式的計算值。<br />傳回值:參數值“PARAM”依次替換“$(1)”、“$(2)”…… 之後變數“VARIABLE”定義的運算式的計算值。<br />函數說明:1.<br />函數中“VARIBLE”是一個變數名,而不是對變數的引用。因此,通常“call”函數中的“VARIABLE”中不包含“$”(當然,除了此變數名是<br />一個計算的變數名)。2.<br />當變數“VARIBLE”是一個make內嵌的函數名時(如“if”、“foreach”、“strip”等),對“PARAM”參數的使用需要注意,因<br />為不合適或者不正確的參數將會導致函數的傳回值難以預料。3. 函數中多個“PARAM”之間使用逗號分割。4.<br />變數“VARIABLE”在定義時不能定義為直接展開式!只能定義為遞迴展開式。<br />4.value函數<br />$(value VARIABLE)<br />函數功能:不對變數“VARIBLE”進行任何展開操作,直接返回變數“VARIBALE”代表的值。這裡“VARIABLE”是一個變數名,一般不包含“$”(當然,除了計算的變數名),<br />傳回值:變數“VARIBALE”所定義文本值(不展開其中的變數或者函數應用)。<br />5.eval函數<br />函數功能:函數“eval”是一個比較特殊的函數。使用它我們可以在我們的Makefile中構造一個可變的規則結構關係(依賴關係鏈),其中可以使用其<br />它變數和函數。函數“eval”對它的參數進行展開,展開的結果作為Makefile的一部分,make可以對展開內容進行文法解析。展開的結果可以包含<br />一個新變數、目標、隱含規則或者是明確規則等。也就是說此函數的功能主要是:根據其參數的關係、結構,對它們進行替換展開。<br />傳回值:函數“eval”的傳回值時空,也可以說沒有傳回值。<br />函數說明:“eval”函數執行時會對它的參數進行兩次展開。第一次展開過程發是由函數本身完成的,第二次是函數展開後的結果被作為Makefile內容<br />時由make解析時展開的。明確這一點對於使用“eval”函數非常重要。在理解了函數“eval”二次展開的過程後。實際使用時,當函數的展開結果中存<br />在引用(格式為:$(x))時,那麼在函數的參數中應該使用“$”來代替“$”。因為這一點,所以通常它的參數中會使用函數“value”來取一個變數<br />的文本值。<br />6.origin函數<br />$(origin VARIABLE)<br />函數功能:函數“origin”查詢參數“VARIABLE”(通常是一個變數名)的出處。<br />函數說明:“VARIABLE”是一個變數名而不是一個變數的引用。因此通常它不包含“$”(當然,計算的變數名例外)。<br />傳回值:返回“VARIABLE”的定義方式。用字串表示。<br />. undefined<br />變數“VARIABLE”沒有被定義。<br />. default<br />變數“VARIABLE”是一個預設定義(內嵌變數)。如“CC”、“MAKE”、“RM”等變數。如果在Makefile中重新定義這些變數,函數傳回值將相應發生變化。<br />. environment<br />變數“VARIABLE”是一個系統內容變數,並且make沒有使用命令列選項“-e”(Makefile中不存在同名的變數定義,此變數沒有被替代)。<br />. environment override<br />變數“VARIABLE”是一個系統內容變數,並且make使用了命令列選項“-e”。Makefile中存在一個同名的變數定義,使用“make -e”時環境變數值替代了檔案中的變數定義。<br />. file<br />變數“VARIABLE”在某一個makefile檔案中定義。<br />. command line<br />變數“VARIABLE”在命令列中定義。<br />. override<br />變數“VARIABLE”在makefile檔案中定義並使用“override”指示符聲明。<br />. automatic<br />變數“VARIABLE”是自動化變數。<br />7.shell函數<br />不同於除“wildcard”函數之外的其它函數。make可以使用它來和外部通訊。<br />函數功能:函數“shell”所實現的功能和shell中的引用(``)相同。實現了命令的擴充。意味著需要一個shell<br />命令作為它的參數,而返回的結果是此命令在shell中的執行結果。make僅僅對它的回返結果進行處理;make將函數的返回結果中的所有分行符號<br />(“/n”)或者一對“/n/r”替換為單空格;並去掉末尾的斷行符號符號(“/n”)或者“/n/r”。函數展開式時,它所調用的命令(它的參數)得到執<br />行。除了對它的引用出現在規則的命令列中和遞迴的變數定義引用以外,其它決大多數情況下,make在讀取Makefile時函數shell就被擴充。<br />傳回值:函數“shell”的參數在shell中的執行結果。<br />函數說明:函數本身的傳回值是其參數的執行結果,沒有進行任何處理。對結果的處理是由make進行的。當對函數的引用出現在規則的命令列中,命令列在執行<br />時函數引用才被展開。展開過程函數參數的執行時在另外一個shell進程中完成的,因此對於出現在規則命令列的多級“shell”函數引用需要謹慎處理,<br />否則會影響效率(每一級的“shell”函數的參數都會有各自的shell進程)。<br />8.error 函數<br />$(error TEXT…)<br />函數功能:產生致命錯誤,並提示“TEXT…”資訊給使用者,之後退出make的執行。需要說明的是:“error”函數是在函數展開式(函數被調用時)才<br />提示資訊並結束make進程。因此如果函數出現在命令中或者一個遞迴的變數定義中時,在讀取Makefile時不會出現錯誤。而只有包含<br />“error”函數引用的命令被執行,或者定義中引用此函數的遞迴變數被展開時,才會提示致命資訊“TEXT…”同時make退出執行。<br />傳回值:Null 字元<br />函數說明:“error”函數一般不出現在直接展開式的變數定義中,否則在make讀取Makefile時將會提示致命錯誤。<br />9. warning 函數<br />$(warning TEXT…)<br />函數功能:函數“warning”類似於函數“error”,區別在於它不會導致致命錯誤(make不退出),而只是提示“TEXT…”,make的執行過程繼續。<br />傳回值:Null 字元<br />函數說明:用法和“error”類似,展開過程相同。</p><p>本文來自ChinaUnix部落格,如果查看原文請點:http://blog.chinaunix.net/u1/59481/showart_1822168.html 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.