Cmake覆盖给定目标的find_package

时间:2017-05-23 15:37:19

标签: cmake

我们有一个CMakeLists.txt,它将(例如)opencv链接到我们的各种二进制文件。这样做如下:

find_package(OpenCV REQUIRED core imgproc highgui contrib) 
target_link_library(XXX opencv_core)

我们还希望允许构建库的人提供自己的opencv库。似乎可以将-DCMAKE_PREFIX_PATH设置为正确的路径。

cmake -DCMAKE_PREFIX_PATH=".../mybuild/include;.../mybuild/lib" .  

但是我想确保使用的库正好是客户端指定的库(即如果/ mybuild / lib中没有任何内容,则配置失败)。

如何允许构建库的人覆盖使用的库? (如果没有指定,它应该回到find_package-s)

1 个答案:

答案 0 :(得分:3)

简而言之

  1. 如果软件包提供<package>Config.cmake脚本,用户可以指定<package>_DIR CMake变量来查找此脚本。

    find_package() NO_DEFAULT_PATH 选项可能会禁用在该情况下搜索其他地方。

  2. 如果使用Find<package>.cmake脚本搜索包,则如果用户提供提示变量但是错误,则没有(通用)方法禁用搜索其他位置。

  3. 说明

    首先,CMAKE_PREFIX_PATH为所有包提供附加安装树。由于此变量适用于所有 find_package()次调用,因此要求在其下找到所有包是不明智的。

    当谈到指定特定包的安装目录的方法时,我们需要区分两种“查找”脚本:

    1. <package>Config.cmake(或其他一些替代名称,请参阅find_package documentation)。

      这些脚本随包自身一起提供。并且通用方式供用户指定此类软件包的位置:CMake变量<package>_DIR,它应指向具有*Config.cmake脚本的目录。

      虽然find_package()的默认行为是将<package>_DIR变量视为附加提示,但传递 NO_DEFAULT_PATH 选项会禁用所有隐含路径:

      if(<package>_DIR) # Variable is set by the user or by previous `cmake` run.
          # Search only under given directory.
          find_package(<package> NO_DEFAULT_PATH) 
      else()
          # Search everywhere (as documented for 'find_package').
          find_package(<package>) 
      endif()
      
    2. Find<package>.cmake

      此脚本随CMake一起提供,或者应随项目一起提供。

      大多数此类脚本允许使用变量(CMake或环境1)提示包位置,如<package>_DIR<package>_ROOT左右。

      但是,几乎所有此类脚本都将提示变量视为附加搜索位置,因此如果将变量设置为错误值,则只需忽略它。如果不修改脚本,就无法改变这种行为。