Как сохранить настройки сборки CMake
Часто есть много вариантов включения / выключения при попытке построить проект, использующий CMake.
Как сохранить настройки сборки, сделанные одним пользователем, чтобы воспроизвести сборку на другом компьютере? Есть ли какая-то функциональность экспорта или вы просто копируете папку build (cache)?
3 ответа
Существует возможность предварительно загрузить скрипт для заполнения файла кэша с помощью 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>
Лучший способ воспроизвести это на другом компьютере - использовать аргументы -DSETTING=TRUE/FALSE.
Если у вас есть МНОЖЕСТВО этих опций, отличающихся от значений по умолчанию, вы можете создать свой вызов cmake, используя скрипт.
Пример:
#!/bin/bash
cmake -G "Unix Makefiles \
-DOPTION1=TRUE
-DOPTION2=FALSE
Распространите вспомогательный bash-скрипт на другой компьютер.
В CMake 3.19 добавлена поддержка файлов предустановок на уровне проекта и пользователя . Например, еслиCMakeUserPresets.json
в исходном каталоге верхнего уровня содержалось следующее
{
"version: 4,
"configurePresets": [
{
"name": "localdev",
"displayName": "Local development",
"description": "Local development",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"ENABLE_CCACHE": "ON",
"GO_FASTER": "ON",
"MY_LIB_INCLUDEDIR": "/usr/local/my-lib/include",
"MY_LIB_LIBDIR": "/usr/local/my-lib/lib",
},
"environment": {
"CMAKE_PREFIX_PATH": "/usr/local/foo"
}
}
]
}
вы можете использовать предустановки «localdev», запустивcmake --preset localdev
. На момент написания этой статьи формат все еще меняется с каждой версией, но он более гибкий и всеобъемлющий, чем-C <initial cache>
вариант.