如何通过foreach从CMake冒号分隔键值的字符串列表提取常量
实现代码
set(MY_LIST "A:1;B:2;C:3") foreach(ITEM ${MY_LIST}) # 正则提取冒号前后的键、值,兼容所有CMake 3.x版本 string(REGEX MATCH "^([^:]+):(.*)$" _MATCHED ${ITEM}) if(_MATCHED) # CMAKE_MATCH_1对应正则第一个括号捕获的内容(键),CMAKE_MATCH_2对应第二个括号的内容(值) set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}") endif() endforeach() # 验证结果,可删除 message(STATUS "A = ${A}") message(STATUS "B = ${B}") message(STATUS "C = ${C}")
补充说明
- 如果需要将变量设为跨CMakeLists可用的全局常量,将
set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}")替换为set(${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "" FORCE)即可 - 如果你使用的是CMake 3.12及以上版本,也可以用更直观的字符串拆分写法替换正则逻辑:
string(SPLIT ${ITEM} ":" KEY_VALUE) list(GET KEY_VALUE 0 KEY) list(GET KEY_VALUE 1 VALUE) set(${KEY} "${VALUE}") - 正则写法的优势是支持值本身包含冒号的场景,比如
D:abc:def会被解析为键D,值为abc:def,拆分写法遇到值带冒号的场景会出错
内容的提问来源于stack exchange,提问作者deb
相关产品推荐
相关产品推荐

