2013-10-24 100 views
3

我正在使用scons實現一個構建系統,用於一個有點大的軟件項目。有一個目錄結構,它將單個庫和程序的代碼分隔到自己的目錄中。使用我們現有的make系統,我可以在一個程序目錄中做一個「make clean」,它只會清除與該目錄中的源相關的文件。如果我做了「scons -c」,它會認識到程序依賴於兄弟(或堂兄弟)目錄中的大量庫,並清除所有這些文件。這不是我想要的,因爲我必須重新構建可能需要幾分鐘的所有這些庫。如何防止scons清除父目錄和兄弟目錄?

我試着玩「NoClean()」命令,但沒有得到它以我需要的方式工作。考慮到代碼庫的大小和目錄結構的複雜性,我無法真實地爲每個庫中的每個文件都有一個NoClean()行。

有沒有什麼辦法可以讓scons忽略當前目錄上的乾淨(即scons -c)時的任何依賴關係?

回答

1

我很想有一個好的答案,這個我自己添加一個別名。

我現在可以提供的唯一解決方案就是讓Noclean工作。 所以在您的圖書館,你應該有這樣的事情

lib_objs = SharedObject(source_list) 
mylib = SharedLibrary('libname', lib_objs) 

所以對於這一點,我們要保護的圖書館和被清洗的來源。

NoClean([mylib, lib_objs]) 

請注意,我不得不把目標文件的建設從庫分裂,因爲我希望能夠通過他們NoClean爲好。

+0

這似乎適用於最小的測試。這是一個很好的解決方案。我仍然無法讓它爲整個項目工作,但我相當確定這是因爲我在幾乎每個源目錄都克隆了環境。謝謝你。這絕對讓我更好地瞭解我應該如何解決這個問題。 – user2916971

+1

爲了關閉這個循環,我能夠使用Avatar33的建議獲得我想要的行爲。我需要添加的是檢查每個源目錄是啓動目錄還是後代。 \t CurrentDir = env.Dir( '')srcnode()ABSPATH \t如果不是CurrentDir.startswith(env.GetLaunchDir()): \t \t env.NoClean([myobjs,mylib中,安裝]) 這隻能正確清除當前目錄及其後代。如果我從最頂層的目錄執行'scons -c',則會清除整個源代碼樹。 – user2916971

+0

通過目錄控制清潔的好主意。我希望SCons爲此提供了一個選擇。 當我想要清理所有單元測試結果時,這對我的用例沒有幫助,而且這些結果分散在整個項目中,並與「測試」目標相關聯。但是清理「測試」一直傳播到測試所依賴的所有其他方面,直到C++源文件 –

1

嘗試在清潔時使用目標名稱。

scons -c aTargetName 

可以使用SCons Alias()功能,以簡化目標名稱,並同時將幾個目標名稱爲一個別名。

使用這種方法,你必須在每個子目錄合適的,這不一定是壞事:)

+0

據我所知,這根本沒有幫助。 Scons仍然刪除目標或別名的所有依賴關係。 – Avatar33

+0

是的,我看到它也刪除了一切。我相信,當你指定一個特定的目標時,scons也會自動添加它的所有依賴關係。 – user2916971

+0

這也是關於依賴關係也被清理的一個很好的觀點。這將做的是減少正在清理的範圍。 – Brady