可重定位的多平台安装的理想cmake安装目录结构是什么?

joh*_*003 5 c++ multiplatform cmake

CMake安装使用目标目录,通常使用GNUInstallDirs加载目标名称的标准值。例如:

include(GNUInstallDirs)
install(TARGETS Foo
    EXPORT Foo
    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
Run Code Online (Sandbox Code Playgroud)

但是,它没有提供为不同平台或体系结构构建的不同路径。我一直在通过以下方式安装到项目中特定于平台的文件夹中CMAKE_INSTALL_PREFIX

CMAKE_INSTALL_PREFIX=dist/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}
Run Code Online (Sandbox Code Playgroud)

但是,这有一些问题:

  • 它复制了跨平台相同的include。
  • 如果我将不同平台安装到同一根目录但更改了lib目录,则cmake在lib / non / standard / path / cmake / FooConfig.cmake中找不到cmake配置目标。
  • 而且,模块模式搜索也无法正确找到库,这在完成MODULE模式搜索时会出现问题。如果该库恰好也有一个cmake模块,该模块要求每个find_package必须指定“ CONFIG”,该配置开始变得怪异,则可能会发生这种情况,特别是当第3方库被告知要考虑此安装目录的常见依赖性时,并且不要t在find_package中指定CONFIG,因为为什么要这么做?

我正在寻找一种与find_package模块模式和config模式一起使用的结构;像这样的东西:

<install_prefix>/
  include/
    foo/
      foo.h
  lib/
    <PLAT x ARCH x CONFIG>/
      cmake/
        foo/
          FooConfig.cmake
      libFoo.a
Run Code Online (Sandbox Code Playgroud)

目标是:

  • 可以为不同的平台,体系结构和配置共同安装libs
  • 可以共享
  • 查找包括应该在典型的模块模式搜索中工作
  • 应该只适用于vanilla find_package(Foo REQUIRED),但适用于适当的平台和架构。

考虑到我将在这里主要安装第三方库,如果可以通过重写GNUInstallDirs中的var来完成,那么它可能适用于许多库。我猜其余的部分要么必须进行编辑,要么我就放弃并使用包含平台和架构的单独安装目录。

Tsy*_*rev 1

如果您希望用户将一些标准目录设置为CMAKE_PREFIX_PATH,例如

/usr/local # installation prefix
Run Code Online (Sandbox Code Playgroud)

但是您的项目将内容安装到非标准的、特定于平台的子目录中,例如

/usr/local/linux/x86/ # actual root directory where things are installed
Run Code Online (Sandbox Code Playgroud)

您可以将其放入FooConfig.cmake标准子目录中:

/usr/local/lib/FooConfig.cmake
Run Code Online (Sandbox Code Playgroud)

.cmake但编写它以便从特定于平台的目录中搜索适当的内容:

# File: FooConfig.cmake
# Location: lib/
#
# This is platform-independent script.
#
# Redirect configuration to the platform-specific script <system>/<cpu>/lib/FooConfig.cmake.
include(${CMAKE_CURRENT_LIST_DIR}/../${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}/lib/FooConfig.cmake)
Run Code Online (Sandbox Code Playgroud)

*Config.cmake可以用通常的方式编写特定于平台的脚本。

所以,如果用户写

find_package(Foo)
Run Code Online (Sandbox Code Playgroud)

在设置为 的环境中Linux/x86,它将为该平台设置导入的目标。