CMake如何通用地为列表每个元素添加自定义前缀?
CMake 实现列表元素批量添加前缀(类似GNU Make的addprefix)
在CMake中无需逐个手动处理列表元素,有两种通用方式实现类似GNU Make addprefix 的功能:
方法一:字符串替换快速实现
利用CMake列表本质是空格分隔字符串的特性,通过string(REPLACE)直接给每个元素插入前缀:
set(ELIST thisdir thatdir otherdir) set(ILIST adir bdir cdir) # 给ELIST每个元素前加--exclude string(REPLACE " " " --exclude " PREFIXED_ELIST "--exclude ${ELIST}") # 给ILIST每个元素前加--include string(REPLACE " " " --include " PREFIXED_ILIST "--include ${ILIST}") # 传给自定义工具示例 execute_process( COMMAND my_custom_tool ${PREFIXED_ELIST} ${PREFIXED_ILIST} RESULT_VARIABLE CMD_EXIT_CODE )
注意:该方法仅适用于列表元素不包含空格的场景,若元素带空格会导致解析错误。
方法二:自定义通用函数(推荐)
编写可复用函数遍历列表,逐个添加前缀,支持带空格的元素:
# 通用添加前缀函数 # 参数:OUTPUT_VAR 输出变量名,PREFIX 目标前缀,INPUT_LIST 待处理列表 function(add_prefix OUTPUT_VAR PREFIX INPUT_LIST) set(_temp_result "") foreach(item IN LISTS INPUT_LIST) list(APPEND _temp_result "${PREFIX}" "${item}") endforeach() set(${OUTPUT_VAR} "${_temp_result}" PARENT_SCOPE) endfunction() # 使用示例 set(ELIST thisdir thatdir otherdir) set(ILIST adir bdir cdir) add_prefix(PREFIXED_ELIST "--exclude" ${ELIST}) add_prefix(PREFIXED_ILIST "--include" ${ILIST}) # 传递给自定义工具 execute_process( COMMAND my_custom_tool ${PREFIXED_ELIST} ${PREFIXED_ILIST} RESULT_VARIABLE CMD_EXIT_CODE )
该方法生成标准CMake列表(前缀与每个元素为独立列表项),传递给命令行时会被正确解析为单独参数,兼容性更强。
内容的提问来源于stack exchange,提问作者user3696153
相关产品推荐
相关产品推荐

