使用包装文件扩展 FindModule.cmake 逻辑

Expand FindModule.cmake logic with a wrapper file

有很多库的包不提供 CMake 配置文件,为了在 cmake 中查找和使用它们,必须求助于使用 FindPackage.cmake 脚本。一些脚本(即 SDL)在 cmake 本身中可用,因此找到一个包相对容易。
尽管就我而言,SDL 搜索脚本(SDL、SDL_image、SDL_mixer)几乎自现代 cmake(至少 3.1)问世以来就可用,但它们不提供现代方法的方法 -他们没有定义导入的 cmake 目标。 SDL 作为目标仅在 3.19 之后可用,并且它没有定义 IMPORTED_LOCATION 属性.
因此,合乎逻辑的事情是定义这些目标和属性。
一种天真的方法可能是从较新的 cmake 包中复制 FindSDL.cmake 的内容并粘贴修改。
但我想完整地保留来自 cmake 包(或来自外部源的另一个足够好的脚本)中的这些文件,并将它们包装起来。
所以,主要的 CMakeLists.txt 会是这样的:

list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules")
find_package(SDL REQUIRED)
find_package(SDL_mixer REQUIRED)
find_package(SDL_image REQUIRED)

cmake/modules/FindSDL.cmake:

find_package(SDL REQUIRED)

if (NOT TARGET SDL::SDL)
# add target and properties here
endif()

但是,我这样写是行不通的,因为无休止的递归。

在编写使用原始 FindPackage.cmake 文件的包装器 FindPackage.cmake 时,如何解决 find_package 的无限递归?


这看起来很有希望:

首先想到的是在调用find_package()之前从CMAKE_MODULE_PATH删除当前路径,然后再恢复

list(REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(SDL)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})

if (NOT TARGET SDL::SDL)
# add target and properties here
endif()