如何封装CMake原生FindPackage.cmake脚本避免find_package无限递归
递归问题根因
你自定义的FindSDL.cmake放在了CMAKE_MODULE_PATH的优先搜索路径下,在自定义脚本内调用find_package(SDL)时,CMake会优先匹配到你写的这个自定义脚本,触发无限递归。
修复方案
在自定义Find模块内调用find_package时添加NO_CMAKE_MODULE_PATH参数,强制跳过项目自定义的模块搜索路径,直接调用CMake内置的官方查找脚本,就可以解决递归问题。
你可以参考以下完整的自定义模块代码实现:
自定义cmake/modules/FindSDL.cmake
find_package(SDL REQUIRED NO_CMAKE_MODULE_PATH) if (NOT TARGET SDL::SDL) add_library(SDL::SDL UNKNOWN IMPORTED) set_target_properties(SDL::SDL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SDL_INCLUDE_DIR}" IMPORTED_LOCATION "${SDL_LIBRARY}" ) # 若SDL有额外依赖,可在此处追加INTERFACE_LINK_LIBRARIES属性配置 endif()
同逻辑适配SDL_mixer(cmake/modules/FindSDL_mixer.cmake)
find_package(SDL_mixer REQUIRED NO_CMAKE_MODULE_PATH) if (NOT TARGET SDL::Mixer) add_library(SDL::Mixer UNKNOWN IMPORTED) set_target_properties(SDL::Mixer PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SDL_MIXER_INCLUDE_DIR}" IMPORTED_LOCATION "${SDL_MIXER_LIBRARY}" INTERFACE_LINK_LIBRARIES SDL::SDL ) endif()
同逻辑适配SDL_image(cmake/modules/FindSDL_image.cmake)
find_package(SDL_image REQUIRED NO_CMAKE_MODULE_PATH) if (NOT TARGET SDL::Image) add_library(SDL::Image UNKNOWN IMPORTED) set_target_properties(SDL::Image PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${SDL_IMAGE_INCLUDE_DIR}" IMPORTED_LOCATION "${SDL_IMAGE_LIBRARY}" INTERFACE_LINK_LIBRARIES SDL::SDL ) endif()
这个方案不需要修改CMake内置脚本,也不需要调整你项目主CMakeLists.txt的原有逻辑,兼容CMake 3.1及以上版本,完全满足你的封装需求。
内容的提问来源于stack exchange,提问作者Sergey Kolesnik
相关产品推荐
相关产品推荐

