CMake:如何从环境中添加 include() 的搜索路径?

CMake: How can I add a search path for include() from the environment?

我尝试创建一组 CMake 脚本,这些脚本应该为我们的开发人员组和我们正在进行的所有项目提供一些有用的宏和函数。这些脚本应该推广到所有开发机器 (Win10 & Centos Linux) 并且项目的顶级 CMakeLists.txt 可以包含这个集合。

根据我从 CMake 文档中读到的内容,include() 应该用于导入这些脚本。但是,当然,CMake 不知道文件系统上的位置。文档指向 CMAKE_MODULE_PATH,但我想不出一种在全球范围内从“外部”设置它的方法,例如环境变量或 CMake 配置值。从项目的 CMake 文件中设置它会降低可移植性,尤其是在 Windows 上,用户可能会选择脚本的安装目录。

我也不想把脚本集部署到CMake的安装目录。虽然它可以工作,但将我自己的脚本与 CMake 发行版中的脚本混在一起感觉很脏。

我可以改用 find_package() 并提供包配置文件并使用 CMAKE_PREFIX_PATH 环境变量。但根据我对文档的理解,这意味着构建依赖项,例如图书馆。

我在这里和其他地方也发现了与我类似的问题,但它们通常是关于导入外部项目以构建自己的项目 (-> find_package())。当然,关于编译过程的 include 目录。如果我没有找到合适的问题和答案,请指点我。

那么,让 CMake 知道我的脚本集合的 best/proper 方法是什么?最好在项目的 CMakeLists.txt.

中只需要调用 include()

but I couldn't figure out a way to set it from "outside" on a global scope, e.g. an environment variable or a CMake configuration value.

cmake -D CMAKE_MODULE_PATH=/some/path。适合我:

$ cd /tmp; echo "include(ulumulu)" > CMakeLists.txt ; strace -e trace=file cmake -D CMAKE_MODULE_PATH=/some/path . |& grep access | grep ulumulu
access("/some/path/ulumulu.cmake", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/share/cmake-3.19/Modules/ulumulu.cmake", R_OK) = -1 ENOENT (No such file or directory)
access("/tmp/ulumulu", R_OK)            = -1 ENOENT (No such file or directory)

How can I add a search path for include() from the environment?

我会设置自己的逻辑。与 include($ENV{SEARCH_IN_THIS_PATH}) 一样简单,但使用 cmake -D PATH_TO_MY_LIBRARY=some_pathinclude(${PATH_TO_MY_LIBRARY}).

会更好

I could use find_package() instead and also provide a package config file and use the CMAKE_PREFIX_PATH environment variable. But from my understanding of the docu this is meant to be for build dependencies, e.g. libraries.

模块模式find_package( ... MODULE)用于查找模块。我会用它。而且我也不会将其用于图书馆。

what is the best/proper way to make CMake aware of my script collection?

在 linux 上的 /usr/share/cmake/ 路径安装脚本,我认为 windows 上的 c:/Program Files/CMake/share/cmake(我没有 windows 的经验)并使用 find_package(the_library MODULE).

如果没有,我建议只使用 find_package 并将 Find*.cmake 文件安装到 <prefix>/<name>/cmake/