Build 从Repository()编译的源代码不会放入分层SCons项目的variant dir中

Build 从Repository()编译的源代码不会放入分层SCons项目的variant dir中,build,scons,Build,Scons,我有一个分层项目,它使用公共系统目录中的源代码,我正在使用SCons存储库函数,并希望将所有生成输出本地代码和从存储库中获取的代码放在variant_dir中 如果我在一个简单的场景中使用Repository函数,它是非层次结构的,不需要调用子目录SConscripts,那么编译后的存储库对象文件将按预期放置在variant_dir中。但是,如果在分层构建中执行相同的操作,则编译后的存储库对象文件将放置在项目根目录中 假设我要使用位于系统目录中的以下源代码: /usr/local/repoDir

我有一个分层项目,它使用公共系统目录中的源代码,我正在使用SCons存储库函数,并希望将所有生成输出本地代码和从存储库中获取的代码放在variant_dir中

如果我在一个简单的场景中使用Repository函数,它是非层次结构的,不需要调用子目录SConscripts,那么编译后的存储库对象文件将按预期放置在variant_dir中。但是,如果在分层构建中执行相同的操作,则编译后的存储库对象文件将放置在项目根目录中

假设我要使用位于系统目录中的以下源代码:

/usr/local/repoDir/repoFile.cc
我的项目结构如下:

# tree .
.
|-- SConstruct
|-- build
|   `-- linux_x86_64
`-- moduleA
    |-- localFile.cc
    `-- SConscript
# 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
以下是构建脚本:

SConstruct

编辑:由于来自的Dirk Baechle,从对存储库的调用中删除了文件名users@scons.tigris.org谢谢你指出这一点

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,唯一有效的方法就是其中提到的方法。此外,我尝试在moduleA/SConscript中调用Repository函数,但它没有改变任何东西

编辑:这里是编译输出

# 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 .
.
|-- SConstruct
|-- build
|   `-- linux_x86_64
`-- moduleA
    |-- localFile.cc
    `-- SConscript
# 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用户邮件列表上问了同样的问题,收到的一些信息部分回答了这个问题。感谢Dirk Baechle在这个问题上帮助我

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

如果repo子目录moduleA与repoFile.cc文件一起存在,则会按预期找到它,并且编译的对象会按预期放置在variant_dir中

我看到的Repository函数的一个限制是不能将repo目录装载到SCons项目子目录。这听起来像是一个功能请求

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