Почему в GUI есть две кнопки Configure и Generate, когда CLI выполняет все в одной команде

Я понимаю, что cmake - это генератор сборки. Это означает, что он может генерировать соответствующие сборки (make-файлы, проект Visual Studio и т. Д.) На основе инструкций из CMakeLists.txt. Но я не понимаю две вещи, которые, я думаю, связаны между собой:

  1. Почему в cmake-gui есть две кнопки "Настроить" и "Создать"? В уроках командной строки, которые я прочитал (например, этот), обычный процесс был сделан с одним cmake команда.

  2. Что такое кеш в мире cmake? AFAIK - это состояние, когда нажата кнопка "Настроить", но не нажата кнопка "Создать". Но почему это полезно? Что означают все те переменные, которые появляются после нажатия "Настроить"? Почему я должен их редактировать? Разве единственная разрешенная конфигурация выполняется через CMakeLists.txt?

Спасибо

1 ответ

Решение

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

В CMake GUI эти два этапа можно запускать отдельно. Когда вы запускаете шаг конфигурирования, GUI показывает все переменные кэша (см. Ниже), которые изменили свои значения с момента последнего запуска конфигурирования или с момента запуска CMake GUI, если это первый запуск конфигурирования. Обычной практикой является повторный запуск этапа настройки, пока никакие переменные не будут выделены красным цветом. После того, как конфигурация не оставляет переменных красного цвета, вы можете нажать кнопку "Генерировать", и будут созданы собственные файлы проекта инструмента сборки, и вы можете начинать сборку и т. Д.

Командная строка cmake Утилита не позволяет вам отделить запуск конфигурации и генерировать шаги по отдельности. Скорее, он всегда запускает configure, а затем генерирует.

Для простых проектов различие между конфигурацией и генерацией не так уж важно. Простые учебные пособия часто просто смешивают их вместе, так как читатель может уйти, не понимая различий между основными схемами проекта. Однако есть некоторые особенности CMake, которые основаны на этом различии. В частности, выражения генератора являются функцией времени генерации, когда решения по определенным аспектам сборки откладываются до времени генерации, а не полностью обрабатываются во время конфигурирования. Одним из примеров этого является специфичное для конфигурации содержимое, такое как флаги компилятора, исходные файлы, скомпилированные только для некоторых конфигураций и т. Д. Конфигурация сборки не всегда известна на этапе конфигурирования CMake (например, Xcode и Visual Studio являются инструментами построения нескольких конфигураций, поэтому их может быть несколько, и они выбираются пользователем во время сборки). Шаг генерации будет обрабатывать выражения генератора для каждого типа сборки, и результат может отличаться для каждой конфигурации. Вы также можете найти этот ответ информативным в отношении этого конкретного примера. Для более продвинутого примера метода, который использует различие между этапами настройки и генерации, см. Этот пост, но имейте в виду, что это не распространенный метод.

Что касается вашего другого вопроса о том, что такое кеш, CMake записывает информацию между запусками в кеш переменной. В конце выполнения он обновляет файл с именем CMakeCache.txt в каталоге сборки. Когда вы в следующий раз запустите CMake, он считывает из этого кэша предварительное заполнение различных вещей, поэтому ему не нужно пересчитывать их (например, при поиске библиотек и других пакетов) и чтобы вам не нужно было предоставлять пользовательские параметры, которые вы хотите переопределить. каждый раз. Вы не будете обычно редактировать CMakeCache.txt вручную (хотя это нормально). Скорее, вы можете изменить переменные, которые вы хотите, в CMake GUI, а затем повторно запустить шаг настройки (не забудьте затем также запустить generate для создания обновленных файлов проекта). Вы также можете определить или изменить переменные кэша в командной строке cmake с помощью -D вариант.

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