目錄
- 前言
- 概念
- Chapter 2:介紹
- 2.1 makefile的規則
- 2.3 make 是如何工作的 **
- 2.5 讓 make 自動推導
- 2.8 Makefile 裡面有什麼
- 2.9 Makefile 的檔案名
- 2.10 引用其它的Makefile
- 尋找其它的 Makefile 路徑及順序
- 2.11 環境變量 MAKEFILES
- 2.12 make 的工作方式
- 參考
- 書籍
- 本筆記主要記錄Makefile一些概念要點。
- 本筆記為提取性筆記,章節與《跟我一起寫Makefile》同步,是以會看到有些小标題會跳過。
target ... : prerequisites ...
command
...
...
- target
- 可以是一個object file(目标檔案)
- 也可以是一個執行檔案
- 還可以是一個标簽(label)。
- prerequisites
- 生成該 target 所依賴的檔案 和 / 或 targe。
- command
- 為該 target 要執行的指令(任意的shell指令)。
- 注:prerequisites 中如果有一個以上的檔案比 target 檔案要新的話,command 所定義的指令就會被執行。
在預設的方式下,也就是我們隻輸入 make 指令,就會按下面流程走
- make會在目前目錄下找名字叫 Makefile 或 makefile 的檔案。
- GNU make找尋預設的Makefile的規則是在目前目錄下依次找三個檔案—— GNU-makefile 、 makefile 和 Makefile。
- 如果找到,它會找檔案中的第一個目标檔案(target),在上面的例子中,他會找到edit這個檔案,并把這個檔案作為最終的目标檔案。
- 注:此處的 "edit" 是第一個目标,例子就不貼出來了。
- 如果 edit 檔案不存在,或是edit所依賴的後面的.o檔案的檔案修改時間要比 edit 這個檔案新,那麼,他就會執行後面所定義的指令來生成 edit 這個檔案。
- 如果 edit 所依賴的.o檔案也不存在,那麼 make 會在目前檔案中找目标為.o檔案的依賴性,如果找到則再根據那一個規則生成.o檔案。(這有點像一個堆棧的過程)
- 當然,你的 C 檔案和 H 檔案是存在的啦,于是 make 會生成.o檔案,然後再用.o檔案生成make的終極任務,也就是執行檔案 edit 了。
該功能了解一下。
隻要make看到一個.o檔案,它就會自動地把.c檔案加在依賴關系中,如果make找到一個whatever.o,那麼whatever.c就會是whatever.o的依賴檔案。并且cc -c whatever.c也會被推導出來。
如:
whatever.o : whatever.h
# 等價于
whatever.o : whatever.c whatever.h
cc -c whatever.c
Makefile 裡主要包含了五個東西:
* 顯式規則
* 隐晦規則
* 變量定義
* 檔案訓示
* 注釋
-
注:還值得一提的是,在Makefile中的指令,必須要以Tab鍵開始。
以上幾點詳細解釋參考《跟我一起寫Maefile》對于章節
- 預設情況下,make指令會在目前目錄下按順序找尋檔案名為 GNUmakefile、makefile、Makefile的檔案。
- 推薦使用 Makefile 命名。
- 也可以使用别名命名,如 Makefile.build、abcde等等,隻需要使用 make -f 檔案名 或 make -file 檔案名 來指定檔案名即可。
- 在 Makefile 使用 include 關鍵字可以把别的 Makefile 包含進來,這很像 C 語言的 #include ,被 包含的檔案會原模原樣的放在目前檔案的包含位置。
- include 文法:
- filename 可以是目前作業系統 Shell 的檔案模式(可以包含路徑、通配符和多個檔案)(多個檔案時用空格隔開)。
include <filename>
- 先在 filename 指定路徑找。如:include <./Makefile.build> ,表示在目前路徑先找。
- 如果 filename 沒有指定路徑的話,就先從 make 目前路徑先找。
- 以上兩個都沒有,便開始找 make時 -I 或 --include-dir 指定路徑找。
-
還沒找到便去目錄
/include (一般是:/usr/local/bin 或 /usr/include)
找。
- 都沒有便發出警告。(若想略過警告,可以使用 - 号,-include )
- 總結一下:filename指定路徑->目前路徑->-I或--include-dir 指定路徑->最後路徑。
不建議使用 MAKEFILE 變量。需要了解,可以看文檔。
**若使用Makefile時,出現了神奇的 bug ,可以先看看目前環境變量中有沒有定義這個變量。
GNU 的 make 工作時的執行步驟如下:
- 讀入所有的 Makefile。
- 讀入被 include 的其它 Makefile。
- 初始化檔案中的變量。
- 推導隐晦規則,并分析所有規則。
- 為所有的目标檔案建立依賴關系鍊。
- 根據依賴關系,決定哪些目标要重新生成。
- 執行生成指令。
- 《GUN Makefile》
- 《跟我一起寫Makefile》