# 빌드 타입 설정

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는 적절한 컴파일러 플래그를 자동으로 적용한다.

```cmake
set(CMAKE_BUILD_TYPE Release)
```

위와 같이 설정하면, 빌드 과정에서 `Release` 타입의 설정이 사용된다. 만약 사용자가 명령줄에서 특정 빌드 타입을 지정하지 않는다면, 이 값이 기본값으로 사용된다.

#### CMAKE\_BUILD\_TYPE 변수의 활용

`CMAKE_BUILD_TYPE` 변수는 단일 구성 빌드 시스템에서 주로 사용된다. 단일 구성 빌드 시스템이란, 한 번에 하나의 빌드 타입만을 지원하는 시스템을 말한다. 예를 들어, `make`나 `ninja`와 같은 빌드 도구는 단일 구성 빌드 시스템에 해당한다.

사용자가 명령줄에서 빌드 타입을 지정하려면 다음과 같이 한다.

```bash
cmake -DCMAKE_BUILD_TYPE=Debug ..
```

이 명령은 CMake에게 `Debug` 빌드 타입을 사용하도록 지시한다. 이 변수는 빌드 설정에서 매우 중요한 역할을 하며, 필요에 따라 빌드 스크립트에서 다른 설정과 함께 조정할 수 있다.

#### 다중 구성 빌드 시스템에서의 빌드 타입

Visual Studio와 같은 다중 구성 빌드 시스템은 여러 빌드 타입을 동시에 관리할 수 있다. 이 경우 `CMAKE_BUILD_TYPE` 변수는 무시된다. 대신, 사용자는 IDE에서 빌드 타입을 선택하거나 CMake의 `--config` 플래그를 사용해 특정 빌드 타입을 지정할 수 있다.

```bash
cmake --build . --config Release
```

이 명령은 Visual Studio와 같은 환경에서 `Release` 빌드 타입을 선택하여 빌드한다.

#### CMAKE\_CONFIGURATION\_TYPES 변수

다중 구성 빌드 시스템에서 여러 빌드 타입을 정의할 수 있는 또 다른 변수로 `CMAKE_CONFIGURATION_TYPES`가 있다. 이 변수는 어떤 빌드 타입을 사용할 수 있는지를 지정하며, 일반적으로 `Debug;Release;MinSizeRel;RelWithDebInfo`로 설정된다.

```cmake
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;MinSizeRel;RelWithDebInfo" CACHE STRING "" FORCE)
```

이 설정을 통해 다중 구성 빌드 시스템에서 지원되는 모든 빌드 타입을 명시할 수 있다.

#### 사용자 정의 빌드 타입

CMake에서는 사용자가 원하는 빌드 타입을 정의할 수도 있다. 이를 위해 특정 컴파일러 플래그를 설정하는 CMake 변수를 사용한다.

```cmake
set(CMAKE_CXX_FLAGS_CUSTOM "-O2 -g -DDEBUG")
set(CMAKE_BUILD_TYPE Custom)
```

이와 같이 설정하면, `Custom`이라는 새로운 빌드 타입을 정의할 수 있다. 이는 특정 요구 사항에 맞게 최적화 및 디버깅 옵션을 조정할 때 유용하다.

***

관련 자료:

* [CMake Documentation: CMAKE\_BUILD\_TYPE](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html)
* [CMake Documentation: CMAKE\_CONFIGURATION\_TYPES](https://cmake.org/cmake/help/latest/variable/CMAKE_CONFIGURATION_TYPES.html)
* [Effective Modern CMake](https://cliutils.gitlab.io/modern-cmake/)
* [CMake Best Practices](https://vector-of-bool.github.io/2020/04/11/cmake-vs-ide.html)
