scons,-u和别名

时间:2012-05-03 20:39:42

标签: scons aliases

这是我正在尝试的问题的最小重复步骤。

假设我有以下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使用的算法是:

  • 阅读所有SConscript并构建依赖关系树
  • 查看命令行(“lib”)的请求目标是否存在于当前目录下(“-u”)
  • 如果不存在,请不要做任何事情
  • 如果是,请编译该目标的所有依赖项。

不幸的是,“lib”依赖于lib1和lib2,而scons继续编译它们。我希望,因为lib2不在lib1之下,所以它不会被添加到构建中。

一种解决方案是让每个库都有自己的别名,后缀为lib,但系统使用起来会更加棘手。另一个是检查创建别名的位置(通过我自己替换环境中的Alias方法,使用Scons的call_stack全局来知道我从哪个SConscript调用Alias并创建或不创建取决于位置SConscript)并按原样返回新创建的别名或对象。

我宁愿不把它搞乱,所以我想知道我是否遗漏了某些东西。

感谢

1 个答案:

答案 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