如何获取CMake中指定目标的所有已设置属性名称
CMake获取指定目标全部已设置属性名称的方案
我们在使用CMake时,经常需要获取某个目标上所有已设置的属性,包括CMake预定义属性和自定义的额外属性。以下是两种不同场景下的实现方案:
方案1:CMake 3.19及以上版本(推荐)
从3.19版本开始,CMake原生支持直接查询目标的所有已设置属性名,不需要额外处理自定义属性,直接就能拿到完整列表,实现你需要的get_target_property_names函数的代码如下:
function(get_target_property_names target output_list) cmake_language(GET_PROPERTY all_props TARGET ${target} PROPERTY_NAMES) set(${output_list} ${all_props} PARENT_SCOPE) endfunction()
使用方式和预期完全一致:
# 调用函数获取所有属性名 get_target_property_names(some_target property_names) # 可以打印验证结果 message("目标some_target的所有属性:${property_names}")
这个方案会自动包含你通过set_target_properties设置的自定义属性,比如示例中的some_custom_property会正常出现在返回的列表里。
方案2:兼容CMake 3.19以下的旧版本
如果你使用的CMake版本低于3.19,没有原生的属性名查询接口,只能通过预定义属性遍历+自定义属性补录的方式实现,代码如下:
function(get_target_property_names target output_list) # 1. 获取CMake所有预定义属性列表 execute_process( COMMAND ${CMAKE_COMMAND} --help-property-list OUTPUT_VARIABLE predefined_prop_list OUTPUT_STRIP_TRAILING_WHITESPACE ) string(REPLACE "\n" ";" predefined_prop_list "${predefined_prop_list}") # 2. 补充你自己用到的所有自定义属性名,根据实际情况修改 set(custom_prop_list some_custom_property other_custom_prop) list(APPEND check_prop_list ${predefined_prop_list} ${custom_prop_list}) # 3. 遍历校验属性是否在目标上存在 set(exist_props "") foreach(prop ${check_prop_list}) get_target_property(prop_value ${target} ${prop}) if(NOT prop_value STREQUAL "prop_value-NOTFOUND") list(APPEND exist_props ${prop}) endif() endforeach() set(${output_list} ${exist_props} PARENT_SCOPE) endfunction()
注意该方案的限制:未提前加入custom_prop_list的自定义属性无法被识别,这是旧版本CMake的接口限制,没有其他绕过方案。
内容的提问来源于stack exchange,提问作者Sogartar
相关产品推荐
相关产品推荐

