Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行CMake';我自己的查找模块中的默认查找模块是否具有相同的名称?_Cmake - Fatal编程技术网

如何执行CMake';我自己的查找模块中的默认查找模块是否具有相同的名称?

如何执行CMake';我自己的查找模块中的默认查找模块是否具有相同的名称?,cmake,Cmake,出于某种原因,我想扩展一个find模块(在我的例子中是FindThreads),以便在CMake的FindThreads失败时执行一些特定的操作。对于我们软件系统其他部分的普通开发人员来说,这应该是透明的,这样他/她可以像往常一样调用find\u包(线程),所以我不想给我自己的find模块起一个独占的名字 我的想法是将我自己的FindThreads.cmake添加到cmake\u模块路径中的文件夹中。因为CMAKE\u模块\u路径具有优先级find\u包(线程)将执行我自己的FindThread

出于某种原因,我想扩展一个find模块(在我的例子中是
FindThreads
),以便在CMake的
FindThreads
失败时执行一些特定的操作。对于我们软件系统其他部分的普通开发人员来说,这应该是透明的,这样他/她可以像往常一样调用
find\u包(线程)
,所以我不想给我自己的find模块起一个独占的名字

我的想法是将我自己的
FindThreads.cmake
添加到
cmake\u模块路径中的文件夹中。因为
CMAKE\u模块\u路径
具有优先级
find\u包(线程)
将执行我自己的
FindThreads.CMAKE

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

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

不幸的是,
find_-package
没有返回到CMAKE自己的查找模块的选项
no_-CMAKE_-MODULE_-PATH
,似乎无法将搜索路径(例如
${CMAKE-ROOT}/modules
)传递到
find_-package
以覆盖
CMAKE_-MODULE-PATH

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

您可以在调用前设置
CMAKE\u模块路径
,然后在调用后恢复变量:

# 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
与调用方代码在同一范围内执行,因此即使脚本不再调用
find\u package
而只是返回,也需要还原
cmake\u MODULE\u PATH
变量


此外,最好使用某个唯一变量的名称,而不是
CMAKE\u MODULE\u PATH\u OLD
:调用方可能已经出于自己的目的使用了该变量。例如,您可以在变量名称中添加一些与您的组织相关或不太可能被其他人使用的后缀。

您可以在调用前设置
CMAKE\u模块路径
,调用后恢复变量:

# 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
与调用方代码在同一范围内执行,因此即使脚本不再调用
find\u package
而只是返回,也需要还原
cmake\u MODULE\u PATH
变量


此外,最好使用某个唯一变量的名称,而不是
CMAKE\u MODULE\u PATH\u OLD
:调用方可能已经出于自己的目的使用了该变量。例如,您可以在变量名称中添加一些与您的组织相关或不太可能被其他人使用的后缀。

谢谢,虽然我希望解决方案不会出现这种临时上下文更改,但这应该会起作用。我对此感到有点不舒服,因为未来的开发人员可能不会注意到这一点。为了避免
CMAKE\u MODULE\u PATH\u OLD的范围问题,为了安全起见,我将尝试将整个代码放在一个函数中。谢谢,这应该会起作用,尽管我希望没有这种临时上下文更改的解决方案。我对此感到有点不舒服,因为未来的开发人员可能不会注意到这一点。为了避免
CMAKE\u MODULE\u PATH\u OLD的范围问题,为了安全起见,我将尝试将整个代码放在函数中。