【问题标题】:How to store CMake build settings如何存储 CMake 构建设置
【发布时间】:2013-07-09 10:30:45
【问题描述】:

在尝试构建使用 CMake 的项目时,通常需要启用/禁用许多开关。

您如何存储某些用户所做的构建设置以使构建可在另一台机器上重现?是否有某种导出功能,或者您只是复制构建(缓存)文件夹?

【问题讨论】:

  • 我会在 cmake 文件中设置默认值。我怀疑是否存在通用方法,并且我认为复制缓存不是一个好主意:缓存变量通常包含的是本地路径。好问题!
  • @Antonio 但我不想更改第 3 方依赖项的 CMakeLists.txt。我可以通过命令行更改设置,但是保留它们并开始自动构建的好(不是说最好的)做法是什么?
  • @Antonio 您使用参数 -C 给出的 .cmake 文件的提示有效。不知道那个参数。谢谢

标签: build cmake binary-reproducibility


【解决方案1】:

有一个选项可以预加载脚本,以便使用 cmake 填充缓存文件

cmake -C <initial-cache>

initial-cache 是一个包含以下列方式设置的变量的文件,例如对于安装前缀:

set(CMAKE_INSTALL_PREFIX "/my/install/prefix" CACHE PATH "")

然后在使用 cmake 填充缓存时传递此文件。很简单,但我不知道,也没有找到好的样品。另外,这是一种独立于平台的方式,而不是编写脚本或批处理文件。

我在生成的源外构建文件夹之外的源旁边创建了一个单独的脚本文件夹。我的包含设置的文件存储在那里,供每个要构建的 lib/可执行文件使用。

您可以将所有设置放入一个单独的文件中,最终只剩下几个调用:

cmake -E make_directory build/somelib
cmake -E chdir build/somelib cmake -C ../../script/cmake/somelib.cmake ../../source/somelib/src
cmake --build build/somelib --target install

很简单,不是吗?

自动生成initial-cache文件:

如果您在 *nix 系统上,您可以在构建目录中运行以下命令:

cmake -N -LA | tail -n+2 | sed -r 's/([A-Za-z_0-9]+):([A-Z]+)=(.*)/set(\1 "\3" CACHE \2 "")/' >cmake-init.txt

在 Windows 上,类似下面的 cmake 脚本应该可以工作:

# list all cache variables
# this should be run in your build dir

set(filename ${CMAKE_ARGV3})
message(STATUS "Writing to ${filename}")
if(NOT filename)
    message(FATAL_ERROR "Must provide an output filename")
    return()
endif()

execute_process(COMMAND "${CMAKE_COMMAND}" "-N" "-LA" OUTPUT_VARIABLE cacheVars)
string(REPLACE "\n" ";" cacheVars ${cacheVars})
file(WRITE ${filename} "")

foreach (variable ${cacheVars})
    string(REGEX REPLACE "([A-Za-z_0-9]+):([A-Z]+)=(.*)$" "set(\\1 \"\\3\" CACHE \\2 \"\")\n" output ${variable})
    if(CMAKE_MATCH_0)
        file(APPEND ${filename} ${output})
    endif()
endforeach()

将其保存到例如get_cache_vars.cmake 并像这样运行它:

cd <your build-dir>
cmake -P path\to\get_cache_vars.cmake <outputfile.txt>

【讨论】:

  • 很好的解决方案,谢谢。但不幸的是,没有办法通过简单的方式创建这个缓存​​。例如:echo 'cmake -DOPTION1=val &lt;source folder&gt;' &gt; build.sh &amp;&amp; bash build.sh 更简单......如果 cmake 维护者能够创建类似cmake -&lt;param for dump cache to initial-cache.cmake&gt; &lt;initial-cache&gt; -DOPTION1=val &lt;source folder&gt; 的东西会很棒 - 它会更清晰。
  • 我有一些 CMake 变量,其中包含 . 字符。我改用sed -r 's/([A-Za-z_0-9\.]+):([A-Z]+)=(.*)/set(\1 "\3" CACHE \2 "")/'
【解决方案2】:

在另一台机器上复制它的最佳方法是使用 -DSETTING=TRUE/FALSE 参数。

如果您有很多与默认选项不同的选项,您可以使用脚本构建您的 cmake 调用。

例如:

#!/bin/bash
cmake -G "Unix Makefiles \
   -DOPTION1=TRUE
   -DOPTION2=FALSE

将帮助程序 bash 脚本分发到另一台机器。

【讨论】:

  • 我已经知道这种方式,但是在哪里存储调用期间输入的命令行值以使其可重现? Bash 脚本...不适用于 Windows 等其他环境,因此这不是独立于平台的解决方案。我找到了一个选项来预加载脚本以使用 cmake -C 填充缓存文件。这些文件包含 set() 调用而不是命令行变量,并且对于以独立于平台的方式的许多设置来说似乎更容易处理。不过,+1 并感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多