2015-09-04 32 views
0

Python函數可以是Builder中使用的SCons操作,如SCons user manual中所述。只要有任何來源發生變化,此功能將由SCons調用。源以SCons文件對象列表的形式傳遞 在這個函數中,我想知道是否某個特定的源已被更改(並且因此哪些源文件強制SCons重新構建該目標)。獲取哪些文件已被修改文件SCons構建器動作

所以如果「file.target」使用「file1.src」,並使用該調用Python函數「custom_build」一個自定義生成器「file2.src」建:

env.CUSTOM_BUILDER('file.target', ['file1.src', 'file2.src']) 

def custom_build(env, source, target): 
    # Checks if file1.src has been modified 
    if source[0].has_been_modified: # Does something like this exist?? 

我已檢查該文件對象在調試時,但沒有成功。是否有任何屬性知道在SCons構建器中更改了特定文件?

+1

這不是生成器行爲的任務。通過將'* .src'文件定義爲目標源,SCons會自動註冊這些文件之間的依賴關係。當你的一個源文件改變時(取決於你使用的Decider()方法),你的Action「custom_build」被調用。其唯一的任務是從給定的來源重新創建目標,關於這一步驟何時發生的決定是在另一個層面。 – dirkbaechle

+0

我明白你的觀點。但爲了重新創建目標,我需要知道哪些文件已被修改。假設目標是一個簡單的文件,列出了所有可用來重新創建目標的源文件。 SCons有這個信息,所以我的問題是如何得到它。 –

+0

我找到併發布了適合我需求的解決方案。無論如何感謝您的回覆。 –

回答

0

我在Node.__ init__軟件包上搜索時發現了一個可能的解決方案(SCons選項--debug = explain在這裏提供了關於每個目標更改的源的信息)。這不是很好,但似乎做的工作。至少,它適合我。關鍵是在目標上使用changed_since_last_build

def build(env, target, source): 
    old = target[0].get_stored_info() 
    old = old.binfo 
    old.prepare_dependencies() 
    old_bkids = old.bsources + old.bdepends + old.bimplicit 
    old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs 
    osig = dict(zip(old_bkids, old_bkidsigs)) 

    for src_file, info in osig.iteritems(): 
     print str(src_file) + ' change status: ' + str(src_file.changed_since_last_build(target[0], info)) 
+0

從我所看到的,你只是簡單地使用SCons在內部使用的相同方法來找出文件是否已經更改。但是,只要您明確地調用新的「構建」方法,就可以在SConstruct/SConscript中正確執行此代碼。如果(其中一個)源(或源)在構建過程中生成(例如自動生成的頭文件),則這將失敗。它可能適用於你足夠簡單的情況,但我想警告其他用戶不要在他們的項目中使用此方法。他們會臉上掉下去,對不起。 – dirkbaechle

+0

補充說明:您目前正在調用'changed_since_last_build',而不是目標。 – dirkbaechle

相關問題