# 타겟 속성 설정

#### 타겟 속성의 개념

CMake에서 타겟(target)은 빌드 시스템이 생성하는 기본적인 개체이다. 타겟은 보통 실행 파일, 라이브러리, 또는 유틸리티가 될 수 있다. CMake는 이러한 타겟에 대해 다양한 속성을 설정할 수 있는 기능을 제공한다. 이 속성들은 타겟의 컴파일, 링크, 설치 등에 관련된 세부 사항을 제어하는 데 사용된다. 이러한 속성을 효과적으로 설정함으로써 빌드 프로세스를 보다 세밀하게 관리할 수 있다.

#### 타겟 속성 설정 방법

타겟 속성은 `set_target_properties()` 또는 `set_property()` 명령어를 사용하여 설정할 수 있다. 두 함수 모두 타겟의 속성을 지정하지만, `set_target_properties()`는 여러 타겟의 속성을 동시에 설정할 수 있고, `set_property()`는 특정 타겟의 속성에 대해 보다 세밀한 설정이 가능한다.

**set\_target\_properties()**

```cmake
set_target_properties(<target1> [<target2> ...]
                      PROPERTIES <property1> <value1>
                                  <property2> <value2>
                                  ...)
```

`set_target_properties()` 명령어는 지정된 타겟들에 대해 여러 속성을 한 번에 설정할 수 있다. 이 명령어는 주로 여러 타겟에 동일한 속성을 적용할 때 유용하다.

**set\_property()**

```cmake
set_property(TARGET <target> PROPERTY <property> <value>)
```

`set_property()` 명령어는 특정 타겟의 하나의 속성을 설정할 때 사용된다. 이 명령어는 개별 타겟에 대해 세밀한 조정을 할 수 있어, 보다 정교한 빌드 구성이 가능한다.

#### 자주 사용하는 타겟 속성

**ARCHIVE\_OUTPUT\_DIRECTORY**

`ARCHIVE_OUTPUT_DIRECTORY` 속성은 정적 라이브러리가 생성될 디렉토리를 지정한다. 이 속성을 통해 빌드 출력물을 특정 위치로 쉽게 정리할 수 있다.

```cmake
set_target_properties(my_static_lib PROPERTIES
                      ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
```

**RUNTIME\_OUTPUT\_DIRECTORY**

`RUNTIME_OUTPUT_DIRECTORY` 속성은 실행 파일이 생성될 디렉토리를 지정한다. 이 속성은 주로 윈도우 시스템에서 유용하게 사용된다.

```cmake
set_target_properties(my_executable PROPERTIES
                      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
```

**LIBRARY\_OUTPUT\_DIRECTORY**

`LIBRARY_OUTPUT_DIRECTORY` 속성은 공유 라이브러리 또는 모듈 라이브러리가 생성될 디렉토리를 지정한다. 이 속성을 사용하면 공유 라이브러리를 별도의 디렉토리에 모아서 관리할 수 있다.

```cmake
set_target_properties(my_shared_lib PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
```

**COMPILE\_DEFINITIONS**

`COMPILE_DEFINITIONS` 속성은 특정 타겟에 대해 컴파일러 정의를 추가할 때 사용된다. 이 속성을 통해 특정 타겟에 대한 전처리기 정의를 간단하게 추가할 수 있다.

```cmake
set_target_properties(my_target PROPERTIES
                      COMPILE_DEFINITIONS "MY_DEFINE=1")
```

**INCLUDE\_DIRECTORIES**

`INCLUDE_DIRECTORIES` 속성은 타겟에 대해 포함 디렉토리를 설정할 때 사용된다. 이 속성을 통해 특정 타겟이 특정 헤더 파일 디렉토리를 포함할 수 있다.

```cmake
set_target_properties(my_target PROPERTIES
                      INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include)
```

#### 타겟 속성 조회 방법

타겟 속성은 `get_target_property()` 명령어를 사용하여 조회할 수 있다. 이 명령어는 특정 타겟의 특정 속성 값을 반환한다.

```cmake
get_target_property(var_name my_target PROPERTY <property>)
```

조회된 속성 값은 `var_name` 변수에 저장되며, 이후 빌드 과정에서 이 변수를 사용할 수 있다.

#### 타겟 속성의 우선순위

CMake에서 타겟 속성의 우선순위는 여러 요소에 의해 결정된다. `set_target_properties()`와 `set_property()` 명령어로 설정된 속성은 명시적으로 설정된 값이므로 가장 높은 우선순위를 갖는다. 그러나 타겟 속성은 타겟의 링크 단계에서 상속될 수 있으며, 이 경우 우선순위는 타겟 간의 관계에 따라 달라질 수 있다. 따라서 타겟 속성의 설정 시점과 상속 관계를 잘 고려하여야 한다.

***

관련 자료:

* CMake 공식 문서: <https://cmake.org/documentation/>
* Mastering CMake by Ken Martin, Bill Hoffman
