2013-05-31 46 views
3

我試圖建立一個涉及外部工具的生成,該工具生成一個目錄作爲輸出(好奇的doxyindexer)。到目前爲止,我已經基本上得到了這些命令:如何讓scons把目錄本身當作目標?

target = "doxysearch.db/iamchert" 
doxygen.Doxyindexer(target,["project1.xml","project2.xml","project3.xml"]) 
Default([target]) 
Default(Install(ARGUMENTS["cgibin"],"doxysearch.db")) 

說我遇到的問題是,我想我會target是目錄本身,目錄內沒有一些隨機的文件。沒有什麼我可以完成的,因爲目標不存在,直到我建立目標,我不想推定迪米特里可能會改變的任何東西!當我使用目錄作爲目標,我得到這個錯誤:

TypeError: Tried to lookup Dir 'doxysearch.db' as a File.: 

這就是爲什麼我挑iamchert爲目標。即使我的方法是黑客攻擊,這些線似乎都能按預期工作。但是,我無法得到最後一行的工作。我需要將目錄doxysearch.db複製到cgi-bin目錄中,該目錄由用戶在命令行中指定。也許有人可以解釋如何正確地做這一步?當談到scons時,我是個新手!

我在搜索答案時遇到了麻煩,因爲涉及的所有搜索詞太常見了,無法找到我的具體幫助!

回答

3

我不知道SCons將如何與目標是一個目錄。問題是:SCons應該如何確定目錄是否已更改或不知道它是否應該創建?顯而易見的答案是,如果目錄中有更多或更少的文件,則認爲目錄被更改,但我不認爲SCons目前執行此檢查,您可能必須讓自己的構建工具才能獲取它。

我做了下面的例子來測試,而且也從未建立:

env = Environment() 
env.Command(target = 'targetDir', 
      source = 'srcTextFile', 
      action = Copy("$TARGET", "$SOURCE")) 

當我執行SCons的,我總是得到相同的結果:

scons: '.' is up to date 

關於你SCons的代碼,我認爲它會更好地工作如下:

targetDir = "doxysearch.db/iamchert" 
srcFiles = ["project1.xml","project2.xml","project3.xml"] 

doxygenTarget = doxygen.Doxyindexer(targetDir, srcFiles) 

    # This may need to be called via the Command() builder like this: 
    # cmd = "doxygen.Doxyindexer("$TARGET", "$SOURCE") 
    # doxygenTarget = env.Command(target=targetDir, source=srcFiles, action=cmd) 

# This call to Default isnt really necessary 
Default(doxygenTarget) 
Install(ARGUMENTS["cgibin"], doxygenTarget) 
+0

我想問題是如何計算作爲目標的「年齡」的目錄。一個黑客可能看起來像目錄tar'ed,並被用作目標。我會假設如果這可行的話,那麼Scons可以採取某種方式在幕後做到這一點。但這聽起來像是你說Scons沒有能力。 – amos

+0

@amos,它絕對可以在SCons中進行這種檢查,因爲它的擴展性很強,但是目前這種行爲還沒有實現。除了我提到的有關目錄被認爲已更改(如果文件更多或更少)之外,有些人可能會爭辯說,如果其中的文件已更改,則目錄會發生更改。這可能會變得複雜而低效,因爲它可以擴展到子目錄。 – Brady

5

SCons其實處理所有的文件在一個目錄作爲該目錄的依賴關係。有一些黑暗的角落需要工作,但它應該像這樣的簡單情況下工作。

您需要的是未公開的target_factory構建器標誌。當你定義Doxyindexer做這樣的:

doxyindexer = Builder(..., target_factory=env.fs.Dir) 

和你的建設者返回目錄本身。這應該避免你得到的TypeError。