我有一个Hierarchical项目,它使用来自公共系统目录的源代码,我正在使用SCons Repository()
函数,并希望放置所有构建输出(本地代码和从存储库中获取的代码)一个variant_dir。
如果我在一个简单场景中使用Repository()
函数(非hierchical而没有调用子目录SConscripts),那么编译后的Repository()对象文件将按预期放在variant_dir中。但是如果我在分层构建中执行相同的操作,则编译的Repository()
目标文件将放在项目根目录中。
假设我想使用位于系统目录中的以下源代码:
/usr/local/repoDir/repoFile.cc
我有以下项目结构:
# tree .
.
|-- SConstruct
|-- build
| `-- linux_x86_64
`-- moduleA
|-- localFile.cc
`-- SConscript
以下是构建脚本:
SConstruct
编辑:从调用Repository()中删除了文件名,感谢users@scons.tigris.org的Dirk Baechle指出了这一点。
env = Environment()
env.Repository('/usr/local/repoDir')
env['variantDir'] = 'build/linux_x86_64'
SConscript('moduleA/SConscript',
exports = ['env'],
variant_dir = env['variantDir'],
duplicate = 0)
moduleA / SConscript
import os
Import('env')
srcFiles = [
'localFile.cc',
#os.path.join(env['variantDir'], 'repoFile.cc'), # fails to find source file
#'#%s' % os.path.join(env['variantDir'], 'repoFile.cc'), # fails to find source file
#'repoFile.cc', # fails to find source file
'#repoFile.cc', # only option that works, but places object in root proj dir
]
env.Append(CPPPATH = ['.', '#'])
env.Program(target = 'myApp', source = srcFiles)
我希望编译repoFile.cc
文件并将其目标文件放在build/linux_x86_64
中,而是放在与根SConstruct相同的目录中。
正如您在moduleA/SConscript
中的评论中所看到的,我尝试了几种不同的方式引用repoFile.cc
,唯一有效的方法就是其中提到的。另外,我尝试在Repository()
中调用moduleA/SConscript
函数,但它没有改变任何内容。
编辑:这是编译输出
# scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o repoFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir /usr/local/repoDir/repoFile.cc
g++ -o build/linux_x86_64/localFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir moduleA/localFile.cpp
g++ -o build/linux_x86_64/myApp build/linux_x86_64/localFile.o repoFile.o
scons: done building targets.
结果目录结构:
# tree .
.
|-- repoFile.o <=== This file should be in build/linux_x86_64 NOT here
|-- SConstruct
|-- build
| `-- linux_x86_64
| |-- localFile.o
| `-- myApp
`-- moduleA
|-- localFile.cpp
`-- SConscript
我查了一下并发现了这个,但它并不完全相同:
Scons Hierarchical Builds with Repository directory
关于如何在正确的位置获取目标文件的任何建议?
答案 0 :(得分:0)
我在SCons用户邮件列表上问了同样的问题,并收到了一些部分回答这个问题的信息。感谢Dirk Baechle
帮我解决了这个问题。
Repository()
函数有效安装传入SCons项目根目录的目录:即SConstruct
文件所在的目录。如果需要在SCons项目的子目录中引用repo子目录中的文件,则子目录名称(repo dir和scons项目目录的名称)必须匹配。这就是为什么上面问题中SConscript
文件中的不同选项无法找到repo文件的原因。
如果repo子目录moduleA
与文件repoFile.cc
一起存在,那么它将按预期找到,编译对象将按预期放在variant_dir中。
我在Repository()
函数中看到的一个限制是,您无法将repo目录挂载到SCons项目子目录。这听起来像是一个功能请求。
SCons将编译的目标文件放在源目录中的事实对我来说似乎是个错误。至少,它应该放在variant_dir根目录中。