天天看點

【Makefile】4-Makefile書寫指令

目錄

  • 前言
  • 概念
  • Chapter 4:書寫指令
    • 4.1 顯示指令
    • 4.2 指令執行 *
    • 4.3 指令出錯
    • 4.4 嵌套執行 make
    • 4.5 定義指令包
    • 參考

  • 本筆記主要記錄Makefile一些概念要點。

  • 每條規則中的指令和作業系統 Shell 的指令行是一緻的。
  • 每條指令必須以 Tab 鍵開頭,除非,指令是緊跟在依賴規則後面的分号後的。
  • make 一般是使用環境變量 SHELL 中所定義的系統 Shell 來執行指令,預設情況下是 /bin/sh —— UNIX 的标準 Shell 解釋執行的。

  • 是否顯示指令
    • 在指令行前使用 @ 字元,那麼該指令将不被make顯示出來。
  • 隻顯示,不執行
    • make 執行時,帶入 make 參數 -n 或 --just-print。
    • 作用:一般用于調試,檢視make執行的順序。
  • 全面禁止,指令的顯示:
    • make 參數 -s 或 --silent 或 --quiet 則是全面禁止指令的顯示。

  • 當依賴目标新于目标時,make 會一條一條的執行其後的指令。
  • 如果要讓上一條指令的結果應用在下一條指令時,你應該使用分号分隔這兩條指令。
    • 例子1:輸出為:【目前目錄路徑】
exec:
cd /home/lss
pwd
           
* 例子2:輸出為:/home/lss
           
exec:
cd /home/lss; pwd
           
  • 指令解析器尋找順序
    • 首先,在 SHELL 所指定的路徑中找尋 --> 在目前盤符中的目前目錄中尋找 --> 在 PATH 環境變量中所定義的所有路徑中尋找。
    • MS-DOS 中,如果定義的指令解釋器沒有找到,其會給你的指令解釋器加上諸如 .exe 、.com 、.bat 、.sh 等字尾。

  • 每當指令運作完後,make 會檢測每個指令的傳回碼,碼為零則成功。
  • 忽略指令失敗
    • 方法一:減号
      • 在指令前( Tab 鍵後)加上一個減号 - 即可。
    • 方法二:全局(分兩種)
      • 給 make 加上 -i 或是 --ignore-errors 參數
      • 果一個規則是以 .IGNORE 作為目标的,該規則中的所有指令将會忽略錯誤。
  • 指令失敗,但隻終止目前規則
    • make 的參數的是 -k 或是 --keep-going
      • 意思是:某規則中的指令出錯了,就終止該規則的執行,但繼續執行其它規則。

  • 總控 Makefile + 各個子目錄 Makefile。
  • 父級 Makefile
    • -C 切換到其它目錄
subsystem:
    make -C subdir # 或者:cd subdir && make
           
  • 傳遞變量到下級,聲明方法:
    • export <variable ...>;

    • 注:注意 等号:(意思是 export 後,就不是 延時變量)
      • export variable = value

        等價于

        export variable := value

      • 傳遞時預設不覆寫,加上 -e 即可覆寫下級重新指派的變量
  • 不想讓該變量傳遞到下級,聲明方法:
    • unexport <variable ...>;

  • 注意兩個變量 *
    • SHELL 和 MAKEFLAGS 這兩個變量不管你是否 export,其總是要傳遞到下層 Makefile 中。
    • MAKEFLAGS
      • 包含了 make 的參數資訊。
    • 不想讓 MAKEFLAGS 往下傳遞的做法
subsystem:
   cd subdir && $(MAKE) MAKEFLAGS=
           
  • 不往下傳遞的 參數
    • make 指令中 -C , -f , -h, -o 和 -W 參數是不往下傳遞的。
  • 資訊列印 *
    • -w 或是 --print-directory 會在 make 的過程中輸出目前的工作目錄。如:執行

      make -w

# 進入該目錄時會答應如下資訊
make: Entering directory `/home/hchen/gnu/make'.

# 在完成下層 make 後離開目錄時:
make: Leaving directory `/home/hchen/gnu/make'
           
* 當你使用 **-C** 參數來指定 **make** 下層 **Makefile** 時,**-w** 會被自動打開的。如果參數中有 **-s(--slient)**或是 **--no-print-directory** ,那麼,**-w** 總是失效的。
           

  • 相當于 C 中的函數。
  • 文法以 define 開始,以 endef 結束。
  • 例子:
    • run-yacc
      • 指令包名字
    • 中間兩句就是 指令包内容
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
           
  • 調用方法
    • 采用 $
foo.c:foo.y
    $(run-yacc)
           

  • 《GUN Makefile》
  • 《跟我一起寫Makefile》

繼續閱讀