# 프로젝트 정의

`CMakeLists.txt` 파일은 CMake에서 프로젝트를 정의하고 구성하는 데 사용되는 주요 구성 파일이다. 이 파일은 프로젝트의 구조, 빌드 설정, 종속성 등을 정의한다. 다음은 `CMakeLists.txt`에서 프로젝트를 정의하는 방법에 대한 자세한 설명이다.

#### 프로젝트 이름 정의

CMake에서 프로젝트를 정의할 때 가장 먼저 해야 할 일은 프로젝트의 이름을 설정하는 것이다. 이는 `project()` 명령어를 통해 이루어진다.

```cmake
project(MyProject)
```

`project()` 명령어는 CMake에게 현재 디렉터리와 하위 디렉터리에서 빌드되는 코드가 하나의 프로젝트에 속함을 알려준다. 이 명령어는 기본적으로 다음의 요소들을 정의한다:

* **프로젝트 이름**: 프로젝트의 고유 이름이다.
* **언어**: 이 프로젝트에서 사용할 프로그래밍 언어를 정의한다. 명시하지 않으면 CMake는 사용된 소스 파일에 따라 자동으로 감지한다.

언어를 명시적으로 설정하고자 한다면 다음과 같이 사용할 수 있다:

```cmake
project(MyProject CXX C)
```

위의 예에서는 C++ (`CXX`)와 C (`C`)를 프로젝트의 언어로 설정 하였다.

#### 프로젝트 버전과 설명

CMake는 프로젝트의 버전과 설명을 추가로 정의할 수 있다. 이는 `project()` 명령어의 옵션으로 제공된다.

```cmake
project(MyProject VERSION 1.0 DESCRIPTION "This is my project")
```

여기서 `VERSION` 옵션은 프로젝트의 버전을 지정하고, `DESCRIPTION` 옵션은 프로젝트에 대한 설명을 추가한다. 이 정보는 다른 CMake 명령어에서 사용될 수 있다.

#### 패키지 관리 및 종속성 설정

CMake는 프로젝트의 종속성을 관리하기 위해 여러 명령어를 제공한다. 가장 일반적으로 사용되는 것은 `find_package()`이다.

```cmake
find_package(SomeLibrary REQUIRED)
```

`find_package()` 명령어는 외부 라이브러리나 패키지를 검색하여 프로젝트에 추가한다. `REQUIRED` 옵션을 사용하면 해당 패키지가 필수임을 나타내며, 찾지 못할 경우 CMake는 오류를 발생시킨다.

또한 `find_package()`는 선택적으로 컴포넌트를 지정할 수도 있다.

```cmake
find_package(SomeLibrary COMPONENTS component1 component2 REQUIRED)
```

이 경우 `component1`과 `component2`가 포함된 `SomeLibrary` 패키지를 찾아야 한다.

#### 빌드 구성 설정

`CMakeLists.txt`는 프로젝트의 빌드 설정을 정의하는 데 사용된다. `add_executable()`과 `add_library()` 명령어가 이에 해당한다.

```cmake
add_executable(MyExecutable main.cpp)
```

이 명령어는 `main.cpp` 파일을 기반으로 `MyExecutable`이라는 실행 파일을 생성한다.

```cmake
add_library(MyLibrary STATIC lib.cpp)
```

이 명령어는 `lib.cpp` 파일을 기반으로 `MyLibrary`라는 정적 라이브러리를 생성한다. 라이브러리는 정적(`STATIC`), 동적(`SHARED`), 또는 모듈(`MODULE`)로 생성될 수 있다.

#### 타겟 설정

CMake에서 타겟(target)은 빌드의 최종 산출물이다. `add_executable()`이나 `add_library()`로 생성된 타겟은 추가 설정이 가능한다. `target_include_directories()`, `target_link_libraries()` 등의 명령어가 사용된다.

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

위의 예에서는 `MyExecutable` 타겟에 대해 `include/` 디렉터리를 포함 디렉터리로 추가하고, `MyLibrary`를 링크 라이브러리로 추가 하였다.

#### 사용자 정의 옵션 및 설정

CMake는 `option()` 명령어를 사용하여 사용자 정의 옵션을 만들 수 있다. 이는 프로젝트 빌드 시 사용자가 특정 기능을 활성화하거나 비활성화할 수 있도록 한다.

```cmake
option(ENABLE_FEATURE "Enable this feature" ON)
```

이 명령어는 `ENABLE_FEATURE`라는 옵션을 생성하며, 기본값은 `ON`이다. 이 옵션의 값은 사용자가 빌드 시에 변경할 수 있다.

***

관련 자료:

* CMake 공식 문서: <https://cmake.org/documentation/>
* CMake Tutorial: <https://cmake.org/cmake/help/latest/guide/tutorial/index.html>
