如何在 CMake 包配置文件中指定可选依赖项?

How do I specify an optional dependency in a CMake package configuration file?

我正在尝试在我的项目的 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 实践是什么?

find_dependency 仅用于(最初)必需的包。

find_package 非必需子包在“复​​制”到 XXXConfig.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'!

and aLib package would be missed, then with (failed) call

find_dependency(aLib)

CMake 也会将 MyLib 视为遗漏(并会打印相应的消息),但不会因此停止配置。