0

我正在尝试正确指定MyLibConfig.cmake项目文件中的依赖项。在CMakeLists.txt我有这样的事情:

find_package(aLib REQUIRED)
find_package(bLib)

所以在MyLibConfig.cmake我写了类似的东西:

include(CMakeFindDependencyMacro)
find_dependency(aLib REQUIRED)
find_dependency(bLib)

现在,当我编写另一个需要 myLib 的项目时,我会:

find_package(MyLib REQUIRED)

这失败了,因为 MyLib 配置文件没有找到 bLib,但我希望它被视为可选的。处理此问题的最佳现代 CMake 实践是什么?

4

1 回答 1

0

find_dependency仅用于(最初)REQUIRED 包。

find_packageXXXConfig.cmake当“复制”到脚本中时,非必需的子包保持不变。

对于CMakeLists.txt包含

find_package(aLib REQUIRED)
find_package(bLib)

对应的内容MyLibConfig.cmake是:

include(CMakeFindDependencyMacro)
# for REQUIRED package 'find_package' is replaced with 'find_dependency',
# but 'REQUIRED' keyword is omited.
find_dependency(aLib)
# for non-REQUIRED package 'find_package' remains.
find_package(bLib)

重要的是不要REQUIRED将关键字传递给宏。那么,会不会打电话find_dependency

find_package(MyLib) # Without 'REQUIRED'!

并且aLib包裹会丢失,然后(失败)调用

find_dependency(aLib)

CMake 也会MyLib被忽略(并会打印适当的消息),但不会因此而停止配置。

于 2020-11-15T17:52:15.897 回答