2014-01-19 81 views
4

這是我的簡單情況。我有一個源文件結構如下:編譯時,Scons VariantDir()複製了CPPPATH和LIBPATH?

. 
├── SConstruct 
└── src 
    ├── SConscript 
    ├── staticLib 
    │   ├── classInStaticLib.cpp 
    │   ├── classInStaticLib.h 
    │   └── SConscript 
    └── test.cpp 

SConstruct:

VariantDir('build', 'src', duplicate=0) 
SConscript('build/SConscript') 

的src/SConscript:

import os 
lib = 'staticLib' 
SConscript(os.path.join(lib, 'SConscript')) 
Program('test', 
     'test.cpp', 
     CPPPATH = lib, 
     LIBS = lib, 
     LIBPATH = lib) 

的src/staticLib/SConscript:

Library('staticLib', 'classInStaticLib.cpp') 

後我運行scons,我得到了followin g殼:

g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp 
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o 
ranlib build/staticLib/libstaticLib.a 
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp 
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib 

scons完成沒有錯誤。但請注意,第4行中同時存在「-Ibuild/staticLib」和「-Isrc/staticLib」,第5行中同時存在「-Lbuild/staticLib」和「-Lsrc/staticLib」。應該只有一個。

爲什麼會發生這種情況?

+0

我剛剛在SCons-users郵件列表上問這個問題,看看它是一個錯誤還是有意的行爲。見http://four.pairlist.net/pipermail/scons-users/2014-April/002438.html – jfritz42

回答

1

我認爲這是因爲您使用的是SCons VariantDir()函數,這會導致SCons在構建目錄中查找。我從來沒有見過它使用源和variant_dir目錄。

VariantDir()函數通常只在未使用SConscript()函數時使用。嘗試改變調用SConscript()SConstruct使用variant_dir參數並刪除調用VariantDir(),如下:

SConscript('src/SConscript', variant_dir='build', duplicate=0) 

我也會考慮改變src/SConscript如下:

import os 
lib = 'staticLib' 
SConscript(os.path.join(lib, 'SConscript'), 
      variant_dir=os.path.join(lib, 'build'), 
      duplicate=0) 
Program('test', 
     'test.cpp', 
     CPPPATH = lib, 
     LIBS = lib, 
     LIBPATH = lib) 

這裏執行scons時得到的結果,其順序與您的一樣:

$ scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o build/staticLib/classInStaticLib.o -c src/staticLib/classInStaticLib.cpp 
ar rc build/staticLib/libstaticLib.a build/staticLib/classInStaticLib.o 
ranlib build/staticLib/libstaticLib.a 
g++ -o build/test.o -c -Ibuild/staticLib -Isrc/staticLib src/test.cpp 
g++ -o build/test build/test.o -Lbuild/staticLib -Lsrc/staticLib -lstaticLib 
scons: done building targets. 

$ tree build/ 
build/ 
|-- staticLib 
| |-- classInStaticLib.o 
| `-- libstaticLib.a 
|-- test 
`-- test.o 

1 directory, 4 files 

我從未注意到SCons會這樣做,因此無法解釋爲什麼會這樣做。我試着玩不同的variant_dir選項,並始終保持不變。我會說你沒有做錯任何事,而且它是一個特殊的SCons行爲。

+0

感謝您的回覆。但是我仍然得到了同樣的結果。你或者其他人是否有時間在你的機器上進行測試?會很感激。 – faraday

+0

@faraday,今天晚上我會在幾個小時內對它進行測試...... – Brady

+0

@faraday,昨天晚上我再次測試它,並在今天上午再次測試並更新了答案。我得到了同樣的結果,以及我之前從未注意過的東西:) – Brady

-1

我創造了這個目錄結構:

stest.cpp 
Sconstruct 
dira/hello.cpp 
dira/hello.h 
dirb/hello.cpp 
dirb/hello.h 

我Sconstruct包含此:

SOURCES = [ 'stest.cpp', 'hello.cpp' ] 
common = Environment() 
a=common.Clone (CPPPATH='#') 
a.Repository ('#/dira') 
a.Object ('obja/stest.o', 'stest.cpp') 
a.Object ('obja/hello.o', 'dira/hello.cpp') 
a.Program ('obja/a', ['obja/stest.o', 'obja/hello.o']) 
a.Alias ('a', 'obja/a') 
b=common.Clone (CPPPATH='#') 
b.Repository ('#/dirb') 
b.Object ('objb/stest.o', 'stest.cpp') 
b.Object ('objb/hello.o', 'dirb/hello.cpp') 
b.Program ('objb/b', ['objb/stest.o', 'objb/hello.o']) 
b.Alias ('b', 'objb/b') 

運行scons -n a b給出了這樣的:

g++ -o obja/stest.o -c -I. -Idira -Idirb obja/stest.cpp 
g++ -o obja/hello.o -c -I. -Idira -Idirb obja/hello.cpp 
g++ -o obja/a obja/stest.o obja/hello.o 
g++ -o objb/stest.o -c -I. -Idira -Idirb objb/stest.cpp 
g++ -o objb/hello.o -c -I. -Idira -Idirb objb/hello.cpp 
g++ -o objb/b objb/stest.o objb/hello.o 

所以,這顯然無關VariantDir()

1

這是根據我在SCons用戶郵件列表中得到的回覆使用VariantDir()的「正常和意圖」效果。

four.pairlist.net/pipermail/scons-users/2014-April/002440.html

帕維爾說:「你可能有源文件/生成(與SWIG例如或SCONF)頭和他們去變體目錄,其他人都直接從源代碼目錄拍攝,所以-Ibuild /我認爲staticLib -Isrc/staticLib是正確的。「