默认情况下,如何将 find_package() 搜索限制为 CMAKE_MODULE_PATH?

How to limit find_package() search to CMAKE_MODULE_PATH by default?

我想模块化我的项目并使用 find_package 来控制 3rdparty 包含,我也有严格的要求来控制我的所有包。我不希望 cmake 在旁边包含一些东西并调试正在发生的事情,我需要将其搜索路径限制为 CMAKE_MODULE_PATH。 我发现的唯一显式方法是 NO_DEFAULT_PATH in find_package 调用,但我不想一遍又一遍地重复这些论点。有没有变量可以帮我控制它?我找到了一组变量 CMAKE_FIND_USE_*_PATH 但没有关于它们的明确文档

当您需要修改命令的某些标准行为时,您可能会使用函数或宏来隐藏一些细节。在这种情况下,您需要一个可能如下所示的宏:

macro(find_package_restricted)
    find_package(${ARGN} NO_DEFAULT_PATH)
endmacro()

你可以像使用它一样使用它 find_package:

find_package_restricted(Boost REQUIRED)

CMake documentation描述了构造安装前缀的算法。通过遵循该算法,应该很容易收集所有 CMAKE_FIND_USE_*_PATH 变量,将其设置为 FALSE 将禁用相应的前缀:

  1. <PackageName>_ROOT CMake 和环境变量中指定的搜索路径可以通过设置 CMAKE_FIND_USE_PACKAGE_ROOT_PATH 变量来省略。
  2. 在 cmake-specific 缓存变量中指定的搜索路径可以通过设置 CMAKE_FIND_USE_CMAKE_PATH 变量来省略。
  3. 在 cmake-specific 环境变量中指定的搜索路径可以通过设置 CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH 变量来省略。
  4. 无法禁用 HINTS 选项指定的搜索路径。
  5. 搜索标准系统环境变量可以通过设置CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH变量来省略。
  6. 可以通过设置 CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY 变量省略存储在 CMake 用户包注册表中的搜索路径。
  7. 可以通过设置 CMAKE_FIND_USE_CMAKE_SYSTEM_PATH 变量来省略在当前系统的平台文件中定义的搜索 cmake 变量。
  8. 可以通过设置 CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY 变量来省略存储在 CMake 系统包注册表中的搜索路径。
  9. 无法禁用 PATHS 选项指定的搜索路径。

总计设置

set(CMAKE_FIND_USE_PACKAGE_ROOT_PATH FALSE)
set(CMAKE_FIND_USE_CMAKE_PATH FALSE)
set(CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH FALSE)
set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH FALSE)
set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY FALSE)
set(CMAKE_FIND_USE_CMAKE_SYSTEM_PATH FALSE)
set(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY FALSE)

等同于每个 find_package 调用中的 NO_DEFAULT_PATH 选项。