2009-09-30 55 views
7

scons使用MD5散列而不是文件模式時間來確定是否需要構建依賴關係。相當於scons中的「touch」嗎?

我希望這是默認行爲。但是有沒有辦法強制它假定一個特定的文件已經過時(相當於「touch」),除了編輯文件以使其不同?

編輯:用例:

二進制文件F被用來創建使用工具X.出於某種原因文件ģ另一個文件G具有改變(它被損壞,或I編輯它)或工具X已經改變了,我想重新創建文件G及其下游的所有內容。

編輯:這只是偶爾使用而已。我不希望這種事情總是發生,只有那幾次我要求它。另外我可能提前不知道特定的文件。由於這個原因,我不想修改SConscript/SConstruct文件來構建一個特定的文件。我想是在命令提示符下做到這一點:

scons {something to specify file foobar.h} 

這將迫使scons的構建中的所有文件取決於foobar.h中,而只是打字scons會做使用MD5定期生成散列的依賴性檢查。我不介意提前編輯SConscript/SConstruct文件以允許此(自定義Decider,我猜),如果有辦法這樣做,不會顯着增加構建時間。

回答

4

你有沒有看過Scons的--interactive選項,在那裏你可以清理並建立特定的目標。

man page describing this.

+0

呵呵,我從來不知道 - 互動,這將爲我節省一些時間,重複建設。謝謝!我想我可以將它用於我想要的東西。 – 2009-11-11 17:15:05

+0

請注意,如果您確實想要觸發新的編譯調用,則需要執行scons'--interactive --no-cache',否則交互式命令'build'將只會從緩存中選取,而不會執行編譯器。 – 2014-04-09 12:37:29

1

我不認爲有一種方法可以直接做到這一點。如果有問題的源文件有一個明顯的輸出,例如從test.c創建的test.o,則刪除test.o會強制重新編譯源文件。

如果您想要觸摸test.h,其中包含多個不同的源文件,則可以更好地清理整個項目以確保重建所有內容。

話雖如此,您可能想了解Decider() function,它可以讓您選擇如何處理文件依賴關係。你甚至可以爲你的項目中的特定文件選擇一個自定義的判定函數,所以如果你有一些全局的頭文件,你想能夠touch和重建,你可以這樣做。

更新:要回答您的最新問題,只需刪除文件G. Scons將通過在下次構建時運行X重新創建它。

0

我創建一個完整的日期到小時分鐘和秒鐘的虛擬目標文件。然後我有其他步驟依賴於這個虛擬目標文件。這將每次構建步驟重新編譯時都會更改md5值,並導致後續步驟重新編譯。或者,您可以刪除虛擬目標,並且也會級聯重新編譯。

就我個人而言,我覺得這非常有用,因爲我無法預測EDA構建流程中每一步的所有輸出。由於維護成本,我也不想嘗試預測每個構建步驟的所有輸出。

我確定Decider()函數,正如Greg所提到的,更像scons,但我個人喜歡有時間戳文件。

0

在您的SConstruct文件中提取表示您的文件的節點。在此之後,您應該可以使用節點。always_build(true)爲了確保它被構建,我認爲這將迫使它的依賴者也被重建。

+0

感謝,但我不想總是這樣做(這是一個罕見的,但迫切需要的任務),我不希望修改SConstruct/SConscript文件,我只是想的辦法執行一次性重建以強制重建特定文件或文件及其依賴項。 – 2009-11-11 15:54:54