Spec-Zone.ru › CMake 3.29

AUTOMOC

Нужно ли обрабатывать целевой объект с помощью auto-moc (для проектов Qt).

AUTOMOC — это булево значение, указывающее, будет ли CMake автоматически обрабатывать препроцессор Qt moc, т.е. без необходимости использовать команды, такие как QT4_WRAP_CPP(), qt5_wrap_cpp() и т.п. В настоящее время поддерживаются версии Qt с 4 по 6.

Это свойство инициализируется значением переменной CMAKE_AUTOMOC, если она установлена при создании целевого объекта.

Когда это свойство установлено ON, CMake будет сканировать файлы заголовков и исходных файлов во время сборки и вызывать moc соответственно.

Обработка файлов заголовков

Во время конфигурации список файлов заголовков, которые должны быть просканированы AUTOMOC, вычисляется из исходных файлов целевого объекта.

  • Все файлы заголовков в исходных файлах целевого объекта добавляются в список сканирования.
  • Для всех файлов исходного кода C++ <source_base>.<source_extension> в исходных файлах целевого объекта CMake ищет

    • файл заголовка с тем же базовым именем (<source_base>.<header_extention>) и
    • файл приватного заголовка с тем же базовым именем и суффиксом _p (<source_base>_p.<header_extention>)

    и добавляет их в список сканирования.

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

  • макрос Qt из AUTOMOC_MACRO_NAMES,
  • дополнительные зависимости файлов из аргумента FILE макроса Q_PLUGIN_METADATA и
  • дополнительные зависимости файлов, обнаруженные фильтрами, определёнными в AUTOMOC_DEPEND_FILTERS.

Если макрос Qt найден, то заголовок будет скомпилирован moc в выходной файл moc_<base_name>.cpp. Полный путь к выходному файлу описан в разделе Расположение выходного файла.

Заголовок будет moc скомпилирован повторно, если файл из дополнительных зависимостей файлов изменится.

Файлы выходного кода заголовков moc moc_<base_name>.cpp могут быть включены в исходные файлы. Более подробная информация об этом содержится в разделе Включение файлов moc заголовков в исходные файлы.

Обработка файлов исходного кода

Во время сборки CMake сканирует каждый неизвестный или изменённый файл исходного кода C++ из исходных файлов целевого объекта для

  • макроса Qt из AUTOMOC_MACRO_NAMES,
  • включений файлов заголовков moc (см. Включение файлов moc заголовков в исходные файлы),
  • дополнительных зависимостей файлов из аргумента FILE макроса Q_PLUGIN_METADATA и
  • дополнительных зависимостей файлов, обнаруженных фильтрами, определёнными в AUTOMOC_DEPEND_FILTERS.

Если макрос Qt найден, то ожидается, что файл исходного кода C++ <base>.<source_extension> также будет содержать оператор включения

#include <<base>.moc> // or
#include "<base>.moc"

Затем файл исходного кода будет скомпилирован moc в выходной файл <base>.moc. Описание полного пути к выходному файлу находится в разделе Расположение выходного файла.

Исходный код будет moc скомпилирован повторно, если файл из дополнительных зависимостей файлов изменится.

Включение файлов moc заголовков в исходные файлы

Файл исходного кода может включать выходной файл moc файла заголовка <header_base>.<header_extension> с помощью оператора включения следующего вида

#include <moc_<header_base>.cpp> // or
#include "moc_<header_base>.cpp"

Если выходной файл moc файла заголовка включен в исходный код, он будет сгенерирован в другом месте, чем если бы он не был включён. Это описано в разделе Расположение выходного файла.

Расположение выходного файла

Включённые выходные файлы moc

Файлы выходного кода moc, включённые в файл исходного кода, будут сгенерированы в

  • <AUTOGEN_BUILD_DIR>/include для генераторов с одной конфигурацией или в
  • <AUTOGEN_BUILD_DIR>/include_<CONFIG> для генераторов multi configuration.

Где <AUTOGEN_BUILD_DIR> - значение свойства целевого объекта AUTOGEN_BUILD_DIR.

Директория включений автоматически добавляется в INCLUDE_DIRECTORIES целевого объекта.

Не включённые выходные файлы moc

Файлы выходного кода moc, которые не включены в файл исходного кода, будут сгенерированы в

  • <AUTOGEN_BUILD_DIR>/<SOURCE_DIR_CHECKSUM> для генераторов с одной конфигурацией или в
  • <AUTOGEN_BUILD_DIR>/include_<CONFIG>/<SOURCE_DIR_CHECKSUM> для генераторов multi configuration.

Где <SOURCE_DIR_CHECKSUM> — контрольная сумма, вычисленная из пути родительской директории относительно файла входного кода moc. Эта схема позволяет использовать файлы входного кода moc с одинаковым именем в разных директориях.

Все не включенные выходные файлы moc будут автоматически включены сгенерированным CMake файлом

  • <AUTOGEN_BUILD_DIR>/mocs_compilation.cpp, или
  • <AUTOGEN_BUILD_DIR>/mocs_compilation_$<CONFIG>.cpp,

