CMake의 빌드 타입 이해
CMake는 다양한 빌드 타입을 지원하여 개발자들이 원하는 방식으로 소프트웨어를 빌드할 수 있도록 한다. 기본적으로 CMake는 Debug
, Release
, RelWithDebInfo
, MinSizeRel
네 가지 표준 빌드 타입을 제공한다. 각 빌드 타입은 서로 다른 최적화 수준과 디버깅 정보 포함 여부에 따라 구분된다.
- Debug: 디버깅을 위해 사용되며, 최적화를 최소화하고 디버깅 정보를 포함한다.
- Release: 최적화를 극대화하며, 디버깅 정보는 포함하지 않는다.
- RelWithDebInfo: 최적화를 유지하면서 디버깅 정보를 포함한다. 일반적으로 개발 단계에서 많이 사용된다.
- MinSizeRel: 바이너리 크기를 최소화하는 것을 목표로 하며, 일부 최적화를 수행한다.
CMakeLists.txt에서 빌드 타입 설정 방법
CMakeLists.txt 파일에서 특정 빌드 타입을 설정하는 방법은 여러 가지가 있다. 이를 통해 빌드 시 자동으로 선택되거나, 개발자가 명시적으로 빌드 타입을 지정할 수 있다.
기본 빌드 타입 설정
CMake 프로젝트에서 기본 빌드 타입을 설정하는 방법은 CMAKE_BUILD_TYPE
변수를 설정하는 것이다. 이는 빌드 명령어에서 빌드 타입을 명시하지 않았을 때 사용된다.
set(CMAKE_BUILD_TYPE Release)
이 설정을 통해 개발자가 명시적으로 빌드 타입을 지정하지 않으면 Release
빌드 타입이 사용된다.
빌드 타입에 따른 컴파일러 설정
빌드 타입에 따라 다른 컴파일러 옵션을 설정할 수 있다. 이를 위해 CMAKE_CXX_FLAGS_<CONFIG>
변수를 사용한다.
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os")
위 예제는 각각의 빌드 타입에 대해 C++ 컴파일러 플래그를 설정하는 방법을 보여준다.
타겟별 빌드 타입 설정
특정 타겟에 대해 빌드 타입별로 설정을 적용할 수 있다. 이를 통해 프로젝트 내 특정 타겟에 대해 개별적인 빌드 설정을 할 수 있다.
add_executable(my_target main.cpp)
set_target_properties(my_target PROPERTIES
COMPILE_FLAGS "$<$<CONFIG:DEBUG>:-g>"
LINK_FLAGS "$<$<CONFIG:RELEASE>:-s>"
)
위 코드에서 my_target
타겟은 Debug
빌드 타입에서 -g
플래그를 사용하고, Release
빌드 타입에서는 -s
플래그를 사용하도록 설정된다.
사용자 정의 빌드 타입 추가
CMake는 기본적으로 제공하는 빌드 타입 외에도 사용자 정의 빌드 타입을 추가할 수 있다. 이는 프로젝트의 특성에 맞는 빌드 구성을 가능하게 한다.
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRel;CustomType" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_CUSTOMTYPE "-O2 -funroll-loops")
위 예제에서는 CustomType
이라는 새로운 빌드 타입을 정의하고, 그에 따른 C++ 플래그를 설정 하였다.
빌드 타입에 따른 설치 경로 설정
빌드 타입에 따라 설치 경로를 다르게 설정할 수 있다. 이를 통해 빌드 아티팩트를 구분하여 관리할 수 있다.
install(TARGETS my_target
RUNTIME DESTINATION bin/$<CONFIG>
)
위 코드에서는 빌드 타입에 따라 실행 파일이 bin/Debug
, bin/Release
등으로 설치된다.
CMakeLists.txt에서 빌드 타입 선택 팁
CMAKE_BUILD_TYPE
변수를 사용하여 기본 빌드 타입을 명시적으로 설정하라.- 빌드 타입별로 컴파일러 플래그를 세밀하게 조정하라.
- 프로젝트 내 특정 타겟에 대해 빌드 타입별 설정을 적용하여 유연한 빌드 구성을 유지하라.
- 필요에 따라 사용자 정의 빌드 타입을 추가하여 프로젝트의 요구사항을 반영하라.
- 설치 경로를 빌드 타입에 따라 다르게 설정하여 빌드 아티팩트를 관리하라.
관련 자료: - CMake Documentation - Modern CMake Practices