我在stackoverflow上阅读了有关分层构建的问题,例如:使用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/中静态库的单元测试可执行文件。
第二个仓库有一个名为bar的应用程序依赖于libfoo。如果在构建系统上安装了libfoo,则可以单独克隆该仓库并使用scons进行构建。我的想法是设置一个新的仓库(project_root),其中将libfoo和bar应用程序仓库作为子仓库使用mercurial设置。因此,当您克隆此新仓库时,它会自动下载bar应用程序及其依赖项libfoo。然后,我希望能够在这个新仓库的根目录中运行scons,并让它执行libfoo_subrepo / root中的scons来构建libfoo及其单元测试。然后,我希望它在barapp_subrepo / root中运行scons来构建bar并告诉它链接到libfoo_subrepo / src /中的libfoo静态库。最后,我希望它构建一些新的单元测试,在tests /中使用libfoo静态库和bar应用程序的源文件来测试组合在一起的bar应用程序和libfoo。 据我所知,从阅读scons文档可以看出,我需要创建一个“subrepo”的自定义构建器,在子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实现我想要的功能。我不想回到make。
谢谢。
SConscript(dirs=subdirs, exports=["env"])
来代替手动循环。 - joki