INSTALL参数DESTINATION可以为空吗?

Pio*_*r G 9 cmake

通常,类型的相对参数PATH,如"lib"或"source/include"在CMake中使用变量的当前值解析为绝对路径,例如:${CMAKE_INSTALL_PREFIX}在命令的情况下INSTALL.但是,如果我想使用空的相对路径(或者根本不设置它),那么这不起作用,因此得到的绝对路径等于${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)
    
    Run Code Online (Sandbox Code Playgroud)

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

小智 0

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

set(CMAKE_INSTALL_PREFIX "\${CMAKE_CURRENT_LIST_FILE}/..")
Run Code Online (Sandbox Code Playgroud)

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

set(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}/..")
Run Code Online (Sandbox Code Playgroud)

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

get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
Run Code Online (Sandbox Code Playgroud)

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

不知道修改后CMAKE_INSTALL_PREFIX有没有副作用。在 UNIX 平台上,您可以尝试使用DESTDIR代替作为 的CMAKE_INSTALL_PREFIX参数make,但我还没有尝试过。