我正在与最后的逻辑部分进行斗争,以使我们的Ada构建器与variantdir一起正常工作。问题是由于不灵活的工具gnatbind
和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的签名功能?
答案 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