【问题标题】:Can parameter DESTINATION for INSTALL be empty?INSTALL 的参数 DESTINATION 可以为空吗?
【发布时间】:2018-01-26 19:40:20
【问题描述】:

一般来说,PATH 类型的相对参数,如“lib”或“source/include”在 CMake 中使用变量的当前值解析为绝对路径,例如:${CMAKE_INSTALL_PREFIX} 在命令 @ 的情况下987654323@。但是,如果我想使用空的相对路径(或根本不设置它),这不起作用,因此生成的绝对路径等于 ${CMAKE_INSTALL_PREFIX} - CMake 生成器会抱怨不存在的 DESTINATION,尽管没有理由不能解决。

我知道此问题的两种解决方法,但两者都有其缺陷,使我无法实现我的目标:

  1. 使用${CMAKE_INSTALL_PREFIX} 作为DESTINATION 值。这正确解析了路径,但在 INSTALL(EXPORT) 的情况下,生成的 Target.cmake 中的路径是绝对的,这使得包不可重定位。
  2. 使用. 作为DESTINATION。这至少会在Target.cmake 内部生成相对路径,但路径不正确。 .显然被认为是一个普通文件夹,而在Target.cmake生成过程中,当_IMPORT_PREFIX被确定时,CMake过度剥离了一个文件夹组件:

    # Compute the installation prefix relative to this file.
    get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
    get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
    

还有其他解决方法吗?你认为缺少空的相对路径会被认为是一个错误吗?

【问题讨论】:

  • 你的 CMake 版本是什么?
  • 3.8,但是 cmake 版本有变化吗?
  • 我有同样的问题,我在查看 cmake 源代码中导出文件生成期间发生的情况后才发现您的问题。所以我认为没有选择只生成导出,其中_IMPORT_PREFIX 被简单地设置为“${CMAKE_CURRENT_LIST_FILE}”。我不知道为什么,对我来说,这似乎也是很常见的用例,你有一个包含库二进制文件、包含文件和 cmake 导出文件的包来导入它,而且它不必被硬固定在​​文件系统的某个地方。跨度>

标签: cmake


【解决方案1】:

我想我为此找到了一些 hacky 解决方案。这将强制 cmake 生成导出文件,其中 _IMPORT_PREFIX 设置为导出 cmake 的当前位置。 在安装和导出序列之前修改 CMAKE_INSTALL_PREFIX,如下所示:

set(CMAKE_INSTALL_PREFIX "\${CMAKE_CURRENT_LIST_FILE}/..")

${CMAKE_CURRENT_LIST_FILE} 之前的\ 符号此时阻止评估变量引用${CMAKE_CURRENT_LIST_FILE},它只是作为字符串传递。 之后在导出的 cmake 中你会得到:

set(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}/..")

您需要在末尾添加/..,因为set 函数会将_IMPORT_PREFIX 设置为导出cmake 的完整路径,以及cmake 文件名(例如C:/Works/project/ext/library/Library.cmake)所以/..将删除/Library.cmake。完美的结果是强制 cmake 在导出的文件中使用get_filename_component,例如:

get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)

但正如我在评论中提到的,cmake 实现可能是不可能的。

我不知道修改CMAKE_INSTALL_PREFIX 是否有任何负面影响。在 UNIX 平台上,您可以尝试使用 DESTDIR 而不是 CMAKE_INSTALL_PREFIX 作为 make 的参数,但我没有尝试过。

【讨论】:

    【解决方案2】:

    CMAKE_CURRENT_LIST_DIR 为我工作。无需添加/..

    @[Marek Kijo] - 感谢您的解决方案: set(CMAKE_INSTALL_PREFIX "\${CMAKE_CURRENT_LIST_FILE}/..")

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多