这是我正在尝试的问题的最小重复步骤。
假设我有以下SConscripts和SConsctruct:
#/ SConstruct:
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使用的算法是:
不幸的是,“lib”依赖于lib1和lib2,而scons继续编译它们。我希望,因为lib2不在lib1之下,所以它不会被添加到构建中。
一种解决方案是让每个库都有自己的别名,后缀为lib,但系统使用起来会更加棘手。另一个是检查创建别名的位置(通过我自己替换环境中的Alias方法,使用Scons的call_stack全局来知道我从哪个SConscript调用Alias并创建或不创建取决于位置SConscript)并按原样返回新创建的别名或对象。
我宁愿不把它搞乱,所以我想知道我是否遗漏了某些东西。
感谢
答案 0 :(得分:0)
如果您希望使用Alias()函数对lib1和lib2进行不同的处理,那么您需要为每个函数指定一个不同的别名,如下所示:
/ LIB1 / SConscript:
Alias( "lib1", SharedLibrary( "lib1", "codeLib1.cpp" ) )
/ LIB2 / SConscript:
Alias( "lib2", SharedLibrary( "lib2", "codeLib2.cpp" ) )
如果为两个目标分配相同的别名,则将 两个 目标添加到同一别名,并且它们都将被编译/评估(考虑用于编译)编译别名目标时。
如果您只想编译某个目录中的内容,您应该可以执行以下操作:
# cd lib1
# scons .
或者您可以指定要编译的路径,假设您在项目根目录中:
# scons ./lib1