如果foo_user.cpp依賴於foo.h,那麼會創建foo_user.cpp,然後將foo.h的修改時間設置爲過去的更長時間,make將不會重新生成foo_user.cpp(因爲foo.cpp是'newer' )。如果make記錄了依賴關係的修改時間,並且它們完全改變(更新或更舊),那麼我更願意使用它來考慮依賴項的目標是過時的。 GNU可以做到這一點嗎?如果不是,有沒有簡單的選擇?可以'檢查'依賴項的mtime是否不同*運行之間,而不僅僅是比目標更新?
如果您好奇這種情況是如何發生的:foo.h位於符號鏈接的文件夾中。符號鏈接可能指向foolib-1.0文件夾,foolib-2.0文件夾等。當符號鏈接指向不同版本的庫時,即使是較早版本的foo_user.cpp也應該重建。如果我只是將symlinkfolder/foo.h指定爲foo_user.cpp的依賴項,那麼make只關注foo.h的時間戳,而不是通過其訪問foo.h的symlink'd目錄的時間戳。由於make規則是由編譯器生成的,因此我無法將符號鏈接本身作爲依賴項添加(GCC有一個特殊的標誌,當給定的標誌會導致它爲源文件所依賴的所有標題輸出make規則)。
我覺得DigitalRoss是正確的:添加 「foo_user.cpp:symlinkfolder」 到你的makefile(從foo_user.cpp規則獨立)。我測試了這個,它似乎工作(GNUMake 3.81)。 – Beta 2009-11-10 01:34:34
不幸的是,沒有好的自動方法來添加該規則。假設foo.cpp只在symlinkfolder1中使用一個頭,而bar.cpp只在symlinkfolder2中使用一個頭。我不希望每個.cpp文件都依賴於所有可能的符號鏈接文件夾,以避免虛假重建。而且我不想在自己的makefile中維護依賴項,所以我使用編譯器選項讓它生成它們。但是它生成的規則僅指定實際文件,而不指定其包含的文件夾。我可以在生成的規則中搜索包含路徑中文件夾的依賴關係,然後添加文件夾,但速度很慢。 – 2010-01-03 19:53:02