使用自定义目录提示Find<name>.cmake文件

11
在CMake中,是否有一种方法可以使内置的查找脚本优先考虑我们指定的自定义目录?特别是在Windows中,模块查找脚本通常无法检测到例如Visual Studio目录中的模块。因此,我通常必须手动设置外部库的路径,这非常繁琐。相反,我希望这些脚本首先查找一个自定义目录,比如主项目中的“dependencies”文件夹,这样我就可以直接将这些外部库放在该文件夹中,这比将它们放在VC文件夹中或手动设置路径要容易得多。
1个回答

23

设置 CMAKE_PREFIX_PATH 变量正是为了这些目的:提示 find_* 函数搜索所需项的位置。

虽然该变量的描述没有提到 find_package 函数,但该变量间接影响它:大多数 Find<name>.cmake 脚本使用 find_libraryfind_path 函数。请注意,所有的 find_* 函数都有精确的搜索算法,并且使用 CMAKE_PREFIX_PATH 构造的路径会在系统路径之前进行检查。

此外,CMAKE_PREFIX_PATH 还会影响其他一些搜索过程。例如,如果第三方包提供了 <name>Config.cmake 脚本而非 Find<name>.cmake 脚本,则使用该变量搜索该脚本。 pkg_check_modules 也使用 CMAKE_PREFIX_PATH 搜索描述包的 .pc 文件。

CMAKE_PREFIX_PATH 变量可以作为环境变量设置(以平台特定和用法特定的方式),也可以作为 cmake 调用的参数:

cmake -DCMAKE_PREFIX_PATH=<additional-path> <other-parameters>

或者在 CMakeLists.txt 文件中。在最后一种情况下,最好追加搜索目录,这样你的软件包的用户也可以设置变量以搜索未随项目一起提供的软件包:

list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/dependencies")
请注意,变量CMAKE_PREFIX_PATH不会影响查找FindXXX.cmake脚本本身。如果要指定脚本所在的目录,请使用CMAKE_MODULE_PATH变量。

谢谢,它执行得非常好。很奇怪这么重要的选项没有在帮助查找脚本中注明。它是否有任何副作用会“破坏”任何脚本? - deniz
只要在CMAKE_PREFIX_PATH中列出的目录中存在部分或损坏的安装,或者在标准搜索后缀(lib/、lib64/、include/等)下存在无关文件,设置此变量不应该影响任何find脚本。如果确实有影响,那么这是find脚本本身的问题。最糟糕的情况是脚本可能会忽略在CMAKE_PREFIX_PATH中列出的目录。在这种情况下,应检查具体的find脚本。 - Tsyvarev
1
我想补充一点,如果你只是搜索Find<name>.cmake文件,你应该使用CMAKE_MODULE_PATH - Mizux
我想补充一下,关于 Find<name>.cmake 脚本的更多信息,我建议阅读 CMake 手册中的 find-modules 页面。 - jrh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接