[CMake,KOR] LIST
참고 : https://cmake.org/cmake/help/v3.12/command/list.html
CMake의 LIST는 배열과 같은 역할을 합니다.
읽기
list(LENGTH <list> <출력변수>) : 출력변수에 매개변수로 넣은 list의 길이를 대입
list(GET <list> <인덱스> [<인덱스> ...] <출력변수>) : 출력변수에 매개변수로 넣은 리스트의 인덱스에 해당하는 값을 대입
list(SUBLIST <list> <시작인덱스> <끝인덱스> <출력변수>) : 출력변수에 매개변수로 넣은 리스트의 sublist 를대입
list(FIND <list> <값> <출력변수>) : 출력변수에 매개변수로 넣은 리스트의 값을 찾아서 인덱스를 대입
list(APPEND <list> [<element> ...]) : 매개변수로 넣은 리스트에 element의 값을 덧붙인다.
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <정규표현식>)
: 매개변수로 넣은 리스트에 REGEX 를 통해 값을 필터링 한다, INCLUDE, EXCLUDE 무엇을 선택하느냐에 따라서
필터의 동작이, 이 정규표현식에 일치하는 원소를 포함하게 하는 것인지, 제외하게 하는 것인지가 결정된다.
list(INSERT <list> <인덱스> <원소> [<원소> ...]) : 주어진 인덱스에 원소를 리스트에 끼워넣는다.
list(REMOVE_ITEM <list> <값> [<값> ...]) : 주어진 값과 같은 원소를 리스트에서 삭제한다.
list(REMOVE_DUPLICATES <list>): 리스트에서 중복된 원소를 삭제한다.
list(TRANSFORM <list> <ACTION> [<SELECTOR>] [OUTPUT_VARIABLE <output_variable>])
: selector를 명시할 시, 해당 selector에 맞는 조건을 가진 원소에만 ACTION을 적용합니다. selector가 없을 시
모든 원소에 ACTION을 적용합니다. 그 후 결과는 output_variable에 저장됩니다.
여기서 <ACTION>에 들어갈 수 있는 연산은 아래와 같습니다.
list(TRANSFORM <list> <APPEND 혹은 PREPREND> <value> ...)
list(TRANSFORM <list> <TOLOWER|TOUPPER> ...)
list(TRANSFORM <list> REPLACE <regluar_expression> <replcae_expression> ...)
<SELECTOR>는 아래 중 하나로 선택하면 됩니다.
list(TRANSFORM <list> <ACTION> AT <Index> [<index> ...] ...)
: 리스트의 index를 특정한다
list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)
: 특정한 range 로 한다.
list(TRANSFORM <list> <ACTION> REGEX <regex> ...)
: 정규표현식에 일치하는 아이템에만 ACTION을 적용한다
예제
LIST(APPEND my_list "HELLO WORLD")
LIST(APPEND my_list "BYE WORLD")
LIST(APPEND my_list "GOOD NIGHT WORLD")
SET(my_list_length)
LIST(LENGTH my_list my_list_length)
message("현재 LIST의 길이 = ${my_list_length}")
SET(second_element)
LIST(GET my_list 1 second_element)
message("두 번 째 원소 = ${second_element}")
message("원래 리스트= ${my_list}")
SET(my_sublist)
LIST(SUBLIST my_list 0 1 my_sublist)
message("서브 리스트 = ${my_sublist}")
SET(hello_world_string "HELLO WORLD")
SET(find_hello_world)
LIST(FIND my_list ${hello_world_string} find_hello_world)
message("hello world가 있는 인덱스 = ${find_hello_world}")
LIST(FILTER list EXCLUDE REGEX "WORLD")
message("필터 후 리스트 = ${my_list}")
CMakeLists.txt 를 만들고, 기본적인 코드를 작성하고 위의 코드를 넣어서 실행하세요.
CMake는 왠지 고리타분하고 별 기능도 없을 것 같다고 생각했는데, TRNASFORM에서 람다같은 함수형도 지원하고
FIND나 FILTER같은, 빌드스크립트의 특성상 꼭 필요한 유틸리티 메소드도 지원하는게 굉장히 흥미롭습니다.
아 그리고 까먹었는데
Ordering 도 지원합니다.
LIST(REVERSE <list>) : list를 뒤집습니다.
LIST(SORT <list>) : list를 알파벳 순으로 정렬합니다.