微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我尝试创建一组 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 了解我的脚本集合的最佳/正确方法是什么?最好是在项目的 CMakeLists.txt 中只需要调用 include()

解决方法

但我想不出一种方法可以从全局范围的“外部”设置它,例如环境变量或 CMake 配置值。

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)

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

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

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

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

让 CMake 了解我的脚本集合的最佳/正确方法是什么?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?