歡迎您光臨本站 註冊首頁

make shell函數簡介

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

 

 

shell函數

  shell函數不同於除“wildcard”函數之外的其它函數。make可以使用它來和外部通信。

  *  函數功能:函數“shell”所實現的功能和shell中的引用(``)相同。實現對命令的擴展。這就意味著需要一個shell 命令作為此函數的參數,函數的返回結果是此命令在shell中的執行結果。make僅僅對它的回返結果進行處理;make將函數返回結果中的所有換行符(“\n”)或者一對“\n\r”替換為單空格;並去掉末尾的回車符號(“\n”)或者“\n\r”。進行函數展開式時,它所調用的命令(它的參數)得到執行。除對它的引用出現在規則的命令行和遞歸變數的定義中以外,其它決大多數情況下,make是在讀取解析Makefile時完成對函數shell的展開。

  * 返回值:函數“shell”的參數(一個shell命令)在shell環境中的執行結果。

  *  函數說明:函數本身的返回值是其參數的執行結果,沒有進行任何處理。對結果的處理是由make進行的。當對函數的引用出現在規則的命令行中,命令行在執行時函數才被展開。展開時函數參數(shell命令)的執行是在另外一個shell進程中完成的,因此需要對出現在規則命令行的多級“shell”函數引用需要謹慎處理,否則會影響效率(每一級的“shell”函數的參數都會有各自的shell進程)。

  示例1:

  contents := $(shell cat foo)

  將變數“contents”賦值為文件“foo”的內容,文件中的換行符在變數中使用空格代替。

  示例2:

  files := $(shell echo *.c)

  將變數“files”賦值為當前目錄下所有.c文件的列表(文件名之間使用空格分割)。在shell中之行的命令是“echo *.c”,此命令返回當前目錄下的所有.c文件列表。上例的執行結果和函數“$(wildcard *.c)”的結果相同,除非你使用的是一個奇怪的shell。

  注意:通過上邊的兩個例子我們可以看到,當引用“shell”函數的變數定義使用直接展開式定義時可以保證函數的展開是在make讀入Makefile時完成。後續對此變數的引用就不會有展開過程。這樣就可以避免規則命令行中的變數引用在命令行執行時展開的情況發生(因為展開“shell”函數需要另外的shell進程完成,影響命令的執行效率)。



[火星人 ] make shell函數簡介已經有254次圍觀

http://coctec.com/docs/program/show-post-71568.html