Scons层次化构建与存储库目录
我有一个SCons项目,设置如下:
proj/
SConstruct
src/
c/
h/
app1/SConscript
app2/SConscript
...
每个应用程序的所有源文件和头文件都放在src/c和src/h文件夹里。
- 第一步,我在app1文件夹里创建了一个
文件,并使用了Repository功能。
...
src=Split("main.c first.c second.c")
env = Environment(CC='g++', CCFLAGS=['-O0', '-ggdb'], CPPPATH=['.'])
env.Program('appone', src)
Repository("../src/c", "../src/h")
一切都正常。scons找到了构建appone应用程序所需的所有源文件和头文件。
但是,如果我尝试以层次结构的方式构建appone,就不行了 :-(
我把app1/SConstruct重命名为app1/SConscript,并在proj/SConstruct里加了:
SConscript('app1/SConscript')
现在我遇到了以下错误:
scons: *** [app1/main.o] Source `app1/main.c' not found, needed by target `app1/main.o'.
我该如何配置我的proj/SConstruct或proj/app1/SConscript,以便在我的Repository目录中搜索所有源文件呢?
1 个回答
SCons正在你的app1文件夹里寻找源文件。如果你这样指定源文件:
src=Split("#main.c #first.c #second.c")
那么SCons会在仓库中搜索这些源文件。
这里有几点额外的想法:
你可能希望把main.c放在app1文件夹里,这样可以避免和其他可执行文件的main.c发生冲突。在这种情况下,记得在你的源文件列表中去掉main.c前面的#。
如果多个应用程序共享仓库,最好在你的顶层SConstruct文件中定义这些仓库。
从共享源文件中构建库文件通常是有用的,这样单元测试可以有自己的主函数,但又可以链接和你的应用程序相同的源文件(或者让应用程序共享公共模块)。把SConscripts放在共享仓库目录中来构建公共库可能会更简单。这超出了这个问题的范围,但随着项目的发展,值得考虑。