SCons:如何调试什么操作?

时间:2017-11-08 16:45:04

标签: python scons

我试图理解为什么SCons的Sphinx构建器不起作用。我想要调试的代码的基本部分归结为:

SCons.Action.Action('$SPHINXCOM', '$SPHINXCOMSTR')

我知道理论上,$SPHINXCOM应该扩展到$SPHINXBUILD $_SPHINXOPTIONS ${SOURCE.attributes.root} ${TARGET.attributes.root},但由于SCons似乎永远不会执行此操作,因此我无法追踪它应该运行的内容。

尝试浏览SCons自己的代码是一条通向地狱的道路......它完全不透明,有数十个代表团和猜测等等......经过几个小时的尝试,我仍然找不到应该运行的代码当评估这个动作时,或者正确的术语是什么......但是在某些时候动作的方法开始返回空字符串,此时它似乎停止了。

通过阅读--help选项,我看不到任何会增加冗长或打印任何诊断消息的内容,而不是已打印的内容(无论如何都没有任何记录,所以似乎无论如何都无需打印)。我很乐意找到执行该操作的代码,以便我知道该操作必须在其方法中生成任何非null值...如果有人能指出我,我将不胜感激那段代码。

只是为了让您了解这个Action的内容。到目前为止我的发现如下:

  1. Action调用两个以参数类型为条件的辅助方法,在我的例子中,似乎将工作委托给ActionBase类。
  2. ActionBase,在检查参数类型(所有这些都通过**kw,即匿名传递)后,似乎将工作委托给ActionAction类。
  3. 然后
  4. ActionAction类检查参数,这些参数现在已经被先前的检查所改变,并调用CommandAction类来处理输入。
  5. CommandAction现在再次委托Action
  6. Action现在在参数中收到相同的基本信息,但格式不同:第二个参数不是字符串,而是一个带有单个键的字典。
  7. Action现在委托给_Action ...
  8. 在这一点上,“action”对象的方法开始返回空字符串,我希望看到生成的命令。考虑到代码的整体结构和气味,我认为我只是触及了这种狡猾的授权方案的表面,但是我没有足够的内部知识将所有这些都切入到这个地方,其中“行动”方法确实是访问。如果我知道发生了什么,我就能找到一种方法来构造Action的参数,使它们能够将它组合成一个部分。

1 个答案:

答案 0 :(得分:0)

请注意, SCons 分两个阶段运行:"解析"阶段,和#34;构建"相。您在上面描述的呼叫追踪来自"解析"相。这是SConstructs被读取和消化的地方。在此阶段, SCons 只是跟踪不同的构建器调用(" env.PDF("test.ltx")")需要(获取定义)哪些源节点和目标节点。对于目标节点,例如" test.pdf"在这个例子中,它还注册了要使用的环境(" env" here)。在Builder::_execute中,类Executor的实例将在每个目标中注册,并跟踪必须触发哪些Builder操作。

但它并没有马上执行所需的单一操作!这只会在以后的#34; build"阶段,当 SCons 检测到目标" test.pdf"确实不是最新的。

然后,调用Task::execute(在Taskmaster.py中),调用目标节点的Node::build()方法。在那里调用已注册的Executor并在Executor::execute_action_list()中扩展Actions。

备注:考虑到字符串'$SPHINXCOM'被替换为当前环境设置的变量。因此,您不必操纵赋予Action构造函数的参数,而是使用环境中的变量来获取所需的输出。

我希望这会对你有所帮助。 ;)