【问题标题】:Any way to set CMake variables for all projects?有什么方法可以为所有项目设置 CMake 变量?
【发布时间】:2017-05-16 23:53:02
【问题描述】:

我最近使用 CMake 构建了很多项目,总的来说,我认为它很棒。然而,每当我需要构建一个具有依赖关系的项目时,它很快就会变得很痛苦。

系统安装的依赖关系很好,因为 CMake 的 find_package 系统通常非常适合查找系统安装的包。但是,每当我从源代码构建依赖项时,我发现几乎不可能告诉 CMake 在哪里可以找到这些包。

我一直在搜索FindFoo.cmake 模块,找出它正在查看的特殊提示变量,然后将该变量设置为我的库所在的位置。真正的问题是,因为这些提示变量始终是 CMake 变量,我最终不得不将它们设置在我自己的 CMakeLists.txt 中,这真的很脏,或者将 cmake 包装在脚本文件中以确保它传递了所有正确的提示它需要查找包的变量。

我只会设置环境变量,但大多数FindFoo.cmake 模块实际上并不检查任何环境变量。

我曾考虑使用Package Registry 来帮助解决我的问题,但如果CMake 找到FindFoo.cmake 模块,它甚至不会费心在注册表中查找,并且当FindFoo.cmake 模块失败时CMake 就会放弃.

我正在寻找的是在 CMake 中的“用户范围”或“系统范围”设置变量的某种方法,因此我可以在一个地方指定我的提示变量,而不是跨一堆项目和脚本文件。不幸的是,我似乎无法找到任何此类功能。

我在 Windows 上,但我正在寻找尽可能通用的解决方案,因为我将来可能不会。

【问题讨论】:

  • 您可以定义一个环境变量 FOO 包含您要使用的所有路径,并通过 -DCMAKE_PREFIX_PATH=$FOO 将此变量传递给 CMake。
  • @usr1234567 我在寻找解决方案时不知何故错过了 CMAKE_PREFIX_PATH 变量。我不知道它是否正是我想要的,但它似乎很有用。

标签: cmake


【解决方案1】:

这是通过cmake-gui 实现的:您设置路径,它将保留在项目的缓存中,除非缓存被删除。

如果您在命令行中使用 CMake,则可以将路径作为参数:

cmake -DCMAKE_PREFIX_PATH=/some/path -DFOO_ROOT=/some/path/to/foo

另一种选择是将路径设置在单独的文件中,以包含在您的CMakeLists.txt 中。您可以检查文件是否存在,如果不可用,则生成带有警告消息的模板文件。像这样的:

set(MY_CMAKE_PATHS "${PROJECT_BINARY_DIR}/my-cmake.paths")

if(EXISTS "${MY_CMAKE_PATHS}")
    include("${MY_CMAKE_PATHS}")
else()
    file(COPY "${PROJECT_SOURCE_DIR}/my-cmake.paths" DESTINATION "${PROJECT_SOURCE_DIR}"
    message(FATAL_ERROR
        "CMake paths are not available. "
        "Please edit the file \"${MY_CMAKE_PATHS}\" with the appropriate values."
    )
endif()

${PROJECT_SOURCE_DIR}/my-cmake.paths 是这样的:

set(CMAKE_PREFIX_PATH ) # some comment to explain what is expected here
set(FOO_ROOT )          # some comment...

由您来维护包含您想要填充的所有变量的文件,并使用适当的 cmets 来帮助用户使用它。

路径文件在此处复制到PROJECT_BINARY_DIR,但您也可以复制并在所有项目的“通用”路径中使用它。

【讨论】:

  • 编辑 CMakeCache 或在命令行上指定值基本上是我现在正在做的事情,但我发现每个项目都这样做很乏味且容易出错。您的其余答案需要修改CMakeLists.txt,这感觉很脏,所以我试图避免。但是,您的回答确实给了我一个很好的主意,我要尝试一下,所以谢谢。 :)
【解决方案2】:

@wasthehelpful 的回答提到创建一个my-paths.cmake 文件,然后将其导入我的项目中。这几乎是一个完美的解决方案,只是它仍然需要修改项目。但是,在阅读了 cmake 手册之后,我意识到它可以选择预加载“初始缓存”.cmake 文件。

所以我在一个易于访问的位置创建了一个local.cmake 文件,其中包含如下条目:

set(ZLIB_ROOT "`~/builds/zlib-1.2.8" CACHE PATH "")
set(PNG_ROOT "~/builds/libpng-1.6.27" CACHE PATH "")
set(OSG_DIR "~/builds/OpenSceneGraph_3.4.0" CACHE PATH "")

然后,为了配置我的项目,我像这样调用cmake

cmake -C "~/local.cmake" ..

此解决方案仍需要指定命令行参数,但它是单个参数,应该很容易记住。

(我将暂时不回答这个问题,以防有人提出更好的解决方案。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多