如何通过add_custom_target向CMake脚本传递分号分隔列表字符串
解决CMake add_custom_target传递分号分隔列表的问题
CMake在处理add_custom_target的COMMAND参数时,会将列表的分号视为参数分隔符,导致原本的分号分隔列表被拆成空格分隔的多个参数,这是核心问题所在。以下是几种可靠的解决方法:
使用生成表达式
$<JOIN>转义分号
生成表达式的JOIN操作可以直接将列表元素用转义后的分号连接,配合VERBATIM标志能确保最终命令里保留分号格式:set(MY_TARGET_LIST "item1" "item2" "item3") add_custom_target( pass_semicolon_list COMMAND ${CMAKE_COMMAND} -E echo "$<JOIN:${MY_TARGET_LIST},\\;>" VERBATIM )这里的
\\;是关键——转义后的分号会被CMake识别为普通字符,而非参数分隔符,VERBATIM则负责正确处理命令行的引号和转义规则。手动用
string(REPLACE)转义分号
先将列表中的分号替换为转义版本,再作为单个字符串传递:set(MY_TARGET_LIST "item1" "item2" "item3") string(REPLACE ";" "\\;" ESCAPED_LIST "${MY_TARGET_LIST}") add_custom_target( pass_semicolon_list COMMAND ${CMAKE_COMMAND} -E echo "${ESCAPED_LIST}" VERBATIM )此方法的核心是把列表转成单个带转义分号的字符串,让CMake不会将其拆分为多个参数。
为什么之前的
list(JOIN)无效?
直接用list(JOIN MY_TARGET_LIST ";" JOINED_LIST)生成的字符串,其中的分号没有被转义,CMake在解析COMMAND时依然会把它当成参数分隔符,导致列表被拆分。必须对分号做转义处理,才能让它作为普通字符保留在最终命令中。
内容的提问来源于stack exchange,提问作者cmannett85
相关产品推荐
相关产品推荐

