AUTOMOC
Нужно ли обрабатывать целевой объект с помощью авто-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
#include <<base>.moc> // or #include "<base>.moc"
Затем исходный файл будет скомпилирован moc в выходной файл <base>.moc. Описание полного пути к выходному файлу находится в разделе Расположение выходного файла.
Исходный файл будет moc скомпилирован повторно, если изменится файл из дополнительных зависимостей файлов.
Включение файлов moc заголовков в исходные файлы
Исходный файл может включать выходной файл moc файла заголовка <header_base>.<header_extension> с помощью оператора include следующего вида
#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
Целевые объекты, для которых AUTOMOC включены, должны знать, с какой основной и дополнительной версией 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 путём установки этого свойства файла исходного кода.
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.31/prop_tgt/AUTOMOC.html