[모던 CMake] 프로젝트 설정 및 옵션 관리

모던 CMake를 활용하여 효율적인 C++ 프로젝트 빌드 시스템을 구축하는 방법을 계속해서 알아보겠습니다. 이번 글에서는 프로젝트 설정 및 옵션 관리에 대해 다루겠습니다. 프로젝트를 개발하다 보면 다양한 설정 옵션이 필요하게 되는데, CMake를 사용하여 이러한 옵션을 효과적으로 관리하고 사용자에게 친화적인 빌드 설정을 제공하는 방법을 살펴보겠습니다.

etc-image-0

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를 사용하여 프로젝트 설정 및 옵션을 관리하는 방법에 대해 알아보았습니다. 사용자 정의 옵션과 캐시 변수를 활용하여 빌드 설정을 유연하게 구성하고, 구성 헤더 파일을 통해 코드에서 설정 값을 사용할 수 있습니다. 또한, 빌드 타입별 설정과 버전 정보를 관리하여 프로젝트의 품질과 유지보수성을 향상시킬 수 있습니다.

반응형