CMake는 C++ 프로젝트에서 자주 사용되는 빌드 시스템이다. 빌드 설정에서 중요한 부분 중 하나는 "빌드 타입(build type)"이다. CMakeLists.txt 파일에서 빌드 타입을 설정하는 방법과 그 의미에 대해 알아본다.
빌드 타입의 정의
빌드 타입은 CMake에서 컴파일러의 동작을 결정하는 중요한 변수이다. 보통 컴파일러 최적화 수준과 디버깅 정보의 포함 여부를 조절한다. 대표적인 빌드 타입으로는 Debug
, Release
, RelWithDebInfo
, MinSizeRel
등이 있다. 각각의 빌드 타입은 다음과 같은 특성을 갖는다.
-
Debug: 디버깅을 위해 최적화가 거의 없는 빌드 타입이다.
-g
플래그가 활성화되며, 디버깅 심볼이 포함된다. 프로그램의 실행 속도보다는 디버깅이 용이하도록 구성된다. -
Release: 최적화를 최대화한 빌드 타입이다. 일반적으로
-O3
최적화 플래그가 사용되며, 디버깅 심볼은 포함되지 않는다. 프로그램의 성능을 극대화하는 데 중점을 둔다. -
RelWithDebInfo: 최적화와 디버깅 정보를 동시에 제공하는 빌드 타입이다.
Release
수준의 최적화를 적용하면서도 디버깅 심볼을 포함한다. 배포 후 발생할 수 있는 문제를 추적하는 데 유리한다. -
MinSizeRel: 코드 크기를 최소화하는 빌드 타입이다.
Release
와 비슷하지만, 최적화 플래그가 코드 크기를 줄이는 데 초점을 맞춘다.
CMakeLists.txt에서 빌드 타입 설정
빌드 타입은 CMakeLists.txt 파일 내에서 CMAKE_BUILD_TYPE
변수를 통해 설정할 수 있다. 이 변수를 설정함으로써 CMake는 적절한 컴파일러 플래그를 자동으로 적용한다.
set(CMAKE_BUILD_TYPE Release)
위와 같이 설정하면, 빌드 과정에서 Release
타입의 설정이 사용된다. 만약 사용자가 명령줄에서 특정 빌드 타입을 지정하지 않는다면, 이 값이 기본값으로 사용된다.
CMAKE_BUILD_TYPE 변수의 활용
CMAKE_BUILD_TYPE
변수는 단일 구성 빌드 시스템에서 주로 사용된다. 단일 구성 빌드 시스템이란, 한 번에 하나의 빌드 타입만을 지원하는 시스템을 말한다. 예를 들어, make
나 ninja
와 같은 빌드 도구는 단일 구성 빌드 시스템에 해당한다.
사용자가 명령줄에서 빌드 타입을 지정하려면 다음과 같이 한다.
cmake -DCMAKE_BUILD_TYPE=Debug ..
이 명령은 CMake에게 Debug
빌드 타입을 사용하도록 지시한다. 이 변수는 빌드 설정에서 매우 중요한 역할을 하며, 필요에 따라 빌드 스크립트에서 다른 설정과 함께 조정할 수 있다.
다중 구성 빌드 시스템에서의 빌드 타입
Visual Studio와 같은 다중 구성 빌드 시스템은 여러 빌드 타입을 동시에 관리할 수 있다. 이 경우 CMAKE_BUILD_TYPE
변수는 무시된다. 대신, 사용자는 IDE에서 빌드 타입을 선택하거나 CMake의 --config
플래그를 사용해 특정 빌드 타입을 지정할 수 있다.
cmake --build . --config Release
이 명령은 Visual Studio와 같은 환경에서 Release
빌드 타입을 선택하여 빌드한다.
CMAKE_CONFIGURATION_TYPES 변수
다중 구성 빌드 시스템에서 여러 빌드 타입을 정의할 수 있는 또 다른 변수로 CMAKE_CONFIGURATION_TYPES
가 있다. 이 변수는 어떤 빌드 타입을 사용할 수 있는지를 지정하며, 일반적으로 Debug;Release;MinSizeRel;RelWithDebInfo
로 설정된다.
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;MinSizeRel;RelWithDebInfo" CACHE STRING "" FORCE)
이 설정을 통해 다중 구성 빌드 시스템에서 지원되는 모든 빌드 타입을 명시할 수 있다.
사용자 정의 빌드 타입
CMake에서는 사용자가 원하는 빌드 타입을 정의할 수도 있다. 이를 위해 특정 컴파일러 플래그를 설정하는 CMake 변수를 사용한다.
set(CMAKE_CXX_FLAGS_CUSTOM "-O2 -g -DDEBUG")
set(CMAKE_BUILD_TYPE Custom)
이와 같이 설정하면, Custom
이라는 새로운 빌드 타입을 정의할 수 있다. 이는 특정 요구 사항에 맞게 최적화 및 디버깅 옵션을 조정할 때 유용하다.
관련 자료:
- CMake Documentation: CMAKE_BUILD_TYPE
- CMake Documentation: CMAKE_CONFIGURATION_TYPES
- Effective Modern CMake
- CMake Best Practices