2010-03-18 82 views
3

我有一個文件系統,其中包含「構建」目錄,其中每個文件都包含一個名爲「build-info.xml」的文件。然而,一些構建發生在構建腳本生成「build-info.xml」之前,所以在這種情況下,我有一些不重要的SCons SConstruct,用於生成骨架構建信息文件,以便它可以用作進一步規則的依賴。SCons不清理所有文件

即:每個目錄:

  • 如果Build-info.xml已經存在,什麼也不做。更重要的是,不要在'scons --clean'上刪除它。
  • 如果build-info.xml不存在,生成一個框架 - build-info.xml對任何其他文件沒有依賴關係 - 框架基本上是最小的默認值。
  • 期間--clean
  • ,清理積聚info.xml,如果它是產生,否則離開它是。

我SConstruct看起來是這樣的:

def generate_actions_BuildInfoXML(source, target, env, for_signature): 
    cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,) 
    return cmd 

bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1) 
env.Append(BUILDERS = { "BuildInfoXML" : bld }) 

... 

# VERSION = some arbitrary string, not important here 
# path = filesystem path, set elsewhere 
build_info_xml = "%s/build-info.xml" % (path,) 
if not os.path.exists(build_info_xml): 
    env.BuildInfoXML(build_info_xml, None, VERSION = build) 

我的問題是, 'scons的--clean' 不會刪除生成的構建-info.xml文件。

我在'if'中玩過env.Clean(t,build_info_xml),但是我無法讓它工作 - 主要是因爲我無法確定分配給't'的東西 - 我想要一個生成的build-info.xml無條件地進行清理,而不是基於另一個目標的清理,而且我無法使其工作。

如果我在'if'之後但在外部嘗試了一個簡單的env.Clean(None,「build_info_xml」),我發現SCons會清理每一個build-info.xml文件,包括那些未生成的文件。也不好。

我想知道什麼是SCons的如何去有關確定哪些文件應該被清理,那些不應該。有沒有什麼有趣的方式,我使用了一個發電機功能,防止SCons將這個目標記錄爲Clean候選人?

+0

進一步就此 - 與上面的規則,scons的--tree =狀態不顯示「顯式生成器」的集結info.xml。它顯示E(存在)和C(當前),但不顯示B(顯式構建器)。這是沒有B的唯一文件,所以也許這就是SCons不清除它的原因。那麼爲什麼env.BuildInfoXML沒有資格作爲「顯式構建器」呢? – meowsqueak 2010-03-18 22:56:07

+0

實際上,如果我手動清理整個環境並運行'scons --tree = status path/to/something/that/depends/on/build-info.xml',我會爲build-info.xml獲得'B' ,並且SCons根據上述規則構建它。但我認爲這個規則具有「無」作爲依賴的事實意味着它不會被添加到清單列表中...... – meowsqueak 2010-03-18 23:13:08

回答

7

好吧,我想我已經制定了這是怎麼回事 - 我做了一個不正確的假設,即SCons的記錄它會創建這些文件(如目標),然後在隨後的「乾淨」使用此記錄列表。這當然沒有意義。

什麼SCons的實際上做的是通過所有的相關性規則重新運行,並創建一個新的依賴關係樹。它使用它來確定清理哪些文件。因爲我有這個os.path.exists()條件,這意味着build-info.xml永遠不會被添加到Clean列表中,因爲它始終存在於--clean運行時。

事實證明,env.Clean()正常工作,因爲它會刪除所有這些文件,只是因爲沒有辦法讓SCons在第二次運行時(用--clean)知道生成特定的build-info.xml文件而不是已經存在。

來解決,這將是創建一個文件定點沿着那些生成文件的方式。但是現在,我對SCons的清潔行爲的新理解就足夠了。

+0

這是對行爲的很好的描述。謝謝! – 2010-03-19 17:57:36