CMake는 복잡한 빌드 시스템을 관리하는 강력한 도구로, 다양한 디버깅 및 로그 기능을 제공하여 빌드 과정을 분석하고 문제를 해결하는 데 도움을 준다. 이 섹션에서는 CMake에서 디버깅을 수행하는 방법과 로그를 효과적으로 활용하는 방법에 대해 설명한다.
CMake에서의 디버깅 방법
메시지 출력
CMake에서 디버깅의 첫 번째 단계는 message()
명령어를 사용하는 것이다. 이 명령어를 사용하면 CMakeLists.txt 파일 내에서 중요한 정보를 출력할 수 있다. message()
명령어는 다양한 로그 레벨을 지원하며, 이를 통해 빌드 과정에서 발생하는 문제를 추적할 수 있다.
message(STATUS "현재 단계: ${VARIABLE_NAME}")
: 상태 메시지를 출력한다.message(WARNING "경고: 일부 설정이 누락되었다.")
: 경고 메시지를 출력한다.message(FATAL_ERROR "오류: 필수 파일이 누락되었다.")
: 치명적인 오류 메시지를 출력하고, CMake의 실행을 중단한다.
이 명령어를 사용하면 변수의 값, 조건문의 실행 경로, 외부 패키지의 로드 상태 등을 확인할 수 있어 디버깅에 매우 유용하다.
CMake 디버그 모드
CMake는 자체적으로 디버그 모드를 지원하지 않지만, 빌드 도구나 IDE에서 제공하는 디버그 기능을 활용할 수 있다. 예를 들어, GNU Make와 같은 빌드 도구에서는 make VERBOSE=1
명령을 사용하여 빌드 과정에서 실행되는 명령어를 상세히 출력할 수 있다. CMake 자체의 문제를 디버깅할 때는 --trace
및 --trace-expand
옵션을 사용할 수 있다.
cmake --trace .
: CMakeLists.txt의 모든 명령어를 추적하여 출력한다.cmake --trace-expand .
: 변수 확장을 포함한 모든 명령어를 추적하여 출력한다.
이러한 추적 기능은 복잡한 CMake 설정에서 문제가 발생할 때 원인을 파악하는 데 큰 도움이 된다.
변수 검사와 조건문 디버깅
CMake에서는 set()
명령어로 변수를 설정하고, if()
, elseif()
, else()
, endif()
명령어로 조건문을 작성한다. 이 과정에서 발생할 수 있는 문제를 디버깅하기 위해, 변수의 값을 검사하거나 조건문이 어떻게 평가되는지 확인할 필요가 있다.
예를 들어, 특정 조건이 제대로 작동하지 않는 경우, 조건문 앞에 message()
명령어를 삽입하여 조건문의 평가 결과를 출력할 수 있다.
if(${MY_VARIABLE} STREQUAL "expected_value")
message(STATUS "MY_VARIABLE이 expected_value와 일치한다.")
else()
message(STATUS "MY_VARIABLE이 expected_value와 일치하지 않는다.")
endif()
이렇게 하면 조건이 제대로 작동하는지 여부를 쉽게 확인할 수 있다.
로그 파일 생성 및 관리
로그 파일 출력
CMake는 표준 출력 외에도 로그 파일을 생성하여 빌드 과정에서 발생한 메시지를 기록할 수 있다. 이를 위해 file()
명령어를 사용하여 로그 파일을 열고, message()
명령어를 사용해 로그 파일에 메시지를 쓸 수 있다.
file(WRITE "${CMAKE_BINARY_DIR}/build.log" "빌드 시작\n")
message(STATUS "빌드가 시작되었다.")
file(APPEND "${CMAKE_BINARY_DIR}/build.log" "빌드가 진행 중...\n")
이렇게 하면 빌드 과정에서 발생한 메시지를 로그 파일에 기록할 수 있으며, 이후에 이를 분석하여 문제를 해결할 수 있다.
디버그 출력 옵션
CMake의 디버그 출력을 보다 상세히 관리하려면, 특정 빌드 옵션을 사용하여 디버그 정보를 출력할 수 있다. 예를 들어, CMake의 캐시 정보를 출력하려면 cmake --debug-output
옵션을 사용할 수 있다. 이 옵션은 CMake의 변수와 설정이 어떻게 캐시에 저장되고 있는지 보여준다.
또한, --warn-uninitialized
옵션을 사용하면 초기화되지 않은 변수에 대한 경고를 출력할 수 있으며, --warn-unused-vars
옵션을 사용하면 사용되지 않은 변수에 대한 경고를 출력할 수 있다. 이러한 옵션은 디버깅 과정에서 유용한 정보를 제공하여 문제를 조기에 발견하는 데 도움이 된다.
관련 자료:
- Kitware Inc., CMake Documentation, https://cmake.org/cmake/help/latest/
- Martin, R., Mastering CMake, Kitware, Inc., 2010.
- Saxer, A., Professional CMake: A Practical Guide, Leanpub, 2020.