# 타겟 생성

CMake는 프로젝트를 빌드하기 위해 사용되는 강력한 도구이다. 타겟(Target)은 CMake에서 중요한 개념으로, 빌드할 수 있는 실행 파일, 라이브러리 또는 커스텀 명령어 등을 의미한다. 타겟을 생성하고 관리하는 방법은 CMakeLists.txt 파일에서 중요한 부분을 차지한다.

#### 타겟의 기본 개념

CMake에서 타겟은 프로젝트 빌드의 핵심 요소이다. 타겟은 실행 파일, 정적 라이브러리, 동적 라이브러리 등 다양한 형태로 존재할 수 있다. 각 타겟은 독립적으로 빌드되며, 소스 파일 및 의존성을 포함한다.

#### 타겟 생성 명령어

타겟을 생성하기 위해 CMake는 `add_executable()`과 `add_library()` 같은 명령어를 제공한다.

* **add\_executable(target\_name source1 source2 ...)**: 실행 파일 타겟을 생성한다. `target_name`은 타겟의 이름이며, 뒤따르는 소스 파일 리스트는 이 타겟에 포함될 파일들이다.

  ```cmake
  add_executable(MyApp main.cpp utils.cpp)
  ```

  이 명령어는 `MyApp`이라는 이름의 실행 파일을 생성한다.
* **add\_library(target\_name \[STATIC | SHARED | MODULE] source1 source2 ...)**: 라이브러리 타겟을 생성한다. 라이브러리는 정적(`STATIC`), 동적(`SHARED`), 모듈(`MODULE`)로 구분된다.

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

  위의 예에서는 `MyLib`이라는 이름의 정적 라이브러리를 생성한다.

#### 타겟 속성 설정

타겟이 생성된 후, 타겟에 여러 가지 속성을 설정할 수 있다. 이는 타겟의 동작을 제어하거나, 추가적인 설정을 적용하는 데 사용된다.

* **target\_include\_directories(target\_name PUBLIC|PRIVATE|INTERFACE dirs...)**: 타겟의 포함 디렉토리를 설정한다. `PUBLIC`, `PRIVATE`, `INTERFACE` 키워드는 이 포함 디렉토리가 타겟 자신과 타겟을 의존하는 타겟에 어떻게 적용될지를 결정한다.

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

  위의 예에서는 `MyApp` 타겟에 대해 `include/` 디렉토리를 포함 경로로 추가한다.
* **target\_link\_libraries(target\_name PUBLIC|PRIVATE|INTERFACE libraries...)**: 타겟에 연결할 라이브러리를 지정한다. 이 명령어는 타겟이 다른 라이브러리와의 의존성을 가지도록 설정한다.

  ```cmake
  target_link_libraries(MyApp PRIVATE MyLib)
  ```

  이 명령어는 `MyApp` 타겟이 `MyLib` 라이브러리를 링크하도록 설정한다.

#### 타겟 속성의 접근과 수정

CMake에서는 타겟의 다양한 속성을 확인하고 수정할 수 있는 명령어들을 제공한다.

* **set\_target\_properties(target\_name PROPERTIES prop1 value1 prop2 value2 ...)**: 타겟의 속성을 설정한다.

  ```cmake
  set_target_properties(MyApp PROPERTIES CXX_STANDARD 17)
  ```

  위의 예에서는 `MyApp` 타겟이 C++17 표준을 사용하도록 설정한다.
* **get\_target\_property(var target\_name property)**: 타겟의 속성을 가져와서 변수에 저장한다.

  ```cmake
  get_target_property(OutputName MyApp OUTPUT_NAME)
  ```

  이 명령어는 `MyApp` 타겟의 `OUTPUT_NAME` 속성을 `OutputName` 변수에 저장한다.

#### 의존성 관리

타겟 간의 의존성을 관리하는 것은 매우 중요하다. CMake는 이를 자동화할 수 있는 여러 도구를 제공한다.

* **add\_dependencies(target\_name depend\_target1 depend\_target2 ...)**: 타겟 간의 빌드 순서를 설정한다. 특정 타겟이 다른 타겟들에 의존해야 하는 경우 사용한다.

  ```cmake
  add_dependencies(MyApp MyLib)
  ```

  위의 예에서는 `MyApp` 타겟이 `MyLib` 타겟에 의존성을 가지며, `MyLib`이 먼저 빌드되어야 함을 의미한다.

#### 타겟 설치

타겟을 생성한 후, CMake를 통해 설치할 수도 있다.

* **install(TARGETS target\_name DESTINATION**

  **)**: 타겟을 지정된 디렉토리에 설치한다.

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

  이 명령어는 `MyApp` 실행 파일을 `bin` 디렉토리에 설치한다.

***

관련 자료:

* [CMake Documentation](https://cmake.org/cmake/help/latest/)
* [CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/index.html)
* [CMake Best Practices](https://cliutils.gitlab.io/modern-cmake/)
