모던 CMake를 활용하여 효율적인 C++ 프로젝트 빌드 시스템을 구축하는 방법을 계속해서 알아보겠습니다. 이번 글에서는 프로젝트 설정 및 옵션 관리에 대해 다루겠습니다. 프로젝트를 개발하다 보면 다양한 설정 옵션이 필요하게 되는데, CMake를 사용하여 이러한 옵션을 효과적으로 관리하고 사용자에게 친화적인 빌드 설정을 제공하는 방법을 살펴보겠습니다.
CMake 옵션 정의하기
CMake에서는 option() 명령어를 사용하여 사용자 정의 옵션을 생성할 수 있습니다. 이를 통해 사용자는 빌드 시 원하는 기능을 선택적으로 활성화하거나 비활성화할 수 있습니다.
옵션 생성 예제
option(ENABLE_FEATURE_X "Enable Feature X" OFF)
- ENABLE_FEATURE_X: 옵션의 이름입니다.
- "Enable Feature X": 옵션에 대한 설명입니다.
- OFF: 기본값입니다. (ON 또는 OFF)
조건부 컴파일 설정
옵션을 정의한 후, 해당 옵션의 값에 따라 빌드 설정을 조정할 수 있습니다.
예제: 옵션에 따른 매크로 정의
if(ENABLE_FEATURE_X)
target_compile_definitions(MyApp PRIVATE FEATURE_X_ENABLED)
endif()
- **ENABLE_FEATURE_X**가 ON이면 FEATURE_X_ENABLED 매크로를 정의합니다.
- 이를 통해 소스 코드에서 #ifdef FEATURE_X_ENABLED와 같은 조건부 컴파일이 가능합니다.
구성 헤더 파일 생성
프로젝트의 설정 값을 헤더 파일로 생성하여 코드에서 사용할 수 있도록 합니다.
configure_file() 사용
configure_file(
${CMAKE_SOURCE_DIR}/config.h.in
${CMAKE_BINARY_DIR}/config.h
)
target_include_directories(MyApp PRIVATE ${CMAKE_BINARY_DIR})
- config.h.in: 설정 파일의 템플릿입니다.
- config.h: 설정 값이 적용된 실제 헤더 파일입니다.
config.h.in 예제
/* config.h.in */
#pragma once
#cmakedefine ENABLE_FEATURE_X
#cmakedefine ENABLE_FEATURE_Y
- #cmakedefine을 사용하여 CMake 옵션에 따라 매크로를 정의합니다.
빌드 타입별 설정
CMake는 기본적으로 Debug, Release, RelWithDebInfo, MinSizeRel 등의 빌드 타입을 제공합니다. 빌드 타입에 따라 다른 설정을 적용할 수 있습니다.
빌드 타입 확인
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
빌드 타입별 컴파일 옵션 설정
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_options(MyApp PRIVATE -O0 -g)
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
target_compile_options(MyApp PRIVATE -O3)
endif()
- 빌드 타입에 따라 최적화 옵션이나 디버그 정보를 설정합니다.
사용자 정의 빌드 타입 추가
프로젝트에 필요한 경우 사용자 정의 빌드 타입을 추가할 수 있습니다.
사용자 정의 빌드 타입 설정
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Testing" CACHE STRING "" FORCE)
- Testing 빌드 타입을 추가합니다.
빌드 타입별 설정 적용
if(CMAKE_BUILD_TYPE STREQUAL "Testing")
target_compile_definitions(MyApp PRIVATE ENABLE_TESTING_MODE)
endif()
캐시 변수 사용
CMake에서는 set() 명령어에 CACHE 옵션을 사용하여 변수 값을 캐시에 저장하고, 이후 CMake 실행 시에도 해당 값을 유지할 수 있습니다.
캐시 변수 설정
set(MY_VARIABLE "DefaultValue" CACHE STRING "Description of MY_VARIABLE")
- MY_VARIABLE: 변수의 이름입니다.
- "DefaultValue": 변수의 기본값입니다.
- STRING: 변수의 유형입니다.
- "Description of MY_VARIABLE": 변수에 대한 설명입니다.
캐시 변수 활용
message(STATUS "MY_VARIABLE: ${MY_VARIABLE}")
- 캐시 변수는 -D 옵션을 통해 커맨드 라인에서 설정할 수 있습니다.
cmake -B build -S . -DMY_VARIABLE=NewValue
프로젝트 버전 관리
프로젝트의 버전 정보를 CMake 설정에 포함하여 코드나 패키징에 활용할 수 있습니다.
project() 명령어에 버전 정보 추가
project(MyProject VERSION 1.2.3)
버전 정보 사용
# 메이저 버전
set(MYPROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
# 마이너 버전
set(MYPROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR})
# 패치 버전
set(MYPROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH})
버전 정보를 헤더 파일로 생성
configure_file(
${CMAKE_SOURCE_DIR}/version.h.in
${CMAKE_BINARY_DIR}/version.h
)
target_include_directories(MyApp PRIVATE ${CMAKE_BINARY_DIR})
version.h.in 예제
/* version.h.in */
#pragma once
#define MYPROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define MYPROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define MYPROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
- @PROJECT_VERSION_MAJOR@ 등의 변수는 CMake에 의해 실제 값으로 대체됩니다.
빌드 옵션 문서화
프로젝트의 빌드 옵션을 사용자에게 알기 쉽게 문서화하는 것이 중요합니다.
CMakeLists.txt에 주석 추가
# 옵션: ENABLE_FEATURE_X
# 설명: Feature X를 활성화합니다. 기본값은 OFF입니다.
option(ENABLE_FEATURE_X "Enable Feature X" OFF)
README 또는 INSTALL 파일에 빌드 옵션 설명 추가
## 빌드 옵션
- `ENABLE_FEATURE_X`: Feature X를 활성화합니다. 사용하려면 CMake 실행 시 `-DENABLE_FEATURE_X=ON` 옵션을 추가하세요.
- `MY_VARIABLE`: 특정 기능의 값을 설정합니다. 기본값은 `DefaultValue`이며, `-DMY_VARIABLE=NewValue`로 변경할 수 있습니다.
GUI를 통한 옵션 설정
CMake는 GUI를 제공하여 사용자들이 옵션을 쉽게 설정할 수 있도록 합니다.
CMake GUI 사용
- Windows: cmake-gui 프로그램을 실행하여 소스 및 빌드 디렉토리를 지정하고 옵션을 설정합니다.
- 터미널에서 Curses 인터페이스 사용:
cmake -B build -S .
cd build
ccmake .
- 옵션을 설정한 후 c를 눌러 설정을 적용하고, g를 눌러 빌드 파일을 생성합니다.
예제 프로젝트 적용
CMakeLists.txt 업데이트
cmake_minimum_required(VERSION 3.15)
project(MyProject VERSION 1.0.0)
# 옵션 정의
option(ENABLE_FEATURE_X "Enable Feature X" OFF)
option(USE_CUSTOM_LIBRARY "Use Custom Library instead of the default one" OFF)
# 캐시 변수 설정
set(MY_VARIABLE "DefaultValue" CACHE STRING "Description of MY_VARIABLE")
# 구성 헤더 파일 생성
configure_file(
${CMAKE_SOURCE_DIR}/config.h.in
${CMAKE_BINARY_DIR}/config.h
)
add_executable(MyApp src/main.cpp)
target_include_directories(MyApp PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_BINARY_DIR}
)
if(ENABLE_FEATURE_X)
target_compile_definitions(MyApp PRIVATE FEATURE_X_ENABLED)
endif()
# 설치 설정 등...
config.h.in 업데이트
/* config.h.in */
#pragma once
#cmakedefine ENABLE_FEATURE_X
#cmakedefine USE_CUSTOM_LIBRARY
#define MY_VARIABLE "@MY_VARIABLE@"
결론
이번 글에서는 CMake를 사용하여 프로젝트 설정 및 옵션을 관리하는 방법에 대해 알아보았습니다. 사용자 정의 옵션과 캐시 변수를 활용하여 빌드 설정을 유연하게 구성하고, 구성 헤더 파일을 통해 코드에서 설정 값을 사용할 수 있습니다. 또한, 빌드 타입별 설정과 버전 정보를 관리하여 프로젝트의 품질과 유지보수성을 향상시킬 수 있습니다.
'개발 이야기 > CMake' 카테고리의 다른 글
[모던 CMake] 대규모 프로젝트에서의 베스트 프랙티스 (0) | 2024.12.07 |
---|---|
[모던 CMake] 코드 분석 도구와 포매터 통합 (2) | 2024.12.06 |
[모던 CMake] 크로스 컴파일과 툴체인 파일 활용 (0) | 2024.12.04 |
[모던 CMake] 생성기 표현식과 커스텀 명령어 활용 (0) | 2024.12.03 |
[모던 CMake] 테스트 설정과 CI/CD 파이프라인 연동 (31) | 2024.12.02 |