2

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

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

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

其中ada_linkcom定义为

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

whereret是一个字符串,描述应该在 shell 中做什么。我需要这是一个函数,它包含一些复杂的逻辑来将路径从相对于顶级转换为只包含它们的基本名称。

然而,这scons-2.3.1/SCons/Executor.py在 function 的第 347 行失败并出现错误do_execute。不允许env["LINKCOM"]是带有ada_linkcom签名的函数吗?

4

1 回答 1

2

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

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

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

于 2014-05-20T16:48:39.317 回答