Перемещение параметров CMake из командной строки в CMakeLists.txt верхнего уровня

Я собираю DCMTK с помощью командной строки, используя следующую команду:

cmake -DBUILD_APPS=BOOL:OFF ../latest_dcmtk

Я хочу переместить параметр BUILD_APPS из командной строки в файл конфигурации CMakeLists.txt верхнего уровня. Независимо от того, как я пытаюсь установить параметр BUILD_APPS в файле конфигурации верхнего уровня, я никогда не получу правильное поведение, если я не установлю явно параметр BUILD_APPS из командной строки.

Есть ли способ явно установить параметры командной строки из файла CMakeLists.txt верхнего уровня?

Я позаимствовал это из источников DCMTK, и это не работает:

SET (BUILD_APPS OFF CACHE BOOL "" FORCE)                                                             
MESSAGE ("-- BUILD_APPS is set to " ${BUILD_APPS})

Когда я смотрю на файл CMakeCache.txt, сгенерированный командой SET выше, я вижу, что опция установлена ​​правильно:

./CMakeCache.txt:BUILD_APPS:BOOL=OFF

К сожалению, опция не работает.

1 ответ

Вообще говоря, есть две вещи, которые вы должны иметь в виду при использовании CMake:

  1. CMake - это язык сценариев, поэтому весь код обрабатывается последовательно
  2. Кэш переменной CMake предназначен для сохранения значений между двумя запусками.

Так что я согласен с @Tsyvarev и @usr1234567, что это, скорее всего, проблема заказа:

  • Вы должны сделать set(BUILD_APPS OFF CACHE BOOL "" FORCE) прежде чем вы / код проверяет if (BUILD_APPS)
  • Вы должны проверить, что нет нормальной переменной set(BUILD_APPS ...) потом в твоем главном CMakeLists.txt скрытие вашей кэшированной переменной
  • Что бы ни было в CMakeCache.txt файл - это только состояние этих переменных после того, как вся обработка вашего кода завершена (в конце вашего основного CMakeLists.txt)

Я попробовал еще раз и -D принудительно делает запись в Cache. Так что не должно быть никакой разницы между использованием -D опция командной строки и set(... CACHE ... FORCE), Просто вы не можете использовать их в комбинации (позднее они всегда будут перезаписывать любую заданную опцию командной строки).

Пожалуйста, попробуйте добавить variable_watch(BUILD_APPS) в верхней части основного CMakeLists.txt найти кодовую часть, которая скрывает / перезаписывает переменную.

Рекомендации

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