Bea*_*ker 10 build cmake binary-reproducibility
在尝试构建使用CMake的项目时,通常会有许多swiches启用/禁用.
如何存储某些用户创建的构建设置,以使构建在另一台机器上可重现?是否有某种导出功能或者您只是复制构建(缓存)文件夹?
Bea*_*ker 12
可以选择使用cmake预加载用于填充缓存文件的脚本
cmake -C <initial-cache>
Run Code Online (Sandbox Code Playgroud)
初始缓存是一个包含以下列方式设置的变量的文件,例如安装前缀:
set(CMAKE_INSTALL_PREFIX "/my/install/prefix" CACHE PATH "")
Run Code Online (Sandbox Code Playgroud)
然后在使用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
Run Code Online (Sandbox Code Playgroud)
简单,不是吗?
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
Run Code Online (Sandbox Code Playgroud)
在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()
Run Code Online (Sandbox Code Playgroud)
保存到例如,get_cache_vars.cmake并运行它:
cd <your build-dir>
cmake -P path\to\get_cache_vars.cmake <outputfile.txt>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4595 次 |
| 最近记录: |