Can I use SCons aliasing for choosing SConscripts to run?
我正在使用SCons来构建一个非常大的项目,其中包含许多可构建的子项目。我可以轻松地使用诸如scons group=ai之类的关键字命令来通过if语句构建AI子项目(基于keyword命令选择正确的SConscripts),但是我想让其他人尽可能容易地使用scons。理想情况下,我想这样使用它:scons ai来构建AI组件。但是,到目前为止,我在SCons中发现的唯一的单字命令功能是别名,所有示例都与更改目标有关。这不是我想要的。由于我有一个非常大的项目,其中包含多个子SConscript文件来构建子项目,因此我想选择性地调用SConscripts。我已经尝试过这样的代码:
1
| env.Alias("ai", SConscript("ai/SConscript", 'env')) |
但这每次都调用AI SConscript,无论我使用" ai "别名还是其他别名。有谁知道是否可以使用这种方式使用别名来基于别名有选择地调用SConscripts?
如前所述,Alias()函数仅用于目标。我可以想出两种方法来解决这个问题
可以为具有不同目标的同一别名多次调用
Alias(),因此您可以为每个SConscript中的所有目标调用它,然后可以在SConscript中构建所有内容。这是我的意思的示例:
ai / SConscript:
1 2 3 4 5 6
| # targets, etc
env.Alias("ai", target1)
env.Alias("ai", target2)
...
env.Alias("ai", targetn) |
另一个选择是在根SConstruct中放入一些逻辑,以便它仅基于命令行参数调用子项目SConscript \\。此选项将要求您使用以下形式的命令行参数:group=ai
- 感谢您的回答。我对Scons的工作方式有重大误解,这有助于我进行修复。现在使用您发布的第一个解决方案。
-
您知道我是否可以以某种方式将这些别名放入顶级SConscript吗?我试着只是移动它们并更改路径以尊重新位置,但现在scons认为一切总是最新的...
-
@Darkhydro,您是说要在顶级SConstruct中定义这些别名吗?是的,可以这样做,但是您将需要访问那里的目标才能这样做。这可能会导致一个不同的问题,但是请考虑从SConscript()调用将目标列表返回到根级SConstruct并在其中创建别名。
-
我发现如果要包含所有依赖项,则必须以可执行文件(而不是源文件)为目标,这大大简化了此问题。我的顶层别名结构现在工作得很漂亮。谢谢您的帮助!
-
@Darkhydro,很乐意为您提供帮助:)