# CMakeLists.txt의 기본 구조

***

#### 프로젝트 이름과 버전 설정

CMake 프로젝트는 `project()` 명령어를 사용하여 시작된다. 이 명령어는 프로젝트의 이름과 선택적으로 버전을 지정한다. 이 프로젝트 이름은 이후 설정에서 여러 번 참조될 수 있다.

```cmake
project(MyProject VERSION 1.0)
```

여기서 `MyProject`는 프로젝트 이름이며, `1.0`은 버전 번호이다.

#### CMake 최소 요구 버전 지정

CMakeLists.txt 파일의 상단에는 일반적으로 `cmake_minimum_required()` 명령어가 위치한다. 이 명령어는 프로젝트를 빌드하는 데 필요한 CMake의 최소 버전을 지정한다. 이는 CMake의 호환성을 보장하는 데 중요하다.

```cmake
cmake_minimum_required(VERSION 3.10)
```

이 명령어는 CMake 3.10 이상의 버전이 필요함을 의미한다.

#### 실행 파일 또는 라이브러리 생성

CMake는 `add_executable()` 및 `add_library()` 명령어를 사용하여 실행 파일과 라이브러리를 생성할 수 있다. 이러한 명령어는 빌드할 소스 파일들을 지정한다.

```cmake
add_executable(MyExecutable main.cpp)
add_library(MyLibrary STATIC library.cpp)
```

`add_executable()` 명령어는 `main.cpp`를 컴파일하여 `MyExecutable` 실행 파일을 생성한다. `add_library()` 명령어는 `library.cpp`를 사용하여 정적 라이브러리 `MyLibrary`를 생성한다.

#### 타깃 링크 라이브러리 지정

프로그램이 외부 라이브러리를 사용할 경우, `target_link_libraries()` 명령어를 사용하여 이들을 지정할 수 있다. 이 명령어는 실행 파일 또는 라이브러리와 함께 링크할 라이브러리를 지정한다.

```cmake
target_link_libraries(MyExecutable PRIVATE MyLibrary)
```

위의 예에서는 `MyExecutable`이 `MyLibrary`와 링크된다.

#### 타깃 포함 디렉토리 설정

소스 파일이 프로젝트의 다른 디렉토리나 외부 디렉토리에 있는 헤더 파일을 포함해야 할 경우, `target_include_directories()` 명령어를 사용하여 포함 디렉토리를 설정할 수 있다.

```cmake
target_include_directories(MyExecutable PRIVATE include/)
```

이 명령어는 `include/` 디렉토리를 `MyExecutable`의 포함 디렉토리로 설정한다.

#### 컴파일 옵션 설정

`target_compile_options()` 명령어를 사용하여 특정 타깃에 대해 컴파일러 옵션을 설정할 수 있다. 이 명령어는 컴파일 과정에서 추가적인 플래그를 전달하는 데 유용하다.

```cmake
target_compile_options(MyExecutable PRIVATE -Wall -Wextra)
```

위의 예에서는 `MyExecutable`이 컴파일될 때 경고 메시지를 활성화하는 `-Wall` 및 `-Wextra` 플래그가 사용된다.

#### 설치 규칙 지정

프로젝트의 빌드 결과물을 설치하려면 `install()` 명령어를 사용하여 설치 규칙을 지정할 수 있다. 이 명령어는 파일을 특정 디렉토리에 설치할 수 있도록 한다.

```cmake
install(TARGETS MyExecutable DESTINATION bin)
```

이 예에서는 `MyExecutable`이 `bin` 디렉토리에 설치된다.

#### 옵션 설정

`option()` 명령어를 사용하여 사용자가 빌드 시 선택할 수 있는 옵션을 정의할 수 있다. 이 명령어는 프로젝트에서 특정 기능을 켜거나 끌 수 있게 한다.

```cmake
option(ENABLE_TESTS "Enable test build" ON)
```

위의 예에서는 `ENABLE_TESTS`라는 옵션을 정의하며, 기본값은 `ON`이다.

#### 조건부 구성

CMake는 `if()`, `elseif()`, `else()` 명령어를 사용하여 조건부 구성을 지원한다. 이 명령어는 특정 조건에 따라 다른 설정을 적용하는 데 사용된다.

```cmake
if(ENABLE_TESTS)
  add_subdirectory(tests)
endif()
```

이 예에서는 `ENABLE_TESTS` 옵션이 켜져 있을 경우 `tests` 디렉토리를 추가하여 테스트 빌드를 설정한다.

***

관련 자료:

* <https://cmake.org/cmake/help/latest/manual/cmake.1.html>
* <https://cmake.org/cmake/help/latest/command/project.html>
* <https://cmake.org/cmake/help/latest/command/cmake\\_minimum\\_required.html>
* <https://cmake.org/cmake/help/latest/command/add\\_executable.html>
* <https://cmake.org/cmake/help/latest/command/target\\_link\\_libraries.html>
* <https://cmake.org/cmake/help/latest/command/install.html>
* <https://cmake.org/cmake/help/latest/command/option.html>
