我试图理解为什么SCons的Sphinx
构建器不起作用。我想要调试的代码的基本部分归结为:
SCons.Action.Action('$SPHINXCOM', '$SPHINXCOMSTR')
我知道理论上,$SPHINXCOM
应该扩展到$SPHINXBUILD $_SPHINXOPTIONS ${SOURCE.attributes.root} ${TARGET.attributes.root}
,但由于SCons似乎永远不会执行此操作,因此我无法追踪它应该运行的内容。
尝试浏览SCons自己的代码是一条通向地狱的道路......它完全不透明,有数十个代表团和猜测等等......经过几个小时的尝试,我仍然找不到应该运行的代码当评估这个动作时,或者正确的术语是什么......但是在某些时候动作的方法开始返回空字符串,此时它似乎停止了。
通过阅读--help
选项,我看不到任何会增加冗长或打印任何诊断消息的内容,而不是已打印的内容(无论如何都没有任何记录,所以似乎无论如何都无需打印)。我很乐意找到执行该操作的代码,以便我知道该操作必须在其方法中生成任何非null值...如果有人能指出我,我将不胜感激那段代码。
只是为了让您了解这个Action
的内容。到目前为止我的发现如下:
Action
调用两个以参数类型为条件的辅助方法,在我的例子中,似乎将工作委托给ActionBase
类。ActionBase
,在检查参数类型(所有这些都通过**kw
,即匿名传递)后,似乎将工作委托给ActionAction
类。ActionAction
类检查参数,这些参数现在已经被先前的检查所改变,并调用CommandAction
类来处理输入。CommandAction
现在再次委托Action
。Action
现在在参数中收到相同的基本信息,但格式不同:第二个参数不是字符串,而是一个带有单个键的字典。Action
现在委托给_Action
... 在这一点上,“action”对象的方法开始返回空字符串,我希望看到生成的命令。考虑到代码的整体结构和气味,我认为我只是触及了这种狡猾的授权方案的表面,但是我没有足够的内部知识将所有这些都切入到这个地方,其中“行动”方法确实是访问。如果我知道发生了什么,我就能找到一种方法来构造Action
的参数,使它们能够将它组合成一个部分。
答案 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
构造函数的参数,而是使用环境中的变量来获取所需的输出。
我希望这会对你有所帮助。 ;)