티스토리 뷰

cmake

[CMake,KOR] LIST

4whomtbts 2019. 12. 23. 18:56

참고 : 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를 알파벳 순으로 정렬합니다.

댓글