如何获取CMake中指定目标的所有别名目标?
获取CMake原目标的所有别名目标列表
CMake原生并没有提供直接反向查询原目标对应所有别名的内置命令——因为别名的ALIASED_TARGET属性仅存储在别名目标本身,原目标不会主动记录指向它的别名。不过可以通过两种方式实现需求:
1. 自定义属性手动记录别名(推荐,可控性强)
在创建别名时,手动将别名添加到原目标的自定义属性中,后续直接读取该属性即可获取所有别名。
示例代码:
# 创建原目标 add_executable(my_exe main.cpp) # 创建别名并同步记录到原目标属性 add_executable(my_exe_alias ALIAS my_exe) set_property(TARGET my_exe APPEND PROPERTY ALIASES my_exe_alias) add_executable(my_exe_alias2 ALIAS my_exe) set_property(TARGET my_exe APPEND PROPERTY ALIASES my_exe_alias2) # 读取原目标的所有别名 get_target_property(my_exe_aliases my_exe ALIASES) if(my_exe_aliases) message("Aliases for my_exe: ${my_exe_aliases}") endif()
2. 遍历所有目标反向匹配别名
如果无法修改别名创建的代码(比如处理第三方项目),可以遍历所有已定义的目标,逐个检查其ALIASED_TARGET属性是否等于目标,收集匹配的别名。
示例函数:
function(get_target_all_aliases target out_var) set(result "") # 获取所有构建系统目标 get_cmake_property(all_targets BUILDSYSTEM_TARGETS) foreach(t IN LISTS all_targets) get_target_property(aliased_target ${t} ALIASED_TARGET) # 检查当前目标是否是指定目标的别名 if(aliased_target STREQUAL "${target}") list(APPEND result ${t}) endif() endforeach() set(${out_var} ${result} PARENT_SCOPE) endfunction() # 使用示例 get_target_all_aliases(my_exe my_exe_aliases) message("Aliases for my_exe: ${my_exe_aliases}")
注意:这种遍历方式会包含所有类型的目标(包括导入目标),如果项目中目标数量极多,可能会有轻微的性能损耗,但在绝大多数场景下可以忽略。
内容的提问来源于stack exchange,提问作者Toothless
相关产品推荐
相关产品推荐

