如何从我自己的同名查找模块中执行CMake的默认查找模块?

时间:2019-07-24 14:03:16

标签: cmake

由于某种原因,如果CMake的FindThreads失败,我想扩展一个find模块(在我的情况下为FindThreads)来做一些特定的事情。对于我们软件系统其他部分的普通开发人员来说,这应该透明地进行,以便他/她可以像往常一样调用find_package(Threads),因此我不想为自己的find模块指定专有名称。

我的想法是在FindThreads.cmake包含的文件夹中添加自己的CMAKE_MODULE_PATH。由于CMAKE_MODULE_PATH具有优先级find_package(Threads)将执行我自己的FindThreads.cmake

但是,在我自己的FindThreads.cmake中,我需要执行find_package(Threads ...),以便它执行CMake的原始FindThreads.cmake该怎么做?

如果失败,我自己的FindThreads.cmake应该尝试添加特定的线程库。

不幸的是,NO_CMAKE_MODULE_PATH没有选择find_package退回到CMake自己的查找模块,并且似乎不可能将搜索路径(例如${CMAKE_ROOT}/Modules)传递给find_package覆盖CMAKE_MODULE_PATH

版本

  • Linux上的CMake 3.5(Ubuntu 16.04)
  • Windows上的
  • CMake 3.14

1 个答案:

答案 0 :(得分:0)

您可以在CMAKE_MODULE_PATH调用之前设置find_package,并在调用之后恢复变量:

# Save old value of CMAKE_MODULE_PATH.
set(CMAKE_MODULE_PATH_OLD ${CMAKE_MODULE_PATH})
# Temporary replace CMAKE_MODULE_PATH
set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules")
# Call find_package() with specific CMAKE_MODULE_PATH set.
find_package(Threads ...)
# Restore CMAKE_MODULE_PATH
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH_OLD})

请注意,FindXXX.cmake与调用方代码在同一作用域中执行,因此即使脚本不再调用{{1},也需要还原CMAKE_MODULE_PATH变量},但只返回即可。

此外,最好使用某些 unique 变量的 name 代替find_package:调用者可能已经出于自己的目的使用了该变量。例如。您可以在变量名称后添加一些后缀,该后缀与您的组织相关或不太可能被其他人使用。