尝试使SCons Ada Builder与VariantDir一起使用

时间:2014-05-20 13:49:41

标签: builder ada scons build-system

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

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

    修改了程序环境

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

其中ada_linkcom定义为

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

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

然而,这在函数scons-2.3.1/SCons/Executor.py的第347行的do_execute中出错。 Isn&#t; t env["LINKCOM"]是否可以使用ada_linkcom的签名功能?

1 个答案:

答案 0 :(得分:2)

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

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

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