2011-03-11 15 views
39

Ben aşağıdaki dizeyi sahip düşünün: Ben bu yüzdenCMAKE ile dizeyi listeye ayırmanın yaygın yolu nedir?

list(LENGTH SEXY_LIST len) 

ve len yapabilirsiniz SEXY_STRING den SEXY_LIST elde etmek istiyorum sonra

set(SEXY_STRING "I love CMake") 

3. Birkaç buldum eşittir web üzerinde makrolar, ama gerçekten "doğal" şekilde nasıl yapılacağını bilmek istiyorum. Bu işlem çok temel ve yaygın olarak kullanılmaktadır.

cevap

50

Ayırıcınızı ; ile değiştirin. Bunu yapmak için başka bir yol göremiyorum.

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

ama seninki de güzel. Teşekkürler! –

+3

Bu seksi :-) –

+1

Gerçekten gerek yok 2.8. Eminim 2.6 çalışıyor. belki de –

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

yığınının taşması hakkında en iyi cevap 2.4 – Nianliang

+1

*** string kullanıyorum (REGEX MATCHALL "([^ \] + \ | [^ \] + $)" ARG_LIST "$ {ARGN}") *** – Nianliang

20

Sen SEPARATE_ARGUMENTS komutunu kullanabilirsiniz: Ben biraz daha genel bir yöntem buldum 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

'' de '' private_arguments() 'yi kullanarak ARGS makro için argüman ismiyse, Linux'ta macro() 'un' un_arguments (UNIX_COMMAND "$ {ARGS}") olması gerekiyordu. –

İlgili konular