如何让CMake导出库目标的my_filepath属性为安装树绝对路径?
让CMake导出自定义属性为安装树下的绝对路径
要实现将自定义属性my_filepath导出为安装后的绝对路径,避免消费项目自行拼接路径,可通过以下方式处理:
核心思路
利用CMake的生成器表达式,在设置目标属性时直接构造基于安装前缀的绝对路径。当目标被安装导出后,生成器表达式会自动替换为消费项目实际的安装前缀,从而得到正确的绝对路径。
具体实现代码
库项目中的配置
add_library(my_lib INTERFACE) # 使用$<INSTALL_PREFIX>生成器表达式构造安装后的绝对路径 set_target_properties(my_lib PROPERTIES my_filepath "$<INSTALL_PREFIX>/relative/to/targets.cmake/my_file.json" ) # 将自定义属性加入导出属性列表 set_property(TARGET my_lib APPEND PROPERTY EXPORT_PROPERTIES "my_filepath") # 安装目标并导出配置文件 install(TARGETS my_lib EXPORT MyLibTargets) install(EXPORT MyLibTargets FILE MyLibTargets.cmake DESTINATION lib/cmake/MyLib # 导出文件的安装目录,可根据需求调整 )
支持构建目录本地使用(可选)
如果需要同时支持在库项目的构建目录中直接使用(无需安装),可以用$<IF>生成器表达式区分构建和安装场景:
set_target_properties(my_lib PROPERTIES my_filepath "$<IF:$<BOOL:$<TARGET_PROPERTY:INSTALL_PREFIX>>, $<INSTALL_PREFIX>/relative/to/targets.cmake/my_file.json, ${CMAKE_CURRENT_SOURCE_DIR}/relative/to/targets.cmake/my_file.json >" )
此配置下,构建目录中使用时属性值为源码目录下的绝对路径,安装后则为安装目录下的绝对路径。
消费项目中的使用
安装库后,消费项目只需正常调用find_package,即可直接获取绝对路径:
find_package(MyLib REQUIRED) # 获取绝对路径 get_target_property(my_filepath my_lib my_filepath) # 或使用生成器表达式 set(some_variable "$<TARGET_PROPERTY:my_lib,my_filepath>")
原理说明
$<INSTALL_PREFIX>是CMake内置的生成器表达式,会在目标安装导出时,自动替换为用户指定的安装前缀(即CMAKE_INSTALL_PREFIX的值)。这样导出的属性值就是完整的绝对路径,消费项目无需再拼接任何路径。
内容的提问来源于stack exchange,提问作者Richard W
相关产品推荐
相关产品推荐

