Как сохранить настройки сборки 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>вариант.

Другие вопросы по тегам