본문 바로가기
CMake

[CMake] Lists

by 별준 2021. 10. 29.

References

  • Professional CMake : A Practical Guide

Contents

  • LENGTH, GET
  • APPEND, INSERT
  • FIND
  • REMOVE_ITEM, REMOVE_AT, REMOVE_DUPLICATES
  • REVERSE, SORT

CMake에서 LIST(리스트)는 정말 많이 사용됩니다.

궁극적으로 list는 세미콜론(;)으로 구분된 item들이 있는 단일 문자열이므로 개별 list item들을 조작하는 것이 불편할 수 있습니다. 이러한 list item들을 편리하게 조작하기 위해서 CMake에서는 list() 명령을 제공합니다.

 

string()과 마찬가지로 list()도 첫 번째 argument로 sub command를 사용합니다.

이 sub command에는 APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE, SORT가 있습니다.

 

CMake에서 list는 처음에 말했듯이, 세미콜론(;)으로 구분된 문자열의 집합입니다. 따라서, set() 명령어로 list를 생성할 수 있는데, 예를 들어, set(var a b c d e)는 "a;b;c;d;e"라는 list를 생성하게 됩니다. 그리고 set(var "a b c e d")는 하나의 item("a b c e d")를 갖는 list를 생성하는 것과 동일합니다.

 


  • LENGTH, GET

LENGTH는 리스트 item의 개수를 반환하고, GET은 해당 index의 리스트 item을 반환합니다.

cmake_minimum_required(VERSION 3.10)
project(list)

set(myList a b c)  # Create the list "a;b;c"
LIST(LENGTH myList len)
message("length = ${len}")

list(GET myList 2 1 letters)
message("letters = ${letters}")

list(GET myList -1 -3 letters)
message("letters = ${letters}")

리스트 item의 인덱스가 만약 -1 또는 그 이하로 선택되면 이는 파이썬처럼 끝에서부터 인덱싱하여 찾습니다. 즉, -1은 끝에서 첫 번째 요소를 뜻합니다. 

그리고, 리스트 인덱스의 범위를 벗어나면, 에러가 발생합니다.

 

  • APPEND, INSERT

리스트의 요소를 추가하는 것은 APPENDINSERT 명령어로 가능합니다.

LENGTH와 GET 과는 다르게 APPEND와 INSERT는 결과 리스트를 따로 반환하는 것이 아닌 입력 리스트에 in-place로 item을 추가합니다.

cmake_minimum_required(VERSION 3.10)
project(list)

set(myList a b c)
list(APPEND myList d e f)
message("myList (first) = ${myList}")

list(INSERT myList 2 X Y Z)
message("myList (second) = ${myList}")

 

  • FIND

리스트에서 특정 item을 찾는 명령어는 다음과 같습니다.

myList에서 value의 값을 갖는 요소의 인덱스를 outVar에 저장하게 됩니다.

cmake_minimum_required(VERSION 3.10)
project(list)

set(myList a b c d e)
list(FIND myList d index)
message("index = ${index}")

list(FIND myList f index)
message("index = ${index}")

 

  • REMOVE_ITEM, REMOVE_AT, REMOVE_DUPLICATES

리스트 요소를 삭제하는 명령어입니다.

REMOVE_ITEM은 myList에서 value와 일치하는 요소를 제거하고,

REMOVE_AT은 myList에서 index에 위치하는 요소를 제거하고,

REMOVE_DUPLICATES는 중복되는 요소가 있다면 오직 유일한 요소들만 남도록 나머지를 제거하게 됩니다.

cmake_minimum_required(VERSION 3.10)
project(list)

set(myList a b c d e a b c d e)

list(REMOVE_ITEM myList a c)
message("myList (first) = ${myList}")

list(REMOVE_AT myList 1 -2)
message("myList (second) = ${myList}")

list(REMOVE_DUPLICATES myList)
message("myList (third) = ${myList}")

 

  • REVERSE, SORT

리스트 요소들은 REVERSE나 SORT 명령어를 통해서 정렬될 수 있습니다. 정렬은 알파벳순으로 이루어집니다.

cmake_minimum_required(VERSION 3.10)
project(list)

set(myList b e a c k f t)

list(REVERSE myList)
message("myList after REVERSE = ${myList}")

list(SORT myList)
message("myList after SORT = ${myList}")

REVERSE는 현재 리스트를 역순으로 뒤집어주고, SORT는 현재 리스트를 알파벳순으로 정렬해주는 것을 확인할 수 있습니다.

CMake 3.13 버전에서 SORT에 COMPARE, CASE, ORDER 옵션이 추가되었습니다.

https://cmake.org/cmake/help/latest/command/list.html#ordering


위 명령어 외에도 리스트에는

  • FILTER
  • POP_BACK
  • POP_FRONT
  • PREPEND
  • TRANSFORM

이 있습니다. 해당 명령어의 사용법은 link를 참조바랍니다 !

'CMake' 카테고리의 다른 글

[CMake] Looping - foreach, while  (0) 2021.10.31
[CMake] Flow Control - if  (0) 2021.10.30
[CMake] String Handling (string 명령어)  (0) 2021.10.29
[CMake] Variable (변수)  (0) 2021.10.29
[CMake] Tutorial (2) - Library 추가  (0) 2021.10.28

댓글