0

这是我正在试验的问题的最小重现步骤。

假设我有以下 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 的)并按原样返回新创建的别名或对象。

我宁愿不搞这个,所以我想知道我是否遗漏了什么。

感谢

4

1 回答 1

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
于 2012-05-04T07:30:15.950 回答