从Repository()编译的源代码不会放在Hierarchical SCons项目的变量目录中

时间:2012-04-18 13:03:49

标签: build scons

我有一个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 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)

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

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

1 个答案:

答案 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根目录中。