makefile——命令

  • 每條命令的開頭必須以[Tab]鍵開頭,除非是緊跟在依賴規則後面的分號後的。
  • 在命令行之間中的空格或是空行會被忽略,但是如果該空格或空行是以 Tab 鍵開頭的,那麼 make 會認爲其是一個空命令。
  • make 的命令默認是被 “/bin/sh”,UNIX 的標準 Shell 解釋執行的,除非特別指定一個其它的 Shell 。
  • makefile 中,“#” 是註釋符,其後的本行字符都被註釋。

顯示命令

  • make 會把其要執行的命令行在命令執行前輸出到屏幕上,用“@”字符在命令行前,這個命令將不被 make 顯示出來。
  • make 帶參數 “-n” 或 “–just-print”,只是顯示命令,但不會執行命令,可用於調試。
  • make 帶參數 “-s” 或 “–slient” 則是全面禁止命令的顯示。

命令執行

  • 如果要讓上一條命令的結果應用在下一條命令時,應該使用分號分隔這兩條命令,不能把這兩條命令寫在兩行上,否則將不起作用,與預想有差異。
  • make 一般是使用環境變量 SHELL 中所定義的系統 Shell 來執行命令,默認情況下使用UNIX 的標準 Shell “/bin/sh” 來執行命令。

命令出錯

每當命令運行完後,make 會檢測每個命令的返回碼,如果成功,make 會執行下一條命令,直到規則成功完成,如果出錯,make 就會終止執行當前規 則,這將有可能終止所有規則的執行,但有時候命令的出錯並不表示就是錯誤的。

  • 在makefile 的命令行前加一個減號 “-” (在 Tab 鍵之後),標記爲不管命令是否出錯都認爲是成功的。
  • make 帶上“-i” 或是 “–ignore-errors” 參數,makefile 中所有命令都會忽略錯誤。
  • 如果一個規則是以 “.IGNORE” 作爲目標的,那麼這個規則中的所有命令將會忽略錯誤。
  • make 帶參數 “-k” 或 “–keep-going”, 那麼某規則中的命令出錯了,就終止該規則的執行,但繼續執行其它規則。

嵌套 make

不同模塊或是不同功能的源文件放在不同的目錄中, 在每個目錄中都書寫一個該目錄的 makefile,然後總控 makefile 嵌套執行,這有利於模塊編譯和分段編譯。

  • 總控 makefile 的變量可以傳遞到下級的 makefile 中(顯示聲明),不會覆蓋下層的 makefile 中所定義的變量( 除非指定了 “-e” 參數)。
export variable = value #聲明傳遞變量到下級
unexport variable = value #聲明不要傳遞變量到下級
export #傳遞所有變量
  • 兩個變量SHELL、MAKEFLAGS 不管是否 export,其總是要傳遞到下層 makefile 中。上級定義了 MAKEFLAGS, 其包含了 make 的參數信息,是一個系統級的環境變量,如果不想往下傳遞,可以讓MAKEFLAGS=,否則謹慎定義。
  • make 命令中的有幾個參數並不往下傳遞,它們是 “-C”,“-f”,“-h”,“-o”,“-W”。
  • make 帶上參數 “-w” 或 “–print-directory”,會在執行過程中輸出目前的工作目錄。當使用 “-C” 參數來指定 make 下層 makefile 時,“-w” 會被自動打開,如果參數中有 “-s”(“–slient”)或 “–no-print-directory”,則 “-w” 總是失效的。

定義命令包

如果 makefile 中出現一些相同命令序列,那麼可以爲這些相同的命令序列定義成一個變量(相當於宏),變量名就是這個命令包的名字,定義這種命令序列的語法以 “define” 開始,以 “endef” 結束。

define test
#命令序列
endef
$(test) #調用命令包變量(變量名不得與其它變量名重複)

make 在執行命令包時,命令包中的每個命令會被 依次獨立執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章