Перемещение параметров 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:
- CMake - это язык сценариев, поэтому весь код обрабатывается последовательно
- Кэш переменной 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
найти кодовую часть, которая скрывает / перезаписывает переменную.
Рекомендации