加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:23:33 所属栏目:百科 来源:网络整理
导读:CMake安装采用目标目录,通常使用GNUInstallDirs加载目标名称的标准值.例如: include(GNUInstallDirs)install(TARGETS Foo EXPORT Foo INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION
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}
)

但是,它不提供为不同平台或体系结构构建的不同路径.我一直在通过CMAKE_INSTALL_PREFIX安装到我项目中的平台特定文件夹,如下所示:

CMAKE_INSTALL_PREFIX=dist/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}

这有一些问题:

>它复制了跨平台相同的包含.
>如果我将不同的平台安装到同一个根但更改了lib目录,则cmake将无法在lib / non / standard / path / cmake / FooConfig.cmake中找到cmake配置目标
>并且模块模式搜索也无法正确找到库,这在完成MODULE模式搜索时会出现问题.如果库恰好还有一个cmake模块,它需要每个find_package都必须指定“CONFIG”,这开始变得很奇怪,特别是当第三方库被告知要考虑这个安装目录以获得共同依赖时,就会发生这种情况. t在find_package中指定CONFIG,因为它们为什么会这样?

我正在寻找一个与find_package模块模式和配置模式一起工作的结构;这样的事情:

<install_prefix>/
  include/
    foo/
      foo.h
  lib/
    <PLAT x ARCH x CONFIG>/
      cmake/
        foo/
          FooConfig.cmake
      libFoo.a

目标是:

> libs可以为不同的平台,架构和配置共同安装
>包含可以共享
>查找包含应该在典型的模块模式搜索中工作
>应该只使用vanilla find_package(Foo REQUIRED),但适用于适当的平台和拱门.

考虑到我将在这里安装大多数第三方库,如果可以通过覆盖GNUInstallDirs的变量来完成,它可能适用于许多库.其余我想要编辑或我只是放弃并使用包括平台和拱门的单独安装目录.

解决方法

如果您希望用户将某个标准目录设置为CMAKE_PREFIX_PATH,就像

/usr/local # installation prefix

但是你的项目将东西安装到非标准的,特定于平台的子目录中,比如

/usr/local/linux/x86/ # actual root directory where things are installed

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

/usr/local/lib/FooConfig.cmake

但要写它,以便从特定于平台的目录中搜索适当的.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)

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

所以,如果用户会写

find_package(Foo)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读