我正在与最后的逻辑片段作斗争,以使我们的Ada构建器与variantdir一样工作。这个问题是由于不灵活的工具gnatbind
和gnatlink
不允许将绑定文件放在当前目录以外的目录中造成的。这给我留下了两个选择:
- 让gnatbind写入绑定文件到topdir,然后让gnatlink从那里挑选它。然而,如果我们想要允许不同架构和编译器版本的同时构建,这可能会导致竞争条件。
-
修改对gnatbind和gnatlink的调用,使其暂时转到构建目录,在我们的示例中是
修改了Program envbuild/$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中做什么。我需要这是一个函数,它包含一些复杂的逻辑转换路径从相对于顶级到只包含他们的基本名称。
然而,这在函数do_execute
的第347行scons-2.3.1/SCons/Executor.py
中出现错误而失败。env["LINKCOM"]
不允许是ada_linkcom的签名函数吗?
不,它不是。你似乎认为'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