# 리스트 변수 사용 방법

#### 리스트 변수 정의 및 초기화

CMake에서 리스트 변수는 여러 개의 값을 저장할 수 있는 데이터 구조로, 공백으로 구분된 값들을 저장한다. 리스트 변수를 정의할 때는 일반 변수와 동일한 `set` 명령어를 사용한다. 예를 들어:

```cmake
set(MY_LIST "item1" "item2" "item3")
```

위의 예시에서 `MY_LIST`라는 이름의 리스트 변수가 정의되었고, "item1", "item2", "item3"라는 세 개의 값이 저장되었다. CMake에서는 각 값들이 공백으로 구분되므로, "item1;item2;item3"와 같이 세미콜론으로 연결된 형태로 저장된다.

#### 리스트 변수에 값 추가 및 수정

리스트 변수에 새로운 값을 추가하거나 기존 값을 수정하려면 `list(APPEND)` 명령어를 사용한다. 예를 들어, 기존 리스트에 새 값을 추가하려면 다음과 같이 작성할 수 있다:

```cmake
list(APPEND MY_LIST "item4")
```

위 명령은 `MY_LIST`에 "item4"를 추가한다. 이로 인해 리스트는 "item1", "item2", "item3", "item4"의 네 개 항목을 가지게 된다.

리스트 변수의 특정 인덱스 위치에 값을 삽입하거나 삭제하는 것도 가능한다. 예를 들어, 두 번째 위치에 새 항목을 삽입하려면:

```cmake
list(INSERT MY_LIST 1 "new_item")
```

이 명령은 "item2" 앞에 "new\_item"을 삽입한다. 반면, 특정 항목을 삭제하려면 `REMOVE` 또는 `REMOVE_AT` 명령어를 사용한다:

```cmake
list(REMOVE MY_LIST "item3")
list(REMOVE_AT MY_LIST 2)
```

첫 번째 명령은 "item3"을 리스트에서 제거하고, 두 번째 명령은 세 번째 항목을 제거한다(인덱스는 0부터 시작).

#### 리스트 변수의 요소 접근

리스트 변수의 특정 요소에 접근하려면 `list(GET)` 명령어를 사용한다. 예를 들어:

```cmake
list(GET MY_LIST 0 FIRST_ITEM)
```

이 명령은 `MY_LIST`의 첫 번째 요소를 `FIRST_ITEM` 변수에 저장한다. 다수의 인덱스를 한 번에 지정해 여러 요소를 가져올 수도 있다:

```cmake
list(GET MY_LIST 0 2 SELECTED_ITEMS)
```

이 명령은 첫 번째와 세 번째 요소를 `SELECTED_ITEMS` 변수에 저장한다.

#### 리스트 변수의 크기 및 조건부 사용

리스트 변수의 크기(즉, 요소의 개수)를 알아내려면 `list(LENGTH)` 명령어를 사용한다:

```cmake
list(LENGTH MY_LIST LIST_SIZE)
```

이 명령은 `MY_LIST`의 요소 개수를 `LIST_SIZE` 변수에 저장한다. 이 값을 조건문과 결합하여 리스트의 크기에 따라 다른 동작을 수행할 수 있다:

```cmake
if(LIST_SIZE GREATER 2)
    message("List has more than two items.")
endif()
```

#### 리스트 변수를 문자열로 변환

리스트 변수를 문자열로 변환할 때는 `string(JOIN)` 명령어를 사용한다. 예를 들어:

```cmake
string(JOIN "," JOINED_LIST ${MY_LIST})
```

이 명령은 `MY_LIST`의 모든 요소를 쉼표로 구분하여 `JOINED_LIST` 변수에 저장한다. 결과는 "item1,item2,item3,item4"와 같은 형태가 된다.

#### 고급 리스트 연산

CMake에서는 리스트를 정렬하거나 중복 항목을 제거할 수도 있다. 예를 들어, 리스트를 정렬하려면 `list(SORT)` 명령어를 사용한다:

```cmake
list(SORT MY_LIST)
```

이 명령은 `MY_LIST`를 알파벳 순으로 정렬한다. 중복 항목을 제거하려면 `list(REMOVE_DUPLICATES)` 명령어를 사용한다:

```cmake
list(REMOVE_DUPLICATES MY_LIST)
```

이 명령은 리스트 내의 중복된 항목을 모두 제거한다.

***

관련 자료:

* [CMake 공식 문서 - list 명령어](https://cmake.org/cmake/help/latest/command/list.html)
* [CMake 공식 문서 - set 명령어](https://cmake.org/cmake/help/latest/command/set.html)
