CMake的configure_package_config_file的INSTALL_DESTINATION选项作用是什么
1. INSTALL_DESTINATION 选项的实际作用
configure_package_config_file 命令本身并不负责最终的文件安装,它的核心作用是处理.in模板生成可重定位的包配置文件。INSTALL_DESTINATION 的作用是告诉CMake你预期把生成的FooConfig.cmake安装到哪个相对于安装前缀的路径,CMake会根据这个路径计算出配置文件到安装根前缀的相对层级,用来展开模板里的@PACKAGE_INIT@标记:
- 展开后的代码会通过
CMAKE_CURRENT_LIST_DIR(即FooConfig.cmake实际运行时的所在路径)自动推算出安装前缀,生成PACKAGE_PREFIX_DIR变量 - 所有你在模板里用
@PACKAGE_<VAR>@标记引用的路径变量,都会基于这个推算出的前缀生成正确的绝对路径,保证包安装到任意自定义前缀下都能正常被找到。
2. 示例中错误填写的lib/Goo/dmake会产生的影响
你当前的示例里没有出现问题,是因为你的FooConfig.cmake.in模板里只用到了@PACKAGE_INIT@和组件检查逻辑,没有用到任何PACKAGE_开头的自动推导路径变量。一旦你需要在配置文件里声明包的头文件路径、库路径等内容,比如加入如下代码:
set_and_check(Foo_INCLUDE_DIR @PACKAGE_CMAKE_INSTALL_INCLUDEDIR@) set_and_check(Foo_LIBRARY_DIR @PACKAGE_CMAKE_INSTALL_LIBDIR@)
错误的INSTALL_DESTINATION就会导致路径推算完全失效:CMake会按照lib/Goo/dmake的层级计算需要从配置文件路径回退3层到安装前缀,但实际配置文件安装在lib/Foo/cmake,回退层数不匹配会导致PACKAGE_PREFIX_DIR指向错误位置,最终其他项目依赖这个包时会找不到头文件、库文件。
3. 该选项被设计为必填项的原因
CMakePackageConfigHelpers 模块的核心设计目标就是生成可重定位的包配置文件,不需要用户硬编码安装前缀。而要实现自动推算安装前缀,必须提前知道配置文件最终的安装路径才能计算相对层级,所以INSTALL_DESTINATION是实现该核心功能的必要参数,因此被设为必填项。
你观察到的“配置错了也不影响安装路径”,是因为安装逻辑完全由你单独写的install(FILES ... DESTINATION lib/Foo/cmake)命令控制,和configure_package_config_file没有关系,官方文档要求你填的路径和实际安装路径一致,就是为了保证路径推导逻辑正确。
内容的提问来源于stack exchange,提问作者Neymar87

