首页 > 解决方案 > 覆盖 find_package 的默认搜索顺序

问题描述

我试图避免 cmake find_package 使用系统中的 FindJPEG.cmake,我创建了 FindJPEG.cmake 的副本并对其进行了一些更改,并在其中放入了一条消息(状态“...”)以便能够区分它,类似于:

...
message(STATUS "MY CUSTOM JPEG FIND SCRIPT")
if(NOT JPEG_LIBRARY)
  message(STATUS "MY CUSTOM JPEG FIND SCRIPT >> FIRST TIME FIND LIBRARY")
  find_library(JPEG_LIBRARY_RELEASE NAMES ${jpeg_names})
...

然后我将这个更改的脚本复制到 /my/custom/module/path ,然后我开始我的 cmake 配置:

cmake .. -DCMAKE_MODULE_PATH=/my/custom/module/path;${CMAKE_MODULE_PATH}

如果在我的 CMakeLists.txt 中我只调用 find_package(JPEG) 一切正常(显示自定义消息)但是我在我的 CMakeLists.txt 中添加 Jasper 依赖项,这也取决于 JPEG。所以我只需要做一个 find_package(Jasper) JPEG 依赖将由 jasper 加载。

最后一个问题是我的 FindJPEG.cmake 更改脚本现在没有被调用,我认为这是因为 CMAKE_MODULE_PATH 搜索顺序首先从当前目录开始......并且不遵循我的 cmake 命令行指定的顺序。

我们可以改变这种行为吗,或者如果我解释错了,有人可以更好地解释为什么会这样吗?

谢谢努诺

标签: c++cmake

解决方案


如果您使用自己的自定义模块路径发货,请使用:

SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake)

在您的项目开始时,这是通常的模式,CMake带有新cmake文件所在的文件夹。

然后您可能还想查看一些变量,例如CMAKE_LIBRARY_PATH,它们可能足以更改搜索路径而无需重写新的FindJPEG.cmake.


推荐阅读