繁体   English   中英

用于分层源但单个目标的SCons设置

[英]SCons setup for hierarchical source but single target

我有一个一直在从事的C ++ / Python项目,到目前为止,都依靠Visual Studio来管理构建。 现在,我想自动化构建过程,希望包括多个平台支持(全部为标准C ++ / Python),并且认为SCons可以成为完成此任务的工具。

在多个目录中涉及很多源文件,但是一个(立体声)典型示例如下:

foo.lib
  directory_1
    bar1_1.cpp
    bar1_2.cpp
    ... etc. ...
  directory_2
    bar2_1.cpp
    bar2_2.cpp
    ... etc. ...

因此,换句话说,源文件位于层次结构中,但是只有一个目标。 (在代码中使用的名称空间中,层次结构是匹配的,但是对于这个问题而言,这是多余的。)

我的问题是:构造SConstruct和SConscript文件的最佳方法是什么? 我阅读了SCons文档,特别是Hierarchical Builds部分,以及有关通过适当的“ SConscript”调用使用多个SConscript文件的想法。 一切似乎都很清楚,尤其是整洁。 但是,这似乎是针对具有多个目标的层次结构。 在只有一个目标的情况下,可以使用同一功能吗?

(我确实想到了一个顶级SConstruct / SConscript文件,至少对于所讨论的库而言,它列出了带有子目录的所有源文件,但是并没有“感觉”到最好的方式。也许确实这是前进的道路?)

在此先感谢您的任何建议/见解。

我有几次使用一种与您描述的解决方案非常相似的分层解决方案。 我选择了这样的解决方案:

在SConscript中:

#/bar/SConscript
Import("env")
env = specialize_env_for_this_subpackage()

myfiles = Glob(*.cpp)
apply_any_exclusions(myfiles)
myobjects = env.Object(myfiles)

Return(myobjects)

然后在SConstruct中:

#SConstruct
env = construct_general_environment()

subpackages = ["foo","bar","baz"] #or perhaps call your own find_subproject() function

objects = SCons.Node.NodeList
for package in subpackages:
    pack_objects = env.SConscript(os.path.join(package,"SConscript"), exports = env)
    objects.extend(pack_objects)
program = env.Program("myprog",objects)

Default(program)

然后,您可以对每个包中的环境进行微调控制,并且通过巧妙地使用* site_scons *文件夹,可以防止对每个脚本重复重复相同的行。 这种方法的另一个优点是scons文件反映了设计。 我还更喜欢使用Glob来收集cpp文件,使我可以根据需要添加和删除文件,而无需为此类琐碎的操作编辑任何构建文件。

将所有源文件列出在一个SConstruct文件中没有任何问题。 分层构造SConscripts也可以,但是您需要从每一层返回对象,这会有些愚蠢:

# SConscript, for example
sources = ["bar1_1.cpp", "bar1_2.cpp", ...]
objects = [env.Object(x) for x in sources]
Return(objects)

# SConstruct (top-level)
directory_1_objects = SConscript("directory_1/SConscript")
directory_2_objects = SConscript("directory_2/SConscript")
program = env.Program("magical_wonders", [directory_1_objects, directory_2_objects])

我个人认为,使用特定二进制文件中的所有源文件的单个顶级栅格对此更为可取,因为当文件层次结构更改时,这需要更多的接线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM