CMake - 与脚本一起安装用于依赖的查找脚本

CMake - Install Find script for depencency together with script

我正在围绕一些可安装的 SDK 创建一个 CMake 库。所以依赖树看起来像:

Application   -->   MyLibrary   -->   OfficialSDK

此 SDK 由某些 setup.exe 安装,没有 CMake 模块。
因此,我在 MyLibrary: MyLibrary/cmake/FindOfficialSDK.cmake 中包含了一个自定义查找脚本。然后在 MyLibraryCMakeLists.txt 里面我可以使用 find_package(OfficialSDK).

这适用于 MyLibrary。我可以构建并安装它,连同 CMake 导出。那么 Application 可以 运行 find_package(MyLibrary) 开箱即用,因为 MyLibrary 是使用 CMake 正确安装的。

但是,在配置 Application 时出现错误:

Target "Application" links to target "OfficialSDK" but the target was not found.

好的,所以 MyLibrary 记得它需要 OfficialSDK,但是在这个 CMake 项目中找不到它。
我可以通过在 Application 中包含 cmake/FindOfficialSDK.cmake 来解决这个问题,但我不想让我的用户复制查找脚本,以防我将来需要更新它。

有什么方法可以包含导入的目标 OfficialSDK 并将其与 MyLibrary 一起安装,所以 Application不需要搜索吗?

我找到了一个解决方案,主要基于 https://discourse.cmake.org/t/install-findpackage-script/5307

我在 Pagmo2 中找到的另一个示例,用于自定义 FindBoost 脚本:https://github.com/esa/pagmo2/blob/master/pagmo-config.cmake.in#L10

简而言之,我添加了以下内容:

  • 为我的自定义查找脚本添加了安装:install(FILE ${CMAKE_CURRENT_DIR}/cmake/FindOfficialSDK ...)
  • 添加了将要安装的自定义 *-config.cmake.in 脚本,除了更自动的 *-targets.cmake 导出
  • 在此配置脚本中添加了显式 find_dependency(OfficialSDK)(不是 find_package),但在将 MyLibrary cmake 安装目录添加到 CMake 的子句中模块路径,因此使用自定义查找脚本。

可以在这个 PR 中看到一个完整的例子:https://github.com/ET-BE/AdsClient/pull/1/files(以及其他一些东西)。 OfficialSDK 是 TwinCAT 的 ADS 库。