【发布时间】:2012-02-14 11:20:54
【问题描述】:
我是 scons 的新手,并且遇到了 scons 依赖项的问题 在具有变体目录的分层构建中。
我能够在一个简化的环境中重现该问题,其中包括 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/libmoduleA.a
- moduleB需要拷贝moduleA/$variantDir/source.cc到moduleB/source.cc
- moduleB 需要将moduleB/source.cc 和moduleB/fileB.cc 编译到它的 库 libmoduleB.a
我完全有可能在这里做错了几件事。例如,我知道 我没有在 moduleA Command() 中使用 $TARGET/$SOURCE,但这是故意的,因为 脚本需要绝对路径名,scons 不会删除前导的 '#'
我遇到的问题是 moduleB 中的 Command() 构建器(上面的第 3 步)永远不会执行。
这里是 SConstruct 和 SConscript 文件:
构造
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)
模块A/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)
模块B/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 时的输出:
任何帮助将不胜感激!
布雷迪
notroot@ubuntu:~/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