CMake函数调用时如何实现参数追加而非覆盖?
解决CMake mic_set_classes函数参数追加问题
原函数每次调用都会直接覆盖全局属性GLOBAL_ALL_CLASS,没有读取原有内容进行追加,导致最终只保留最后一次传入的参数。以下是修正后的实现:
function(mic_set_classes) set(oneValueArgs CLASS_TYPE) set(multiValueArgs CLASS_LIST) cmake_parse_arguments(MIC_SET_CLASSES "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) # 获取全局属性中已有的类列表 get_property(existing_classes GLOBAL PROPERTY GLOBAL_ALL_CLASS) if(NOT existing_classes) set(existing_classes "") endif() # 将本次传入的CLASS_LIST转为逗号分隔字符串 set(new_classes "") foreach(A IN LISTS MIC_SET_CLASSES_CLASS_LIST) string(APPEND new_classes "${A},") endforeach() # 移除末尾多余的逗号(若后续命令允许末尾逗号,可删除此步) string(REGEX REPLACE ",$" "" new_classes "${new_classes}") # 拼接已有内容与新内容 if(existing_classes AND new_classes) set(all_list_types "${existing_classes},${new_classes}") elseif(new_classes) set(all_list_types "${new_classes}") else() set(all_list_types "${existing_classes}") endif() # 更新全局属性 set_property(GLOBAL PROPERTY GLOBAL_ALL_CLASS ${all_list_types}) endfunction() # 原解析函数保持不变 function(mic_parse_project) get_property(class_list GLOBAL PROPERTY GLOBAL_ALL_CLASS) execute_process(COMMAND ${MIC_PARSE_PROJECT_INVMNG} -c ${class_list}) endfunction()
关键修改说明
- 读取已有全局属性:每次调用函数时先获取
GLOBAL_ALL_CLASS的当前值,确保不会丢失之前传入的参数 - 简化参数处理逻辑:删除原代码中冗余的外层
foreach循环,直接遍历本次传入的CLASS_LIST生成逗号分隔字符串 - 安全追加逻辑:判断已有内容和新内容是否为空,避免出现多余逗号或空值
- 可选末尾逗号处理:通过正则替换移除末尾多余逗号,适配多数命令对参数格式的要求
内容的提问来源于stack exchange,提问作者Sarang Bilwankar
相关产品推荐
相关产品推荐

