CMake安装目标时如何导出目标的自定义属性
CMake install导出目标自定义属性方法
默认情况下,install(EXPORT) 仅会导出CMake内置的目标属性,不会自动包含用户自定义属性,不过可以通过简单配置实现自定义属性的导出,适配你给出的示例的具体操作如下:
修正原有代码的属性赋值错误
你原有代码中给多值属性赋值的写法有误:
# 错误写法:CMake会将TCP识别为新的属性名,UDP识别为TCP属性的值 set_target_properties(protocols PROPERTIES PROTOCOLS_LIST "IP" "TCP" "UDP")
多值属性需要传入分号分隔的列表字符串,正确写法如下:
set_target_properties(protocols PROPERTIES PROTOCOLS_LIST "IP;TCP;UDP")
配置自定义属性导出
根据你的CMake最低版本要求(3.14),两种实现方式二选一即可:
方式1:通过
EXPORT_PROPERTIES目标属性指定导出列表(最简便)EXPORT_PROPERTIES是CMake 3.12版本引入的内置目标属性,直接把需要额外导出的自定义属性名加到这个属性里即可,不需要额外全局声明,完整示例代码如下:cmake_minimum_required(VERSION 3.14.0) project(exported_props LANGUAGES CXX) add_library(protocols ...) set_target_properties(protocols PROPERTIES PROTOCOLS_LIST "IP;TCP;UDP" # 指定要额外导出的自定义属性 EXPORT_PROPERTIES "PROTOCOLS_LIST" ) install(TARGETS protocols EXPORT protocol) install(EXPORT protocol DESTINATION ${CMAKE_BINARY_DIR})方式2:全局声明可导出的自定义属性
如果你的多个目标都会用到PROTOCOLS_LIST这个属性,可以用define_property全局声明该属性支持导出,所有设置了该属性的目标在导出时都会自动携带属性值,完整示例代码如下:cmake_minimum_required(VERSION 3.14.0) project(exported_props LANGUAGES CXX) # 全局声明自定义目标属性可导出 define_property(TARGET PROPERTY PROTOCOLS_LIST BRIEF_DOCS "Supported protocol list" FULL_DOCS "List of network protocols provided by the library" EXPORT # 标记该属性可随目标导出 ) add_library(protocols ...) set_target_properties(protocols PROPERTIES PROTOCOLS_LIST "IP;TCP;UDP" ) install(TARGETS protocols EXPORT protocol) install(EXPORT protocol DESTINATION ${CMAKE_BINARY_DIR})
效果验证
重新执行CMake配置、构建、安装流程后,打开生成的protocol.cmake文件就能看到PROTOCOLS_LIST属性的设置逻辑。外部项目导入该目标后,可以直接通过get_target_property命令读取属性值:
find_package(protocol REQUIRED) get_target_property(SUPPORT_PROTOCOLS protocols PROTOCOLS_LIST) # SUPPORT_PROTOCOLS的值为IP;TCP;UDP
内容的提问来源于stack exchange,提问作者AmirSalar
相关产品推荐
相关产品推荐

