Как сохранить настройки сборки CMake

часто есть много swiches для включения / отключения при попытке построить проект, который использует CMake.

Как вы храните настройки сборки, сделанные одним пользователем, чтобы сделать сборку воспроизводимой на другой машине? Есть ли какая-то функциональность экспорта или вы просто копируете папку build (cache)?

2 ответов


есть возможность предварительно загрузить скрипт для заполнения файла кэша cmake с помощью

cmake -C <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

просто, не так ли?

автоматически генерировать :

если вы находитесь в системе *nix, вы можете запустить следующее внутри своей сборки реж:

cmake -N -LA | tail -n+2 | sed -r 's/([A-Za-z_0-9]+):([A-Z]+)=(.*)/set( "" CACHE  "")/' >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 args.

Если у вас есть много этих параметров, отличающихся от значения по умолчанию, вы можете создать вызов cmake с помощью скрипта.

Ex:

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

распространите вспомогательный скрипт bash на другую машину.