首页 > 解决方案 > 为 MacOS 框架安装 CMake 包配置文件

问题描述

我用 CMake 创建了一个版本化的 MacOS 框架,并偶然发现了在哪里安装包配置文件sample-config.cmake的问题sample-config-version.cmake,,,, sample-exports.cmake.sample-exports-release.cmake

框架是版本化的,所以结构大致如下:

<sample.framework>
   |-- Headers                 # link to Versions/Current/Headers
   |-- Resources               # link to Versions/Current/Resources
   +-- Versions
       |-- Current             # link to B
       +-- B
           |-- Headers
           +-- Resources
               |-- CMake
               +-- Info.plist

我使用 CMakes宏从包含内容CMakePackageConfigHelpers的模板生成包配置文件sample-config.cmake.in

@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/sample-export.cmake")

CMake 没有提到版本化框架,建议将文件安装到目录Resources/CMake中。

我这样做是通过调用

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sample-config.cmake"
  DESTINATION sample.framework/Resources/CMake
  COMPONENT development
)

生成的文件如下所示:

####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was sample-config.cmake.in                            ########

get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)

macro(set_and_check _var _file)
  set(${_var} "${_file}")
  if(NOT EXISTS "${_file}")
    message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
  endif()
endmacro()

macro(check_required_components _NAME)
  foreach(comp ${${_NAME}_FIND_COMPONENTS})
    if(NOT ${_NAME}_${comp}_FOUND)
      if(${_NAME}_FIND_REQUIRED_${comp})
        set(${_NAME}_FOUND FALSE)
      endif()
    endif()
  endforeach()
endmacro()

include("${CMAKE_CURRENT_LIST_DIR}/sample-export.cmake")

错误:

Resources/CMake无论我将这些文件安装到还是安装到,生成的配置文件都存在差异,Versions/B/Resources/CMake尽管它们都指向同一个目录。

通过Resources链接安装时Resources/CMake,调用 setPACKAGE_PREFIX_DIR生成为

`get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)`

但是通过Versions/B/Resources/CMake它安装时生成为

`get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../../" ABSOLUTE)`

因此,find_package(sample CONFIG)安装到Versions/B/Resources/CMake.

以前有人遇到过这个错误吗?

感谢您对此的任何意见。

标签: macoscmake

解决方案


推荐阅读