2016-08-10 4 views
12

cmake이 실패한 실행 중에 무엇을하는지 조사 할 방법이 있습니까? 예를 들어 libbacktrace에 의존하는 프로그램이 있는데이 라이브러리는 gcc foo.c -lbacktrace에 연결할 수 있습니다. 나는 CMakeLists.txtCMakeLists.txt를 추적하는 방법

처럼
cmake_minimum_required(VERSION 2.8) 
find_library (BACKTRACE_LIBRARY backtrace) 
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY}) 

를 작성하고 cmake <path>를 입력 할 때, 그것은 BACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUND는 출력합니다.

문제의 위치를 ​​파악하려면 어떻게해야합니까? cmake은 libbacktrace 찾기를 포기하기 전에 어떤 명령을 실행합니까? 전혀 실행하지 않습니까? autoconf에서 명령은 모두 config.log에 기록되지만이 경우 CMakeOutput.log은 비어 있습니다. 마찬가지로, cmake --trace은 많은 경우이 시스템에서는 쓸모가없는 의 내용 만 에코합니다.

이 특별한 호출을 find_library으로 만드는 방법을 찾고 있지 않습니다. 이는 그저 예일뿐입니다. 제 질문은 : CMakeLists.txt가 예상대로 작동하지 않습니다. 어디서 그리고 왜 실패했는지 파악하는 데 도움이되는 도구는 무엇입니까?

+0

힌트 : 이러한 종류의 문제에 대해서는 [ "테스트 및 디버그"설명서 항목] (http://stackoverflow.com/documentation/cmake/4098/test-and-debug)을 시작했습니다. – Florian

답변

7

no CMake debugger or similar ¹이 (가) 있습니다. 당신이 할 수있는 것은 :

  1. 때로는 이미 "실종 INCLUDE_MYLIB_DIR")와 같은 힌트를 제공, CMake의 출력을 읽어보십시오. CMakeCache.txt를 삭제하거나 빌드 디렉토리를 제거하여 결과가 캐싱 되었기 때문에 결과를 놓치지 않도록하십시오. 캐싱에 영향이 있었는지 반복하고 확인하십시오. 당신은 -Wdev으로 더 많은 경고 (사용자를위한 것이 아니라 CMake 스크립트의 저자/개발자를위한 것임)를 얻습니다. 더 유용한 옵션은 --warn-uninitialized, --warn-unused-vars--check-system-vars입니다. 자세한 내용은 documentation을 참조하십시오.

  2. CMakeCache.txt 같은 생성 된 파일과 생성하는 추가 파일 (config.h) 또는 Doxygen 용 입력 파일을 확인하십시오. 당신이 기대하는 가치를 가진 변수는 더 많은 연구를위한 지표입니다.

  3. CMakeFiles 하위 디렉터리의 CMakeError.log 및 CMakeOuput.log를 확인하십시오. 불행히도, 많은 테스트는이 파일에 쓰지 않지만 일부는 테스트합니다. 예를 들어, C 컴파일러는 컴파일러 출력을 거기에 넣습니다. 의도하지 않은 플래그 또는 잘못된 (교차) 컴파일러로 문제를 찾는 데 도움이됩니다.

  4. printf으로 디버그하십시오. 즉, 문제가있는 위치를 대략 알고있을 때 message으로 중간 변수를 출력합니다.분기 또는 하위 표현식 (AND 또는 OR이있는 표현식의 일부)이 평가되는 방식을 모를 때 유용합니다. 또한 "mylib 버전이 3.2 이상인 지점에"와 같은 메시지를 내부에 넣을 수 있습니다.

  5. 복잡성을 줄입니다. 문제가 사라질 때까지 모르는 것을 모두 던지십시오. 문제가 다시 나타날 때까지 내용을 다시 추가하십시오. 때로는 최소한의 예제로 문제를 재현하기 위해 새 모듈을 시작하는 것이 더 쉽습니다. 놀랍게도, 이것은 종종 문제를 찾아내는 데 도움이됩니다.

  6. --debug-output (디버그 출력용) --trace (전체 추적) 및 --trace-expand (추적 및 확장 변수)으로 디버그. 이 경우 5 번 항목으로 진행하는 것이 매우 도움이됩니다. 그렇지 않으면 출력이 홍수에 빠질 수 있기 때문입니다.

¹ steveire의 CMake Daemon Tools이 있습니다. 나는 그들 자신을 사용하지 않았지만 그들은 디버거와 꽤 가까운 것처럼 보이는 내성에 대한 가능성을 제공한다고 주장한다.
편집 : 이제 그들은 CMake-server이라고 불리며 CMake 3.7의 일부가 될 것입니다. 많은 도구와 IDE가이를 채택하고 CMake를 개발하는 방식을 향상시킬 것으로 기대할 수 있습니다.

3

--trace (가변 확대 형제 인 --trace-expand) 옆에 --debug-output이 있습니다. 워드 프로세서

: 디버그 모드에서

--debug-output
넣어 cmake.

메시지 추적 (send_error) 호출로 스택 추적과 같이 cmake를 실행하는 동안 추가 정보를 인쇄하십시오.

이렇게하면 원하는 정보를 얻을 수 있습니다. 아마도 --trace과 결합했을 것입니다.

+0

불행하게도,'--trace-expand --debug-output'은'CMakeLists.txt'의 행을보다 다른 방식으로 에코합니다. 이것은'cmake'가 실패한 곳을 알아 내는데 도움이 될 수 있습니다. 그러나 나는 어떤 라인이 실패하고 있는지 이미 알고있는 경우에 더 관심이 있으며,'cmake '가 장면에서 실패 할 때 더 많은 정보를 원한다. –

+0

당신이 할 수있는 유일한 일은'find_library'가하는 일에 대한 지식에 기반하여 수동으로 (CMake가 아닌) 문서화 된대로 경로를 살펴 보는 것입니다. ' -NOTFOUND'은 모두 CMake가 스크립트 내에서 거기에 줄 것입니다. –