1

我有一个分层项目,它使用来自公共系统目录的源代码,为此我使用 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 Ba​​echle 指出这一点。

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 目录

关于如何在正确的位置获取目标文件的任何建议?

4

1 回答 1

0

我在 SCons-users 邮件列表上问了同样的问题,并收到了一些部分回答了这个问题的信息。感谢您Dirk Baechle帮助我解决这个问题。

Repository()函数有效地将传入的目录挂载到 SCons 项目的根目录:即SConstruct文件所在的目录。如果需要在 SCons 项目的子目录中引用 repo 子目录中的文件,则子目录名称(repo 目录和 scons 项目目录的名称)必须匹配。这就是为什么上述问题中文件中的不同选项SConscript无法找到 repo 文件的原因。

如果 repo 子目录moduleA与 file 一起存在repoFile.cc,那么它将按预期找到,并且编译后的对象将按预期放置在 variant_dir 中。

我看到该Repository()功能的一个限制是您不能将 repo 目录挂载到 SCons 项目子目录。这听起来像是一个功能请求。

SCons 将编译后的目标文件放在源目录中的事实对我来说似乎是一个错误。至少,它应该放在 variant_dir 根目录中。

于 2012-04-29T14:29:06.550 回答