2017-11-08 4 views
0

SCons 용 Sphinx 빌더가 작동하지 않는 이유를 이해하려고합니다. 내가 디버깅 할 코드의 필수적인 부분이 아래로 비등 :SCons : 어떤 작업을 디버깅하는 방법?

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

내가 이론적으로 $SPHINXCOM$SPHINXBUILD $_SPHINXOPTIONS ${SOURCE.attributes.root} ${TARGET.attributes.root}으로 확장해야한다고 알고 있지만, SCons는 결코이 작업을 실행하는 것 없기 때문에, 내가 추적 할 수 없다 무엇을 그것이 실행되어야한다고 생각 했는가.

SCons의 코드를 탐색하는 것은 지옥으로가는 길입니다 ... 수십 개의 위임 및 추측 등으로 완전히 불투명합니다 ... 시도 시간이 지나도 여전히 코드를 찾을 수 없습니다. 이 동작이 평가 될 때 실행되거나 올바른 용어가 무엇이든간에 ... 그러나 어떤 시점에서는 동작의 메서드가 빈 문자열을 반환하기 시작합니다.

옵션을 통해 읽음으로써, 자세한 내용을 표시하거나 이미 인쇄 된 것보다 더 많은 진단 메시지를 인쇄 할 수는 없습니다 (실제로 어쨌든 코드에 어떤 로깅도 없으므로 아무 것도없는 것처럼 보입니다.) 인쇄). 액션을 실행하는 코드를 찾을 수있어서 기쁠 것입니다. 그래서 액션이 어떤 메소드에서 null이 아닌 값을 생성해야하는지 알 수 있습니다 ... 누군가가 나를 가리킬 수 있다면 고맙겠습니다. 그 코드에.


Action 일에 어떤 일이 일어나고 있는지 알려주는 것입니다.

  1. Action

    내 경우 ActionBase 클래스에 작업을 위임 할 것 같다 인자의 종류에 조건이 도우미 메서드를 호출하여 다음과 같이 내 연구 결과는 지금까지입니다.
  2. ActionBase은 인수 유형 (모두 **kw, 즉 익명으로 전달됨)을 검사 한 후 작업을 ActionAction 클래스에 위임하는 것으로 보입니다.
  3. ActionAction 클래스는 이제 이전 검사에서 변경된 인수를 검사하고 CommandAction 클래스를 호출하여 입력을 처리합니다.
  4. CommandAction 이제는 Action으로 위임됩니다.
  5. Action은 이제 인수에서 동일한 기본 정보를 받았지만 다르게 형식이 지정되었습니다. 두 번째 인수가 문자열 인 대신 문자열이 하나 인 dict입니다. _Action-
  6. Action 지금 대표 ...

어딘가에 "조치"개체의 방법은 내가 생성 된 명령을 볼 기대 빈 문자열을 반환 시작하는 점을 중심으로. 코드의 전반적인 구조와 냄새를 감안할 때, 나는이 사악한 위임 계획의 표면을 긁었을뿐입니다. 그러나 나는 모든 것을 내부로 넘기위한 내부 지식이 충분하지 않습니다. "행동"방법은 실제로 액세스되었습니다. 그 일이 어디에서 발생했는지 알았다면 Action에 대한 논증을 구조화 할 수있는 방법을 찾아 낼 수 있었을 것입니다.

+0

사용할 수있는 다양한 "트리"옵션을 올바르게 사용하려면 [SCons의 MAN 페이지] (http://scons.org/doc/production/HTML/scons-man.html)를 확인 했습니까? 액션이 실제로 발생하는지 확인해야합니다. 즉, * SCons *는 타겟이 최신 상태가 아님을 확인합니다. 문제의 조치를 어떻게 실행하려고하는지 보여주는 MWE를 제공 할 수 있습니까? – dirkbaechle

+0

'--tree' 옵션은 유용하지 않습니다. 또한, 나는 이미이 정보를 읽었다 고 언급했습니다 ... 나는 그 예에서 무엇을보고 싶습니까? 내가 뭘 찾고 있는지 알지 못하기 때문에 거기에 글을 써야할지 모르겠다. 내가 아는 전부는 그 코드가해야만하는 것이지만 그것은 그것에 관한 것이다. – wvxvw

+0

SCON을 실행하는 곳과 관련된 스핑크스 작업의 대상은 어디입니까? 현재 디렉토리의 하위 디렉토리에 있습니까? 아니면 다른 디렉토리 트리에 있습니까? – bdbaddog

답변

0

SCons은 "구문 분석"단계와 "빌드"단계의 두 단계로 실행됩니다. 위에 설명 된 호출 추적은 "구문 분석"단계의 것입니다. 이것은 SConstructs가 읽고 소화되는 곳입니다.이 단계에서 SCons은 단순히 "env.PDF("test.ltx")"과 같은 다른 Builder 호출로 어떤 소스 노드와 대상 노드가 필요 (정의 됨)되었는지 추적합니다. 이 예의 "test.pdf"과 같은 대상 노드의 경우 사용할 환경 ("env"여기)도 등록합니다. Builder::_execute에서는 Executor 클래스의 인스턴스가 각 대상에 등록되어 어떤 작성기 동작이 트리거되어야하는지 추적합니다.

그러나 필요한 단일 조치는 즉시 실행되지 않습니다! 이것은 "빌드"단계에서 나중에 발생합니다. 은 대상이 "test.pdf"이 실제로 최신 상태가 아님을 감지하면 발생합니다.

그런 다음 Task::execute (Taskmaster.py에서)이 호출되면 대상 노드의 Node::build() 메소드가 호출됩니다. 거기에 등록 된 Executor가 호출되고 액션은 Executor::execute_action_list()으로 확장됩니다.

비고 : '$SPHINXCOM' 문자열이 현재 환경에 설정된 변수로 대체됨을 고려하십시오. 따라서 Action 생성자에 주어진 인수를 조작 할 필요는 없지만 필요한 출력을 얻기 위해 사용한 환경의 변수를 조작해야합니다.

이 정보가 도움이되기를 바랍니다. ;)

+0

예, Executor.execute_action_list()에 도달 할 때까지 문자열을 렌더링하는 "action"객체의 메소드는 가비지 (빈 문자열)를 생성합니다. 그 사이에 일어난 일과 원래 논쟁이 어떻게 상실되었는지를 이해하는 데에는 시간이 걸립니다 ... 일단 발견하면 업데이트 할 것입니다. – wvxvw

+0

환경의 내용을 "'''Action :: process'''' 다음에 덤프하고,'''Subst :: scons_subst''''에 디버깅을 추가하기 시작하십시오. 아이디어로. – dirkbaechle

관련 문제