LINUX.ORG.RU

Можно ли опираться на порядок объявления переменных в пресетах CMake?

 


0

1

Пресеты (предустановки, presets) cmake. Речь о поле «cacheVariables» пресета конфигурации. Существует ли в объявлении этих переменных стабильная последовательность их объявления, такая что бы на неё можно было опереться при последующем объявлении следующих переменных, используя значения первых для определения значения последних (как в императивных языках программирования)? Допустим в одной строчке я определил переменную VAR1 с каким-то значением, и хочу прочитать её значение в другой последующей строчке, где, например, определяю другую переменную VAR2, для задания её значения, например как «value»: «${VAR1}»:

"cacheVariables": {
    "VAR1": "linux.org.ru",
    "VAR2": "${VAR1}"
},

Могу ли я использовать этот подход для определения входных переменных в CMakeUserPresets.json и их чтения в CMakePresets.json?

★★★
Ответ на: комментарий от anonymous

Т.е. я даже не могу определить пресет в CMakeUserPresets.json, который потом можно было бы унаследовать в CMakePresets.json?

normann ★★★
() автор топика
Ответ на: комментарий от normann

Ну это логично. Базовые предметы в CMakePresets.json, их рекомендуют включать в гит. А пользовательские CMakeUserPresets.json у каждого свои.

anonymous
()
Ответ на: комментарий от anonymous

А как ещё можно задать, к примеру, путь «toolchainFile», который на каждой машине свой, не прибегая к переменным окружения? Или переменные окружения это единственный способ?

normann ★★★
() автор топика
Ответ на: комментарий от normann
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake ...
anonymous
()
Ответ на: комментарий от anonymous

Почитайте про наследование пресетов, ключевое слово inherit.

Ну там написано:

Presets in CMakePresets.json may not inherit from presets in CMakeUserPresets.json

Получается нельзя.

Тогда в чём смысл?

normann ★★★
() автор топика
Последнее исправление: normann (всего исправлений: 1)
Ответ на: комментарий от normann

Не вижу проблемы.

  • В CMakePresets.json определяете пресет foo, в котором задаёте всё кроме пути к тулчену.
  • В CMakeUserPresets.json определяете пресет bar, в котором задаёте inherit=foo и путь к тулчену.
  • Делаете cmake --preset=bar ..
anonymous
()
Ответ на: комментарий от anonymous

Да, но тогда получается у нас нет сборки по умолчанию и возможности кастомизировать один и тот же пресет - пресет и название конфигурации придётся менять от среды к среде. Нельзя просто подкладывать изменения в виде файла. По моему это нагрузка на пользователя, он должен держать это в голове и производить незибежные манипуляции после каждого клонирования из репозитория.

normann ★★★
() автор топика

нет, так нельзя делать. Таким способом можно ссылаться только на небольшой белый список переменных, но не на те которые ты сам задаешь в cacheVariables.

воркэраунд - задать VAR1 в переменных среды, тогда должно сработать.

"environment": {
  "VAR1": "linux.org.ru"
},
"cacheVariables": {
  "VAR2": "$env{VAR1}"
}

собственно читайте доки, там все написано: https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#macro-expansion

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от normann

Если исключить CMakeUserPresets.json из системы контроля версий, то пользователь один раз это настроит и дальше будет только обновлять ветку и пересобирать прогу. Продвинутый пользователь напишет памятку или даже скрипт в три строки.

И если вы хотите упростить жизнь пользователю, напишите подробную инструкцию по сборке. Ещё лучше – сделайте сборки для популярных платформ.

anonymous
()
Ответ на: комментарий от normann

путь «toolchainFile», который на каждой машине свой

Почему toolchainFile не лежит в папке cmake проекта?

anonymous
()
Ответ на: комментарий от anonymous

Почему toolchainFile не лежит в папке cmake проекта?

Он лежит, например, в каталоге экземпляра vcpkg. При пользовании vcpkg вроде такая рекомендация.

normann ★★★
() автор топика
Ответ на: комментарий от normann

То есть для сборки программы нужен тулчнйн, cmake, git, vcpkg и это ничуть не смущает простого пользователя?

anonymous
()
Ответ на: комментарий от anonymous

Ну с этим всем возьни на один раз, особенно если это всё втоматизировано, в противовес тому, что нужно делать каждый раз, когда клонируешь себе репозиторий с исходным кодом на новое место.

normann ★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.