Build 如何存储CMake生成设置

Build 如何存储CMake生成设置,build,cmake,binary-reproducibility,Build,Cmake,Binary Reproducibility,在尝试构建使用CMake的项目时,通常需要启用/禁用许多开关 如何存储某些用户为使生成可在另一台计算机上复制而进行的生成设置?是否有某种导出功能或只是复制生成(缓存)文件夹?在另一台计算机上复制此功能的最佳方法是使用-DSETTING=TRUE/FALSE参数 如果这些选项与默认选项有很多不同,那么可以使用脚本构建cmake调用 例: 将helper bash脚本分发到另一台计算机 有一个选项可以预加载脚本,以便使用cmake填充缓存文件 cmake -C <initial-cache&g

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


如何存储某些用户为使生成可在另一台计算机上复制而进行的生成设置?是否有某种导出功能或只是复制生成(缓存)文件夹?

在另一台计算机上复制此功能的最佳方法是使用-DSETTING=TRUE/FALSE参数

如果这些选项与默认选项有很多不同,那么可以使用脚本构建cmake调用

例:


将helper bash脚本分发到另一台计算机

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

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

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

您可以将所有设置放在一个单独的文件中,一天结束时只剩下几个电话:

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
很简单,不是吗

自动生成
初始缓存
文件: 如果您使用的是*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\u cache\u vars.cmake
并像以下那样运行:

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

我会在cmake文件中设置默认值。我怀疑是否有一个通用的方法,并且我不认为复制缓存是一个好主意:缓存变量通常包含的是本地路径。好问题@Antonio,但我不想更改第三方依赖项的CMakeLists.txt。我可以通过命令行更改设置,但保留设置并启动自动生成的好做法是什么?@Antonio您对参数-C给出的.cmake文件的提示有效。我不知道那个女人。ThanksI已经知道这种方法,但是在调用过程中输入的命令行值应该存储在哪里,以使其可复制?Bash脚本。。。不适用于Windows等其他环境,因此这不是独立于平台的解决方案。我找到了一个选项,可以预加载一个脚本,用cmake-C填充缓存文件。这些文件包含set()调用,而不是命令行变量,对于许多设置,以独立于平台的方式处理起来似乎更容易一些。不过,+1,谢谢你的回答。很好的解决方案,谢谢。但不幸的是,无法通过简单的方法创建此缓存。例如:
echo'cmake-DOPTION1=val'>build.sh&&bash build.sh
要简单得多。。。如果cmake维护人员能够创建类似于
cmake--DOPTION1=val
的东西,那就太好了。这将更加清晰。我有一些cmake变量,其中包含
字符。我使用了
sed-r/([A-Za-z_0-9\.]+):([A-z]+)=(.*)/set(\1”\3“CACHE\2”“)/”
# 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()
cd <your build-dir>
cmake -P path\to\get_cache_vars.cmake <outputfile.txt>