目錄
- 前言
- 概念
- 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
- 意思是:某規則中的指令出錯了,就終止該規則的執行,但繼續執行其它規則。
- 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
- -w 或是 --print-directory 會在 make 的過程中輸出目前的工作目錄。如:執行
# 進入該目錄時會答應如下資訊
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
- 指令包名字
- 中間兩句就是 指令包内容
- run-yacc
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
- 調用方法
- 采用 $
foo.c:foo.y
$(run-yacc)
- 《GUN Makefile》
- 《跟我一起寫Makefile》