# 변수와 리스트

#### 변수 (Variables)

CMake에서 변수는 빌드 시스템에서 필요한 다양한 값을 저장하고, 이 값을 다른 명령어들에 전달하기 위해 사용된다. 변수는 대개 대문자로 정의되며, 일반적인 형식은 다음과 같다:

```cmake
set(VARIABLE_NAME value)
```

* **기본 변수 정의:**\
  `set` 명령어를 사용하여 변수를 정의한다. 이 명령어는 두 개의 인수를 받는데, 첫 번째는 변수 이름, 두 번째는 변수의 값이다. 예를 들어, `set(MY_VAR "Hello World")`는 `MY_VAR`라는 이름의 변수를 "Hello World"라는 문자열 값으로 설정한다.
* **변수 참조:**\
  변수의 값을 참조할 때는 `${}` 구문을 사용한다. 예를 들어, `${MY_VAR}`는 `MY_VAR`의 값을 참조한다.
* **변수 스코프:**\
  변수는 정의된 위치에 따라 스코프가 결정된다. 기본적으로, 변수는 정의된 디렉토리와 하위 디렉토리에서 유효한다. `set` 명령어의 `PARENT_SCOPE` 옵션을 사용하면 부모 디렉토리의 스코프로 변수를 확장할 수 있다.
* **캐시 변수:**\
  CMake는 캐시 변수를 통해 값의 지속성을 유지할 수 있다. 캐시 변수는 `-D` 옵션을 사용해 명령행에서 설정하거나, `set` 명령어에서 `CACHE` 옵션을 사용해 정의할 수 있다. 예를 들어, `set(MY_CACHE_VAR "default_value" CACHE STRING "Description")`는 `MY_CACHE_VAR`라는 캐시 변수를 설정한다.
* **환경 변수:**\
  `ENV` 키워드를 사용하여 환경 변수를 참조할 수 있다. 예를 들어, `${ENV{HOME}}`는 사용자 홈 디렉토리의 경로를 반환한다.
* **전역 변수와 로컬 변수:**\
  CMake에서는 변수를 전역 또는 로컬로 정의할 수 있다. `set` 명령어만 사용할 경우, 변수는 디렉토리 범위 내에서 로컬로 설정된다. 전역 변수를 정의하려면 `set_property` 또는 `set_global_property` 명령어를 사용한다.

#### 리스트 (Lists)

CMake에서는 리스트를 사용하여 여러 값을 하나의 변수에 저장할 수 있다. 리스트는 세미콜론(`;`)으로 구분된 문자열이다. CMake에서 리스트를 다루는 방법은 다음과 같다:

* **리스트 정의:**\
  `set` 명령어를 사용해 리스트를 정의할 수 있다. 예를 들어, `set(MY_LIST "item1;item2;item3")`는 `MY_LIST`라는 리스트를 정의한다. 리스트 요소들은 세미콜론으로 구분된다.
* **리스트 참조:**\
  리스트의 모든 요소를 참조할 때는 `${MY_LIST}`로 참조하며, 특정 요소를 참조하려면 `list` 명령어를 사용해야 한다.
* **리스트 요소 추가:**\
  `list(APPEND)` 명령어를 사용해 리스트에 요소를 추가할 수 있다. 예를 들어, `list(APPEND MY_LIST "item4")`는 `MY_LIST`에 "item4"를 추가한다.
* **리스트 요소 제거:**\
  `list(REMOVE_ITEM)` 명령어를 사용해 특정 요소를 리스트에서 제거할 수 있다. 예를 들어, `list(REMOVE_ITEM MY_LIST "item2")`는 `MY_LIST`에서 "item2"를 제거한다.
* **리스트 길이:**\
  `list(LENGTH)` 명령어는 리스트의 길이를 구할 수 있다. 예를 들어, `list(LENGTH MY_LIST length_var)`는 `MY_LIST`의 길이를 `length_var`에 저장한다.
* **리스트 정렬:**\
  `list(SORT)` 명령어를 사용해 리스트를 정렬할 수 있다. 예를 들어, `list(SORT MY_LIST)`는 `MY_LIST`를 오름차순으로 정렬한다.
* **리스트 조작:**\
  CMake에서는 리스트의 특정 위치에 요소를 삽입하거나, 리스트의 하위 리스트를 추출하는 등 다양한 조작을 할 수 있다. `list(INSERT)`, `list(SUBLIST)` 명령어가 이에 해당한다.

#### 관련 자료:

***

* [CMake Documentation: set Command](https://cmake.org/cmake/help/latest/command/set.html)
* [CMake Documentation: list Command](https://cmake.org/cmake/help/latest/command/list.html)
* [CMake Documentation: Variable Scope](https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#scope)
