使用SCons构建真正的层次结构?

时间:2012-03-30 21:11:45

标签: python build scons build-script

所以我在这里阅读了关于等级构建的问题,例如:Creating a Hierarchical Build with SCons

我想做两个独立的回购的真正的分层构造,它们都使用我设置为使用mercurial的子回购的scons。下面是说明我想要做的文件布局。

所需的布局:

project_root/  (new project that builds bar app using the libfoo built from source)

    libfoo_subrepo/  (standalone project repo from bitbucket)
        src/
            SConscript
            libfoo.c
            libfoo.h
        test/
            SConscript
            test_foo.c
        SConstruct

    barapp_subrepo/  (standalone project repo from bitbucket that uses libfoo)
        src/
            SConscript
            bar.c
            bar.h
        test/
            SConscript
            test_bar.c
        SConstruct

    test/
        SConscript
        test_bar_with_foo.c
    SConstruct

所以我有两个单独的回购,都使用scons。第一个是libfoo,可以单独克隆并使用scons构建。当在libfoo根目录中运行scons时,它在src /中构建一个libfoo的静态库,并在test /中构建一个单元测试可执行文件,链接到src /中的静态库。

第二个回购拥有依赖于libfoo的酒吧应用程序。它也可以单独克隆,如果在构建系统上安装了libfoo,它可以使用scons构建。

我想要做的是设置一个新的repo(project_root),它使用mercurial将libfoo和bar app repos设置为subrepos。所以当你克隆这个新的repo时,它会自动拉下bar app和它的依赖,libfoo。然后我希望能够在这个新的repo的根目录中运行scons并让它在libfoo_subrepo / root中执行scons来构建libfoo并进行单元测试。然后我希望它在barapp_subrepo / root中运行scons来构建栏并告诉它链接libfoo_subrepo / src /中的libfoo静态库。最后,我希望它在测试中构建一些新的单元测试/使用libfoo静态库和bar应用程序中的源文件来组合测试bar app和libfoo。

据我所知,通过阅读scons文档,我需要为“subrepo”创建一个自定义Builder,它将在子shell中运行scons。然后我可以将libfoo.subrepo和barapp.subrepo添加到project_root /目录以及一些方法,以便当构建器执行命令构建libfoo.subrepo时,它将源名称转换为它执行scons的路径

building 'libfoo.subrepo' translates into executing 'cd libfoo_subrepo; scons'

在我看来,scons无法以递归方式构建独立的scons项目。我读过的所有内容都假定您能够在子文件夹中创建SConscript文件,然后让根SConstruct文件依赖于SConscript文件。请告诉我有办法用scons做我想做的事。我不想再回去了。

感谢。

2 个答案:

答案 0 :(得分:9)

我不确定为什么你需要制作一个自定义构建器,如果我理解正确,我认为你需要的一切都可以用SCons及其内置构建器来完成。

要做你解释的,你确实需要3个Seperate SConsctruct文件,才能做3个单独的构建。我还要添加3个SConscript文件,并按如下方式制作所有文件:

编辑:在此示例中,最好在SConstruct脚本中创建Environment()

project_root / SConstruct

# This SConstruct orchestrates building 3 subdirs

import os

subdirs = ['libfoo_subrepo', 'barapp_subrepo', 'test']
env = Environment()

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

libfoo_subrepo / SConstruct

# This SConstruct does nothing more than load the SConscript in this dir
# The Environment() is created in the SConstruct script
# This dir can be built standalone by executing scons here, or together
# by executing scons in the parent directory
env = Environment()
SConscript('SConscript', exports = ['env'])

libfoo_subrepo / SConscript

# This SConstruct orchestrates building 2 subdirs
import os

Import('env')
subdirs = ['src', 'test']

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

barapp_subrepo / SConstruct

# This SConstruct does nothing more than load the SConscript in this dir
# The Environment() is created in the SConstruct script
# This dir can be build standalone by executing scons here, or together
# by executing scons in the parent directory
env = Environment()
SConscript('SConscript', exports = ['env'])

barapp_subrepo / SConscript

# This SConstruct orchestrates building 2 subdirs
import os

Import('env')
subdirs = ['src', 'test']

for subdir in subdirs:
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env'])

我希望每个文件中的注释都能解释其目的。

希望这有帮助。

答案 1 :(得分:-4)

SConscript(dirs=['src', 'doc'])