Im新的scons和我有問題scons依賴 在一個層次結構與變體目錄建立。scons依賴問題的層次結構與變體dirs
林能再現一個包含所SConscript目錄下 2子目錄(moduleA和moduleB)爲減少環境問題如下:
.
|-- SConstruct
|-- file.conf
|-- moduleA
| |-- SConscript
| `-- conf2cc
`-- moduleB
|-- SConscript
`-- fileB.cc
下面是需要做什麼樣的流程:
- moduleA執行shell腳本:conf2cc,輸入:$ projRootDir/file.conf,輸出:moduleA/$ variantDir/source.cc
- moduleA編譯source.cc並創建moduleA/$ variantDir /李bmoduleA.a
- moduleB需要moduleA/$ variantDir/source.cc複製到moduleB/source.cc
- moduleB需要編寫moduleB/source.cc和moduleB/fileB.cc到其 庫libmoduleB.a
這是完全可能的,我在這裏做了幾件事情錯了。例如,我知道 林在moduleA司令部()不使用$ TARGET/$ SOURCE,但目的多數民衆贊成,因爲 腳本需要的絕對路徑名,並且scons的犯規刪除前面的「#」
問題我有的是moduleB(上面的步驟3)中的Command()構建器從不執行。
這裏是SConstruct和SConscript文件:
Sconstruct
import os
env = Environment()
env['variantDir'] = 'linux' # for this example, just make variantDir = linux
modules = ['moduleA', 'moduleB']
for dir in modules:
SConscript(
os.path.join(dir, 'SConscript'),
variant_dir = os.path.join(dir, env['variantDir']),
exports = ['env'],
duplicate = 0)
moduleA/Sconscript
import os
Import('env')
scriptInput = '#file.conf'
sourceFile = os.path.join('#moduleA', env['variantDir'], 'source.cc')
conf2ccScript = File('#moduleA/conf2cc').abspath
# The script needs abspaths for input and output, not the scons '#' prepended
# the script syntax is: script <inputFile> <outputFile>
cmd = '%s %s %s' % (conf2ccScript, File(scriptInput).abspath, File(sourceFile).abspath)
# Generate source.cc file based on file.conf
conf2ccNode = env.Command(target = sourceFile,
source = scriptInput,
action = cmd)
libNode = env.Library(target = 'moduleA', source = sourceFile)
env.Depends(libNode, conf2ccNode)
moduleB/Sconscript
import os
Import('env')
sourceFiles = ['fileB.cc', 'source.cc']
# Get the source.cc file
externalSourceFile = os.path.join('#moduleA', env['variantDir'], 'source.cc')
sourceTarget = os.path.join('#moduleB', 'source.cc')
cmdNode = env.Command(target = sourceTarget,
source = externalSourceFile,
action = Copy('$TARGET', '$SOURCE'))
libNode = env.Library(target = 'moduleB', source = sourceFiles)
env.Depends(libNode, cmdNode)
這裏是輸出時我執行scons:
任何幫助將不勝感激!
布雷迪
[email protected]:~/projects/sconsTest/sconsTestHierDeps$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
/home/notroot/projects/sconsTest/sconsTestHierDeps/moduleA/conf2cc /home/notroot/projects/sconsTest/sconsTestHierDeps/file.conf /home/notroot/projects/sconsTest/sconsTestHierDeps/moduleA/linux/source.cc
g++ -o moduleA/linux/source.o -c moduleA/linux/source.cc
ar rc moduleA/linux/libmoduleA.a moduleA/linux/source.o
ranlib moduleA/linux/libmoduleA.a
g++ -o moduleB/linux/fileB.o -c moduleB/fileB.cc
scons: *** [moduleB/linux/source.o] Source `moduleB/source.cc' not found, needed by target `moduleB/linux/source.o'.
scons: building terminated because of errors.
好極了!這按預期工作。我喜歡SCons指出隱含的依賴關係,而不必使用Depends()函數顯式列出它們。非常感謝! – Brady
但有一點需要注意:moduleB/source.cc的目標文件放在moduleB中,而不是在moduleB的variant_dir中,而fileB.o確實放在了variant_dir中。這是爲什麼?我怎樣才能將source.o放置在variant_dir中? – Brady
我想通過指定moduleB source.cc文件,如下所示: 'sourceTarget = os.path.join('#moduleB',env ['variantDir'],'source.cc')'現在來源.cc和source.o文件放置在variant_dir中。 – Brady