我有一个分层项目,它使用来自公共系统目录的源代码,为此我使用 SConsRepository()
函数并希望将所有构建输出(本地代码和从存储库中获取的代码)放置在 variant_dir 中。
如果我Repository()
在一个简单的场景中使用该函数(非分层且不调用子目录 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)
模块A/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 目录
关于如何在正确的位置获取目标文件的任何建议?