который добавляется в исходные файлы целевого объекта.

Обнаружение версии Qt

Для включённых целевых объектов необходимо знать основную и дополнительную версии Qt, с которыми они работают. Основная версия обычно предоставляется свойством INTERFACE_QT_MAJOR_VERSION библиотеки Qt[456]Core, к которой ссылается целевой объект. Для определения дополнительной версии CMake строит список доступных версий Qt из

  • Qt6Core_VERSION_MAJOR и Qt6Core_VERSION_MINOR переменных (обычно устанавливаемых find_package(Qt6...))
  • Qt6Core_VERSION_MAJOR и Qt6Core_VERSION_MINOR свойств директорий
  • Qt5Core_VERSION_MAJOR и Qt5Core_VERSION_MINOR переменных (обычно устанавливаемых find_package(Qt5...))
  • Qt5Core_VERSION_MAJOR и Qt5Core_VERSION_MINOR свойств директорий
  • QT_VERSION_MAJOR и QT_VERSION_MINOR переменных (обычно устанавливаемых find_package(Qt4...))
  • QT_VERSION_MAJOR и QT_VERSION_MINOR свойств директорий

в контексте вызова add_executable() или add_library().

Предполагая, что INTERFACE_QT_MAJOR_VERSION — это корректное число, берется первый элемент в списке с соответствующей основной версией. Если не найдена соответствующая основная версия, генерируется ошибка. Если INTERFACE_QT_MAJOR_VERSION не является корректным числом, берется первый элемент в списке.

Вызов find_package(Qt[456]...) устанавливает переменные QT/Qt[56]Core_VERSION_MAJOR/MINOR. Если вызов находится в другом контексте, отличном от вызовов add_executable() или add_library(), например, в функции, то переменные версии могут быть недоступны для целевого объекта, включённого в AUTOMOC. В этом случае переменные версии можно передать из контекста вызывающего find_package(Qt[456]...) в контекст вызывающего add_executable() или add_library() в качестве свойств директорий. Следующий пример Qt5 демонстрирует эту процедуру.

function (add_qt5_client)
  find_package(Qt5 REQUIRED QUIET COMPONENTS Core Widgets)
  ...
  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    PROPERTY Qt5Core_VERSION_MAJOR "${Qt5Core_VERSION_MAJOR}")
  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    PROPERTY Qt5Core_VERSION_MINOR "${Qt5Core_VERSION_MAJOR}")
  ...
endfunction ()
...
add_qt5_client()
add_executable(myTarget main.cpp)
target_link_libraries(myTarget Qt5::QtWidgets)
set_property(TARGET myTarget PROPERTY AUTOMOC ON)

Модификаторы

AUTOMOC_EXECUTABLE: Исполняемый файл moc будет обнаружен автоматически, но может быть принудительно назначен определённому бинарному файлу с помощью этого свойства целевого объекта.

AUTOMOC_MOC_OPTIONS: Дополнительные параметры командной строки для moc могут быть установлены в этом свойстве целевого объекта.

AUTOMOC_MACRO_NAMES: Этот список имён макросов Qt можно расширить, чтобы искать дополнительные макросы в заголовках и исходных файлах.

AUTOMOC_DEPEND_FILTERS: Имена зависимых файлов moc могут быть извлечены из заголовков или исходных файлов путём определения фильтров имён файлов в этом свойстве целевого объекта.

AUTOMOC_COMPILER_PREDEFINES: Предопределения компилятора для moc записываются в файл moc_predefs.h. Генерация этого файла может быть включена или выключена в этом свойстве целевого объекта.

SKIP_AUTOMOC: Исходные файлы и файлы заголовков могут быть исключены из обработки AUTOMOC путём установки этого свойства файла исходного кода.

SKIP_AUTOGEN: Файлы исходного кода могут быть исключены из обработки AUTOMOC, AUTOUIC и AUTORCC путём установки этого свойства файла исходного кода.

END_OF_DOCUMENT_MARKER

AUTOGEN_SOURCE_GROUP: Это глобальное свойство позволяет группировать файлы, сгенерированные AUTOMOC или AUTORCC, вместе в IDE, например, в MSVS.

AUTOGEN_TARGETS_FOLDER: Это глобальное свойство позволяет группировать цели AUTOMOC, AUTOUIC и AUTORCC вместе в IDE, например, в MSVS.

CMAKE_GLOBAL_AUTOGEN_TARGET: Глобальная autogen цель, которая зависит от всех сгенерированных AUTOMOC или AUTOUIC целевых целей <ORIGIN>_autogen в проекте, будет сгенерирована, когда эта переменная ON.

AUTOGEN_PARALLEL: Это свойство цели управляет количеством moc или uic процессов, которые нужно запустить параллельно во время сборки.

AUTOGEN_COMMAND_LINE_LENGTH_MAX: Это свойство цели устанавливает предел, когда нужно использовать файлы ответов для moc или uic процессов в Windows.

См. cmake-qt(7) руководство для получения дополнительной информации об использовании CMake с Qt.

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/prop_tgt/AUTOMOC.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API