2011-03-11 4 views
39

나는 다음과 같은 문자열이 상상 : 나는 그래서CMAKE를 사용하여 문자열을 목록으로 분할하는 일반적인 방법은 무엇입니까?

list(LENGTH SEXY_LIST len) 

len을 할 수 SEXY_STRING에서 SEXY_LIST을 가져올 다음

set(SEXY_STRING "I love CMake") 

것은

3. 내가 몇 가지 발견했습니다 같다 웹에 매크로가 있지만 실제로 어떻게 "자연스럽게"하는지 알고 싶습니다. 이 작업은 매우 기본적이고 널리 사용되는 것으로 보입니다.

답변

50

구분 기호를 ;으로 바꿉니다. 나는 그것을 할 수있는 다른 방법을 찾지 못한다.

cmake_minimum_required(VERSION 2.8) 

set(SEXY_STRING "I love CMake") 
string(REPLACE " " ";" SEXY_LIST ${SEXY_STRING}) 

message(STATUS "string = ${SEXY_STRING}") 
# string = I love CMake 

message(STATUS "list = ${SEXY_LIST}") 
# list = I;love;CMake 

list(LENGTH SEXY_LIST len) 
message(STATUS "len = ${len}") 
# len = 3 
+1

,하지만 당신은 좋은 것입니다. 감사! –

+3

섹시합니다 :-) –

+1

2.8이 꼭 필요하지는 않습니다. 나는 2.6 작품을 확신합니다. 어쩌면 2.4 –

10
string(REGEX MATCHALL "[a-zA-Z]+\ |[a-zA-Z]+$" SEXY_LIST "${SEXY_STRING}") 
+0

이것은 더 나은 해결책 일 수 있습니다. (http://www.cmake.org/cmake/help/v2.8.9/cmake.html에서 인용) #REGEX MATCHALL은 정규 표현식을 가능한 한 여러 번 일치시키고 출력 변수에 일치 항목을 **로 저장합니다 *명부***. – Nianliang

+1

*** 문자열 (REGEX MATCHALL "([^ \] + \ | [^ \] + $)"ARG_LIST "$ {ARGN}")을 사용하고 있습니다 *** – Nianliang

20

당신은 SEPARATE_ARGUMENTS 명령을 사용할 수 있습니다 내가 좀 더 일반적인 수있는 방법을 발견했습니다 http://www.cmake.org/cmake/help/cmake2.6docs.html#command:separate_arguments

cmake_minimum_required(VERSION 2.6) 

set(SEXY_STRING "I love CMake") 

message(STATUS "string = ${SEXY_STRING}") 
# string = I love CMake 

set(SEXY_LIST ${SEXY_STRING}) 
separate_arguments(SEXY_LIST) 

message(STATUS "list = ${SEXY_LIST}") 
# list = I;love;CMake 

list(LENGTH SEXY_LIST len) 
message(STATUS "len = ${len}") 
# len = 3 
+0

' ARGS가 매크로의 인수 이름이라면 Linux의 macro()'는 separate_arguments (args UNIX_COMMAND "$ {ARGS}")'여야합니다. –

관련 문제