这是我正在试验的问题的最小重现步骤。
假设我有以下 SConscripts 和 SConstruct:
#/S构造:
SConscript( "SConscript", variant_dir="build" )
#/SConscript:
SConscript( "lib1/SConscript" )
SConscript( "lib2/SConscript" )
#/lib1/SConscript:
Alias( "lib", SharedLibrary( "lib1", "codeLib1.cpp" ) )
#/lib2/SConscript:
Alias( "lib", SharedLibrary( "lib2", "codeLib2.cpp" ) )
scons 手册指出,调用“scons -u”只会构建在当前目录下找到的指定目标。
这意味着调用
scons -u lib
在目录 #/lib1 中将在 lib1 及其所有依赖项下构建“lib”目标(在这种情况下是我的别名)。
据我了解,“scons -u lib”只有在当前文件夹下有一个名为 lib 的目标(在我们的例子中是别名)时才会构建“lib”目标。如果我要求目标“测试”,它本来存在于其他地方(假设在项目的根目录),它就不会被编译。
scons 使用的算法似乎是:
- 阅读所有 SConscript 并构建依赖树
- 查看命令行的请求目标(“lib”)是否存在于当前目录下(“-u”)
- 如果它不存在,不要做任何事情
- 如果是,则编译该目标的所有依赖项。
不幸的是,“lib”依赖于 lib1 和 lib2,并且 scons 继续编译它们。我希望由于 lib2 不在 lib1 之下,所以它不会被添加到构建中。
一种解决方案是让每个库都有自己的别名,并以 lib 为后缀,但这样系统使用起来会更加棘手。另一种方法是检查从何处创建别名(通过我自己替换环境中的 Alias 方法,该方法使用 Scons 的 call_stack 全局来了解我从哪个 SConscript 调用 Alias 并根据位置创建或不创建别名SConscript 的)并按原样返回新创建的别名或对象。
我宁愿不搞这个,所以我想知道我是否遗漏了什么。
感谢