build - 如何存储 CMake build设置

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

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

最佳答案

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

cmake -C <initial-cache>

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

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

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

我在生成的源外构建文件夹之外的源旁边创建了一个单独的脚本文件夹。我的包含设置的文件存储在那里,供每个要构建的 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>

https://stackoverflow.com/questions/17588517/

相关文章:

python - 使用 PyInstaller 2.1 和 MEIPASS 错误捆绑数据文件 --o

build - 如何在 MultiJob 插件中传递内部版本号?

c++ - 列出使用的库的链接器选项

c# - TFS 构建失败。对源代码管理中的文件的未解决引用

r - 在 RStudio 中构建包时如何解决 Rd 警告 "missing file link"?

delphi - 在 Delphi XE 中构建事件宏

c++ - qt 构建系统中的 jom 是什么?如何从命令行调用 jom 来构建 qt 项目?

tfs - 调用执行程序时发生异常 'executor://xunit/VsTestRunner2/

visual-studio-2008 - 仅构建启动项目的键盘快捷键?

node.js - 构建工具 : Coffeescript/Node project with mu