2009-11-24 37 views
21

我注意到,當我對某些文件進行更改,然後鍵入make時,它將運行與這些文件相關的某些命令。如果我沒有改變任何東西,那麼make什麼也不做,說這個程序是最新的。這告訴我,make有一種方法可以知道自上次運行以來哪些文件發生了更改。它如何知道?它似乎沒有將任何東西放在它運行的目錄中,所以它必須將這些信息存儲在別的地方。如何知道要更新哪些文件

回答

25

它檢查文件系統的修改日期元信息。

例如,參見和st_mtime成員struct stat

它有內置的規則,告訴它(例如).o文件需要重新生成,如果相應的.c文件已更改;在manual section on rule syntax說:

爲是過時的標準是在 先決條件,其中包括文件用空格分隔 名來指定 。 (通配符 和歸檔成員(見檔案)的 這裏不允許了。)一個目標是出 日期的,如果它不存在,或者如果它是比任何先決條件 的 以上(按最後修改的比較 倍)。

3

它檢查源文件上的日期/時間戳是否晚於相應的中間文件(或者可能是輸出文件 - 這是我處理make文件後的一段時間)。如果是,那麼文件需要被編譯。這將觸發最終可執行文件的鏈接。

12

make通過檢查目標文件X是否需要重建(如文件系統中記錄的修改時間)是否比其任何依賴項更舊來確定目標文件X是否需要重建。舉例來說,如果你有像一個規則來實現:

foo.o: foo.c foo.h common.h 

然後,它知道它需要重建foo.o如果任何foo.cfoo.hcommon.h有一個新的修改時間比foo.o。這意味着執行touch common.h將強制foo.o在下一次生成時重建。

這意味着,如果修改時間不可靠,例如,如果系統時鐘向後跳,或者如果您將文件存儲在某些網絡文件系統上並讓多個客戶端訪問它們,make可能會混淆(特別是如果網絡上各種機器上的時鐘不同步)。如果您使用make以及通過網絡分發的文件,則運行NTP以保持您的時鐘設置正確通常是個好主意。

12

Make比表面上看起來要複雜得多。它有一個複雜算法的推理引擎;當與您的配置數據結合時make是一種程序+數據庫,被稱爲expert system

無論如何,要回答你的問題,檢查make確實有點棘手,因爲可能有多條必備條件鏈,而且這些條件鏈本身可以以任意方式交叉鏈接。

因此,答案爲 「它是如何知道?」 是:

  • 化妝stat(2)的文件以獲得他們的修改時間
  • 然後
  • 化妝做了topological sort上它製作出來的圖形爲Makefile

你是對的,make通常不會留下任何類型的cookie或其他狀態追蹤文件。 (偶爾有一些Makefile自己創建時間戳記餅乾,但這很少見。)但這並不重要,畢竟最後的運行運行可能不成功。它所做的只是將它正在製作的目標文件的日期與源文件上的日期進行比較。它只關心目標是否是最新的,當make上次運行時通常不會計入目標。

相關問題