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

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

normann ★★★
() автор топика
Ответ на: комментарий от 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
()
Ответ на: комментарий от anonymous

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

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