【问题标题】:CMake: How can I add a search path for include() from the environment?CMake:如何从环境中添加 include() 的搜索路径?
【发布时间】:2021-02-19 12:55:05
【问题描述】:

我尝试创建一个 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 build-system


【解决方案1】:

但我想不出一种从全局范围的“外部”设置它的方法,例如环境变量或 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/ 路径,我认为在 windows 上 c:/Program Files/CMake/share/cmake(我没有 windows 经验)并使用 find_package(the_library MODULE)

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

【讨论】:

  • 感谢您的意见!在将我的脚本放入 CMake 的模块目录还是从通过环境变量的路径中包含它们之间,我仍然有点犹豫不决。但这其中之一将是我的解决方案。
  • 你也可以find_package( ... HINTS /the/path)。我最近与 Zephyr 合作,看看他们是如何解决的:docs.zephyrproject.org/latest/guides/zephyr_cmake_package.htmlfind_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})find_package 看起来像 包含内容的方式 - 您还可以进行版本检查等。 include() 用于简单文件。
  • 是的,我在文档中找到了这个HINTS 参数。我想我应该将我的简单文件集合(因此include())升级到一个包:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多