【问题标题】:Trying to make SCons Ada Builder work with VariantDir试图让 SCons Ada Builder 与 VariantDir 一起工作
【发布时间】:2014-05-20 13:49:40
【问题描述】:

我正在努力使用最后的逻辑,以使我们的 Ada 构建器与 variantdir 一起按预期工作。问题是由于不灵活的工具gnatbindgnatlink 不允许将活页夹文件放在当前目录以外的目录中。这给我留下了两个选择:

  • 让 gnatbind 将活页夹文件写入 topdir,然后让 gnatlink 从那里选择它。但是,如果我们希望允许针对我们想要的不同架构和编译器版本进行模拟构建,这可能会导致竞争条件。
  • 修改对 gnatbind 和 gnatlink 的调用以暂时进入构建目录,在我们的例子中为 build/$ARCH/src-path。我成功地修复了 gnatbind 步骤,因为这是使用 Ada 构建器中的 env.Execute 显式调用的。为了尝试修复链接步骤,我修改了 Program env 使用

    env["LINKCOM"] = SCons.Action.Action(ada_linkcom)

ada_linkcom 定义为

def ada_linkcom(source, target,env ):
    ....
    return ret

其中ret 是一个字符串,描述了应该在shell 中执行的操作。我需要这是一个函数,它包含一些复杂的逻辑,将路径从相对于顶层转换为只包含它们的基本名称。

但是,这会失败,并在函数 do_execute 的第 347 行的 scons-2.3.1/SCons/Executor.py 中出现错误。 env["LINKCOM"]不可以是ada_linkcom签名的函数吗?

【问题讨论】:

    标签: builder ada scons build-system


    【解决方案1】:

    不,不是。您似乎认为 'env["LINKCOM"]' 是实际调用/执行最终构建命令的内容,这并不完全正确。相反,像 LINKCOM 这样的环境变量会被 Executor/Builder 为每个指定的 Action 扩展,然后被执行。

    您可以将 Python 函数用作 Action,也可以使用所谓的“生成器”即时创建您的 Action 字符串。但是你必须把这个Action赋值给一个Builder,不能直接设置为环境变量。

    还请查看用户指南 (http://www.scons.org/doc/production/HTML/scons-user.html),尤其是第 18.4 节“执行 Python 函数的构建器”。我们编写构建器和工具的基本指南也可能会有所帮助:http://www.scons.org/wiki/ToolsForFools

    【讨论】:

    • 那么在这种情况下我必须重写或创建一个新的程序生成器呢?
    • 是的,差不多。我建议您以不同的方式命名您的 Builder,以便您可以在同一环境中同时拥有两者。只要您的构建步骤类似于已经存在的构建器(例如使用 Program 编译简单的 C/CXX 文件),想法就是通过“$CC”等环境变量“参数化”构建器。但是在你的情况下,事情的工作方式太特别了......所以最好通过给 Builder 一个不同的名字来让用户明白这一点。
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多