2013-01-15 48 views
1

我的項目使用外部軟件包。這些軟件包分佈在tarball中,並且在更新tarball時提取它們的內容。scons:如何根據時間戳提取歸檔文件

例如,我使用boost。相應的外部包是boost.tar.bz2。該軟件包包含頭文件和庫。我想要做的是在更新tarball時自動提取scons的內容。

我可以通過使用「時間戳文件」的Makefile來實現此目的。當壓縮包比時間戳文件更新,歸檔文件自動提取:

all: external-packages 

external-packages: boost xml2 

boost: .boost-timestamp 

xml2: .xml2-timestamp 

.boost-timestamp: boost.tar.bz2 
    @echo updating boost externals 
    @tar xjf boost.tar.bz2 
    @touch .boost-timestamp 


.xml2-timestamp: xml2.tar.bz2 
    @echo updating xml2 externals 
    @tar xjf xml2.tar.bz2 
    @touch .xml2-timestamp 

clean: 
    rm -rf .*-timestamp boost xml2 

我怎樣才能實現與scons的一樣嗎?

回答

1

我認爲你最好的選擇是看看the untar builder

添加後在site_scons添加設計器功能/發射器的文件夾scons的文件可能是這樣的:

env = Environment() 
env..Append(BUILDERS = {'UnTar' : unTarBuilder}) 

external_package = "packages/boost.tar.bz2" 
archive = env.UnTar(source=external_package) 

不過,你應該注意的是,解壓建設者沒有考慮目錄至發射,因此不會對clean

本建設者點刪除這些是發射這將確保SCons的知道,它可以創建的標題,所以每當東西取決於他們(人包括他們)它將推出untar生成器每當tar文件改變時。

+0

我的問題不是解壓縮存檔。我想要做的是在執行任何其他任務之前解壓縮存檔。 我找到了一個解決方案:創建一個「開始」任務,根據所有的拆包任務完成這個「開始」任務,並根據這個「開始」任務完成所有其他任務。但是實現起來非常繁瑣(我的項目非常龐大並且有很多任務),並且在進行「並行」構建(scons --jobs 4)時不起作用。 –

+0

有了scons,你不用考慮前後的問題,它可以通過依賴來解決。如果有什麼依賴於將被解壓縮的文件,則拆包將在之前完成。所以使用UnTar將確保依賴關係圖是正確的,所以你不必擔心之前或之後。 – daramarak

+0

@SergeWeinstock我在回答中添加了一段來指出這個細節。 – daramarak