由于某种原因,如果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
。
答案 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
:调用者可能已经出于自己的目的使用了该变量。例如。您可以在变量名称后添加一些后缀,该后缀与您的组织相关或不太可能被其他人使用。