如何在cmake软件包注册表中注册安装目录

时间:2019-04-12 22:47:46

标签: cmake

假设我已经编写了一个库<mylib>,可以通过cmake进行安装。而且我还有一个<mylib>Config.cmake文件,它可以找到所有必需的文件(库,标头等),并为库导出目标。

如果我想将库与find_package(...)一起使用,则cmake需要知道配置文件的位置。我知道我每次使用该库构建项目时都可以通过此操作,也可以(对于cmake 3.13及更高版本)将<mylib>_ROOT环境变量指向该变量。

但是有一个解决方案对我来说似乎简单得多:我可以使用export(PACKAGE <PackageName>)命令在cmake软件包注册表中注册一个软件包。但是,如果我正确理解其documentation,则只能注册构建目录。我的构建目录通常既不包含配置文件,也不包含可能需要的其他东西,如包含文件。当然,我可以将它们复制到那里,但是如果我已经在安装目录中很好地设置了所有内容,为什么还要这样做呢?

因此我的问题:

  • export(PACKAGE ...)仅支持构建目录的注册的原因是什么?
  • 是否可以在cmake软件包注册表中注册我的安装目录?

1 个答案:

答案 0 :(得分:0)

不鼓励使用 CMake 包注册表,因为它可能会更改系统上其他构建的行为。来自latest documentation(强调我的):

<块引用>

在 3.15 版中更改:默认情况下,export(PACKAGE) 命令什么都不做(请参阅策略 CMP0090),因为填充用户包注册表会产生影响在源之外并构建树。设置 CMAKE_EXPORT_PACKAGE_REGISTRY 变量以将构建目录添加到 CMake 用户包注册表。

如果这个问题是一个 XY problem,一个更好的工作流程就是选择一个通用的安装前缀,比如 /path/to/prefix,然后通过-DCMAKE_PREFIX_PATH=/path/to/prefix。按依赖顺序构建每个项目,然后 cmake --install /path/to/build --prefix /path/to/prefix 再继续下一个。

这使您无需为每个依赖项设置 _ROOT 变量,因为您已将它们全部安装到相同的前缀。 CMAKE_PREFIX_PATH 也是 CMake 读取以初始化相应 CMake 变量的少数环境变量之一,因此您可以在 shell 中设置它以避免手动键入 -D...。为避免影响系统上的其他项目,direnv 之类的内容可能有助于管理设置和取消设置 CMAKE_PREFIX_PATH