2013-05-04 81 views
1

我試圖在SCons中獲得一個分層構建。目錄結構是這樣的:在SConscript文件之間傳遞目標

code/SConstruct 
code/src/SConscript 
code/src/main.c 
code/src/foo.c 
code/src/bar.c 
code/src/tests/SConscript 
code/src/tests/test_foo.c 
code/src/tests/test_bar.c 

測試_ * C需要鏈接到實現他們測試函數的C文件,因此test_foo.c有鏈接到foo.c對於例子。因此,src/SConscript必須將許多目標返回到src/tests/SConscript,以便它可以構造二進制文件(每個測試1個)。我的問題是使用Return()函數完成此操作的最佳方法是什麼?我想要返回的文件的順序無關緊要,所以一個元組將不會執行。我的想法是構造一個字典,其中的鍵是文件名。我想檢查一下沒有更好的方法來做到這一點;也許我可以構造不同的文件,以促進更清潔的構建?

由於提前,

回答

1

而不是傳球目標周圍,你可以考慮創建2個庫:libfoo的和libbar的。然後,在編譯test_foo和test_bar二進制文件時,通過引用variant_dir來鏈接這些庫。試圖通過這樣的目標往往變得複雜和難以維持。

如果您想知道SCons variant_dir是什麼,它將生成輸出(二進制文件,庫,對象等)放在非源代碼的目錄中。如here所述,在SConscript()函數調用中使用參數variant_dir

而不必創建庫,您可以參考源文件,如here所述。下面是一個簡單的例子:(請注意,以「#」字符意味着相對於根級SConstruct)

env.Program(target='test_foo', ['test_foo.c', '#src/foo.c']) 
+0

我也有類似的情況,但我的目錄結構扁平化:只是'SRC /'和'的src /測試'。麻煩的是,我想'#src/foo.c'構建在一個變體目錄中,但是它構建在'src /'中。我的頂級SConstruct調用'SConscript('test/SConscript',variant_dir ='build',exports ='env',duplicate = 0)'。 test/SConscript調用'env.Program(target ='test_foo',['test_foo.c','#src/foo.c'])''。 當我建立時,我得到'src/build/test_foo','src/build/test_foo.o',這是正確的。但是我得到'src/foo.o'而不是'src/build/foo.o'。我究竟做錯了什麼? – cklin 2013-09-20 23:24:47

+0

@cklin,聽起來像'foo.c'正在爲src正確構建,但是正在爲'test_foo'重新構建。嘗試在構建'test_foo'時引用'foo.o',如下所示:env.Program(target ='test_foo',['test_foo.c','#src/build/foo.o')) – Brady 2013-09-21 13:10:17