只需使用正则表达式来拆分值。下面的代码将功能包装在一个函数中。除了创建这些变量的列表之外,它还提供添加前缀以避免保留变量名称问题的功能。(对于省略了额外逻辑的缩短版本,请参阅我答案的最后一个代码片段。)
function(my_parse_values OUT_PREFIX)
set(VAR_LIST)
foreach(_PAIR IN LISTS ARGN)
if (_PAIR MATCHES "^([^:]+):(.*)$")
set("${OUT_PREFIX}${CMAKE_MATCH_1}" ${CMAKE_MATCH_2} PARENT_SCOPE)
list(APPEND VAR_LIST ${CMAKE_MATCH_1})
else()
message(FATAL_ERROR "Invalid pair: ${_PAIR}")
endif()
endforeach()
list(REMOVE_DUPLICATES VAR_LIST)
set(${OUT_PREFIX} ${VAR_LIST} PARENT_SCOPE)
endfunction()
示例使用:
set(MY_LIST "A:1;B:2;C:3")
my_parse_values(VARS ${MY_LIST})
# VARS_A with value 1,
# VARS_B with value 2,
# VARS_C with value 3 and
# list VARS with elements A, B and C
# are defined now...
foreach(_VAR IN LISTS VARS)
message("${_VAR} = ${VARS_${_VAR}}")
endforeach()
如果您不需要变量列表,并且想要按原样设置变量,则代码可以缩短为:
function(my_parse_values)
foreach(_PAIR IN LISTS ARGN)
if (_PAIR MATCHES "^([^:]+):(.*)$")
set(${CMAKE_MATCH_1} ${CMAKE_MATCH_2} PARENT_SCOPE)
else()
message(FATAL_ERROR "Invalid pair: ${_PAIR}")
endif()
endforeach()
endfunction()
set(MY_LIST "A:1;B:2;C:3")
my_parse_values(${MY_LIST})
message("A = ${A}")
message("B = ${B}")
message("C = ${C}")