我有一个分层项目,它使用公共系统目录中的源代码,为此我使用 SConsRepository()
函数并希望将所有构建输出(本地代码和从存储库中获取的代码)放置在variant_dir中。
如果我使用Repository()
在简单场景中运行函数(非分层,不调用子目录 SConscripts),则编译后的 Repository() 对象文件将按预期放置在variant_dir中。但是如果我在分层构建中执行相同的操作,则编译后的Repository()
目标文件放置在项目根目录下。
假设我想使用位于系统目录中的以下源代码:
/usr/local/repoDir/repoFile.cc
我有以下项目结构:
# tree .
.
|-- SConstruct
|-- build
| `-- linux_x86_64
`-- moduleA
|-- localFile.cc
`-- SConscript
以下是构建脚本:
构建
Edit:从对 Repository() 的调用中删除了文件名,感谢 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/S征兵
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
,但它并没有改变任何东西。
Edit: 这是编译输出
# 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 使用存储库目录进行分层构建
关于如何将目标文件放在正确的位置有什么建议吗?