1. 文件的時間戳
make
?主要依靠文件的時間戳來判斷依賴文件是否有更新。每個文件在文件系統中都有一個時間戳,記錄了文件的三種重要時間:
- ??訪問時間(Accesstime)??:文件最后一次被訪問的時間。
- ??修改時間(Modifytime)??:文件內容最后一次被修改的時間。
- ??狀態改變時間(Changetime)??:文件的狀態(如權限、所有者等)最后一次被修改的時間。
make
?主要關注的是文件的修改時間(mtime)。
2. 比較時間戳的過程
當?make
?讀取?makefile
?中的規則時,會按照以下步驟檢查依賴文件是否有更新:
步驟一:確定目標和依賴文件
假設?makefile
?中有這樣一個規則:
main: main.o add.o sub.ogcc main.o add.o sub.o -o main
這里?main
?是目標文件,main.o
、add.o
?和?sub.o
?是依賴文件。
步驟二:檢查目標文件是否存在
- 如果目標文件?
main
?不存在,那么?make
?會認為目標文件是最新的(因為還沒有生成),需要執行規則中的命令來生成目標文件。 - 如果目標文件?
main
?存在,繼續下一步。
步驟三:比較目標文件和依賴文件的修改時間
make
?會獲取目標文件?main
?的修改時間(mtime)。- 然后依次獲取每個依賴文件(
main.o
、add.o
?和?sub.o
)的修改時間。
步驟四:判斷是否需要重新生成目標文件
- 如果任何一個依賴文件的修改時間比目標文件的修改時間新,說明依賴文件有更新,
make
?會執行規則中的命令來重新生成目標文件。 - 如果所有依賴文件的修改時間都不比目標文件的修改時間新,說明目標文件已經是最新的,
make
?不會執行任何命令。
3. 示例說明
假設當前目錄下有以下文件及其修改時間:
main
:2025-04-04?10:00:00main.o
:2025-04-04?09:00:00add.o
:2025-04-04 9:30:00sub.o
:2025-04-04?10:30:00
當運行?make
?時:
make
?發現目標文件?main
?存在。- 獲取?
main
?的修改時間為 2025-04-04 10:00:00。 - 檢查依賴文件:
main.o
?的修改時間為 2025-04-04 09:00:00,比?main
?的修改時間舊。add.o
?的修改時間為 2025-04-04 09:30:00,比?main
?的修改時間舊。sub.o
?的修改時間為 2025-04-04 10:30:00,比?main
?的修改時間新。
由于?sub.o
?的修改時間比?main
?的修改時間新,make
?會認為?main
?需要重新生成,因此會執行規則中的命令:
gcc main.o add.o sub.o -o main
4. 特殊情況處理
- ??依賴文件不存在??:如果規則中的某個依賴文件不存在,
make
?會認為這個依賴文件需要生成,從而執行相應的命令來生成這個依賴文件,然后再重新檢查目標文件是否需要更新。 - ??手動修改時間戳??:如果手動修改了文件的時間戳,但沒有實際修改文件內容,
make
?可能會錯誤地認為該文件已經更新,從而重新生成依賴它的目標文件。為了避免這種情況,可以使用?touch
?命令來正確更新文件的時間戳。
總結
- ??時間戳機制??:
make
?主要依靠文件的時間戳(特別是修改時間 mtime)來判斷依賴文件是否有更新。 - ??比較過程??:
make
?會獲取目標文件和依賴文件的修改時間,并比較它們的大小。如果任何一個依賴文件的修改時間比目標文件的修改時間新,make
?會執行規則中的命令來重新生成目標文件。