所以我在这里阅读了关于等级构建的问题,例如: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做我想做的事。我不想再回去了。
感谢。
答案 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'])