假设我已经编写了一个库<mylib>
,可以通过cmake进行安装。而且我还有一个<mylib>Config.cmake
文件,它可以找到所有必需的文件(库,标头等),并为库导出目标。
如果我想将库与find_package(...)
一起使用,则cmake需要知道配置文件的位置。我知道我每次使用该库构建项目时都可以通过此操作,也可以(对于cmake 3.13及更高版本)将<mylib>_ROOT
环境变量指向该变量。
但是有一个解决方案对我来说似乎简单得多:我可以使用export(PACKAGE <PackageName>)
命令在cmake软件包注册表中注册一个软件包。但是,如果我正确理解其documentation,则只能注册构建目录。我的构建目录通常既不包含配置文件,也不包含可能需要的其他东西,如包含文件。当然,我可以将它们复制到那里,但是如果我已经在安装目录中很好地设置了所有内容,为什么还要这样做呢?
因此我的问题:
export(PACKAGE ...)
仅支持构建目录的注册的原因是什么?答案 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
。