2010-07-22 137 views
5

這個想法是一個項目有一個文件,其中有__DATE____TIME__。重新編譯它可能會很酷,但不會明確更改其修改日期。如何強制重新編譯Makefile中的單個文件?

編輯:$(shell touch -c ..)可能是一個很好的解決方案,只要笨拙。

+1

這可能是您的問題的錯誤解決方案。某些版本控制工具可以轉儲源版本的詳細信息。在構建過程中有一些腳本hackery,並將這些細節內置到您的代碼中。如果您必須在十年內查看源代碼並重新構建,則無關緊要 - 您的版本信息仍會反映該代碼的詳細信息。 – Steve314 2010-07-22 00:40:54

+0

@ Steve314:更有可能他想要一個提到構建號和構建日期的about box。 – 2010-07-22 00:55:43

+0

@Ken - 如果是這樣,版本控制工具技巧是正確的。沒有理由說明爲什麼腳本hackery不能將版本信息放入代碼(或資源文件)中,而將內部版本號碼放入關於框的內容可能需要輕易忘記的人工干預。編譯器和文件系統都不知道你的內部版本號。 – Steve314 2010-07-22 01:08:50

回答

8

標準成語是有目標文件(未在源文件!)取決於目標不存在,也沒有規則或依賴關係(該目標通常稱爲FORCE),像這樣

always-recompile.o: FORCE 
FORCE: 

但是,如果名爲「FORCE」的文件以某種方式被創建,這將會中斷。隨着GNU讓你可以改用特殊目標.PHONY,它沒有這個限制,但需要你有一個明確的規則來重建該文件:

always-recompile.o: 
     $(CC) $(CFLAGS) -c -o always-recompile.o always-recompile.c 

.PHONY: always-recompile.o 

詳情請參閱http://www.gnu.org/software/make/manual/html_node/Phony-Targets.html

+1

你應該做「.PHONY:FORCE」,因爲always-recompile.o不是假目標。使用「.PHONY:FORCE」時,如果創建一個名爲FORCE的文件,應該沒有關係。 – camh 2010-07-22 00:44:12

+0

這實際上工作嗎? GNU使手工聽起來像假目標不起真正目標的依賴性。 – zwol 2010-07-22 00:48:03

1

執行此操作的一種方法是在運行make之前刪除相應的目標文件(.o.obj)。這將觸發重新編譯(和重新鏈接)而不更改源文件修改日期。

相關問題