2013-05-14 111 views
7

我希望SCons在我的src/目錄中爲我生成一些源文件,然後將它們構建爲我的生成目錄build/variantX中的任何其他源文件。SCons代碼生成和VariantDir

這是我SCons的文件:

import SCons 

def my_builder(env, target, source): 
    # do stuff 
    pass 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
    'build/variant1/foobar.cc', 
    'build/variant1/test.cc', 
    ]) 

這與以下消息的錯誤:

來源src/foobar.cc沒有發現,通過目標build/variant1/foobar.o

需要,我不認爲是正確的,考慮到我確實提供了建立src/foobar.cc的命令。現在

,我嘗試了一些解決方法:

  • ,如果我在計劃與src/foobar.cc取代build/variant1/foobar.cc,它的工作,但顯然foobar.o獲取src/創建而不是build/variant1

  • 如果我更換src/foobar.cc在命令與build/variant1/foobar.cc,它確實工作,但我想代碼生成src/; (也因爲類似的事情在相對路徑包括目錄不會,除非duplicate=1工作)

  • 如果duplicate=1,我得到一個類似的錯誤消息,但這次提variant目錄:

    來源build/variant1/foobar.cc未找到由目標build/variant1/foobar.o

需要的是有辦法解決?這是SCons中的限制/錯誤,還是我身邊存在根本的誤解?

+0

你有沒有找到這個問題的答案?我面對的東西非常相似。 – jfritz42 2014-04-26 04:17:55

回答

2

我建議建立命令()和項目(之間的顯式依賴)調用如下:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
target2 = env.Program('bin/test', [ 
         'build/variant1/foobar.cc', 
         'build/variant1/test.cc', 
         ]) 
Depends(target2, target1) 
# This should work too 
# Depends(target2, "src/foobar.cc") 

或者你也可以爲源動力的計劃的一部分,指定從命令()目標( )如下:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
      target1, 
      'build/variant1/test.cc', 
      ]) 

我還沒有測試這一點,所以林不知道將如何協同工作與調用VariantDir()

Here是關於使用SCons生成源代碼的一些額外信息。

+0

嗨布雷迪,謝謝你的幫助。你的第一個想法確實不錯,但它似乎沒有任何影響。第二個似乎與我的第一個解決方法實際上是一樣的:它可以工作,但它將它構建在源目錄中,而不是變體之一。該鏈接看起來很有趣,我現在正在經歷它。 – UncleZeiv 2013-05-14 15:13:03

+0

@UncleZeiv我真的很驚訝Depends()函數沒有工作。嘗試使用實際的文件名,而不是更新答案。 – Brady 2013-05-14 16:34:06

+0

'--tree = all'告訴我這樣會根據「正確的」src/foobar.cc(依次取決於'src/foobar.input')的結果產生'bin/test',但是'build/variant1/foobar.o'仍然依賴於一個「dangling」src/foobar.cc,它不依賴於任何東西,並且(打開scons源代碼的開放)似乎甚至沒有任何建築師附加到它。我真的開始認爲這是一個Scons錯誤。 – UncleZeiv 2013-05-14 16:50:56

0

我知道它已經有一段時間了,但我碰到了同一面牆。稍作修改的「測試案例」和溶液(見下文)的代碼是:

import SCons 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action="cp src/foobar.input src/foobar.cc", shell=True) 
env.Depends("build/variant1/foobar.cc", "src/foobar.cc") 
env.Program('bin/test', [ 
'build/variant1/foobar.cc', 
]) 

的「variantdir源」到「產生源」上所添加的「env.Depends」是關鍵。不知道爲什麼這是必要的。我會把它稱爲一個錯誤,但我想它的功能(基於你得到的錯誤反饋..)

乾杯,