我注意到,當我對某些文件進行更改,然後鍵入make時,它將運行與這些文件相關的某些命令。如果我沒有改變任何東西,那麼make什麼也不做,說這個程序是最新的。這告訴我,make有一種方法可以知道自上次運行以來哪些文件發生了更改。它如何知道?它似乎沒有將任何東西放在它運行的目錄中,所以它必須將這些信息存儲在別的地方。如何知道要更新哪些文件
回答
它檢查文件系統的修改日期元信息。
例如,參見和st_mtime
成員struct stat
。
它有內置的規則,告訴它(例如).o文件需要重新生成,如果相應的.c文件已更改;在manual section on rule syntax說:
爲是過時的標準是在 先決條件,其中包括文件用空格分隔 名來指定 。 (通配符 和歸檔成員(見檔案)的 這裏不允許了。)一個目標是出 日期的,如果它不存在,或者如果它是比任何先決條件 的 以上(按最後修改的比較 倍)。
它檢查源文件上的日期/時間戳是否晚於相應的中間文件(或者可能是輸出文件 - 這是我處理make文件後的一段時間)。如果是,那麼文件需要被編譯。這將觸發最終可執行文件的鏈接。
make
通過檢查目標文件X是否需要重建(如文件系統中記錄的修改時間)是否比其任何依賴項更舊來確定目標文件X是否需要重建。舉例來說,如果你有像一個規則來實現:
foo.o: foo.c foo.h common.h
然後,它知道它需要重建foo.o
如果任何foo.c
,foo.h
或common.h
有一個新的修改時間比foo.o
。這意味着執行touch common.h
將強制foo.o
在下一次生成時重建。
這意味着,如果修改時間不可靠,例如,如果系統時鐘向後跳,或者如果您將文件存儲在某些網絡文件系統上並讓多個客戶端訪問它們,make
可能會混淆(特別是如果網絡上各種機器上的時鐘不同步)。如果您使用make
以及通過網絡分發的文件,則運行NTP以保持您的時鐘設置正確通常是個好主意。
Make
比表面上看起來要複雜得多。它有一個複雜算法的推理引擎;當與您的配置數據結合時make
是一種程序+數據庫,被稱爲expert system。
無論如何,要回答你的問題,檢查make
確實有點棘手,因爲可能有多條必備條件鏈,而且這些條件鏈本身可以以任意方式交叉鏈接。
因此,答案爲 「它是如何知道?」 是:
- 化妝
stat(2)
的文件以獲得他們的修改時間 然後
- 化妝做了topological sort上它製作出來的圖形爲Makefile
你是對的,make
通常不會留下任何類型的cookie或其他狀態追蹤文件。 (偶爾有一些Makefile自己創建時間戳記餅乾,但這很少見。)但這並不重要,畢竟最後的運行運行可能不成功。它所做的只是將它正在製作的目標文件的日期與源文件上的日期進行比較。它只關心目標是否是最新的,當make
上次運行時通常不會計入目標。
- 1. 如何知道哪些屬性更新?
- 2. 如何知道更新語句更新哪些列?
- 3. 如何知道java程序需要運行哪些jar文件?
- 4. django知道哪些字段已更新?
- 5. 如何知道哪些字段已更新
- 6. 如何知道在Visual Studio 2012中更新了哪些擴展?
- 7. 如何知道我今天在psql中更新了哪些表?
- 8. MEF如何知道哪些零件要導入?
- 9. IMAP如何知道要提取哪些電子郵件
- 10. 如何知道在提交之前哪些文件或文件夾被更改
- 11. ReactJS如何有效地知道要更新哪個DOM子集?
- 12. 如何知道哪些Android SDK中的jar文件包含我需要
- 13. 如何知道哪些進程訪問文件?
- 14. 如何知道.jar文件中的哪些類被引用?
- 15. 如何知道可執行文件中有哪些功能?
- 16. 如何知道應用程序試圖訪問哪些文件?
- 17. 如何知道哪些XML文件驗證失敗
- 18. 如何知道哪些文件已被反病毒
- 19. 如何知道某個作者修改了哪些文件?
- 20. Hadoop:NameNode如何知道哪些塊對應於一個文件?
- 21. 電子表格如何正確更新單元格/知道要更新哪些內容?
- 22. slickgrid:如何知道哪些行很髒
- 23. 如何知道哪些文件被調用的文件,文件系統
- 24. 如何知道我在Perforce分支中更改了哪些文件?
- 25. 如何燒瓶知道要查看哪個python文件?
- 26. javascript FileReader如何知道要讀取哪個文件?
- 27. Raven如何知道要包含哪些集合?
- 28. 如何知道nl80211命令需要哪些參數?
- 29. Bundle如何知道要安裝哪些gems?
- 30. 您如何知道XHR請求需要哪些參數?