Spec-Zone.ru › CMake 3.30

AUTOMOC_DEPEND_FILTERS

Новые возможности версии 3.9.

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

Фильтры определяются как KEYWORD;REGULAR_EXPRESSION пары. Сначала содержимое файла проверяется на наличие KEYWORD. Если оно найдено хотя бы один раз, то имена файлов извлекаются путём последовательного поиска REGULAR_EXPRESSION и взятия первой группы совпадений.

Имя файла, найденное в первой группе совпадений, ищется

  • сначала в окрестности исходного файла
  • а затем в каталогах включения целевого файла INCLUDE_DIRECTORIES.

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

Если какой-либо из извлечённых файлов является GENERATED или если он не входит в источники целевого файла, то может потребоваться добавить его в зависимости целевого объекта Целевого объекта <ORIGIN>_autogen. См. AUTOGEN_TARGET_DEPENDS для справки.

По умолчанию AUTOMOC_DEPEND_FILTERS инициализируется из CMAKE_AUTOMOC_DEPEND_FILTERS, который по умолчанию пуст.

Начиная с Qt 5.15.0 эта переменная игнорируется, так как moc может выводить правильные зависимости.

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

Пример 1

Файл заголовка my_class.hpp использует пользовательский макрос JSON_FILE_MACRO, который определён в другом файле заголовка macros.hpp. Мы хотим, чтобы файл moc файла my_class.hpp зависел от аргумента имени файла JSON_FILE_MACRO:

// my_class.hpp
class My_Class : public QObject
{
  Q_OBJECT
  JSON_FILE_MACRO ( "info.json" )
...
};

В CMakeLists.txt мы добавляем фильтр в CMAKE_AUTOMOC_DEPEND_FILTERS следующим образом:

list( APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
  "JSON_FILE_MACRO"
  "[\n][ \t]*JSON_FILE_MACRO[ \t]*\\([ \t]*\"([^\"]+)\""
)

Мы предполагаем, что info.json — это обычный (не GENERATED) файл, который указан в источниках целевого объекта. Поэтому нам не нужно добавлять его в AUTOGEN_TARGET_DEPENDS.

Пример 2

В целевом объекте my_target файл заголовка complex_class.hpp использует пользовательский макрос JSON_BASED_CLASS, который определён в другом файле заголовка macros.hpp:

// macros.hpp
...
#define JSON_BASED_CLASS(name, json) \
class name : public QObject \
{ \
  Q_OBJECT \
  Q_PLUGIN_METADATA(IID "demo" FILE json) \
  name() {} \
};
...
// complex_class.hpp
#pragma once
JSON_BASED_CLASS(Complex_Class, "meta.json")
// end of file

Так как complex_class.hpp не содержит макроса Q_OBJECT, он будет проигнорирован объектом AUTOMOC. Мы меняем это, добавив JSON_BASED_CLASS в CMAKE_AUTOMOC_MACRO_NAMES:

list(APPEND CMAKE_AUTOMOC_MACRO_NAMES "JSON_BASED_CLASS")

Мы хотим, чтобы файл moc файла complex_class.hpp зависел от meta.json. Поэтому мы добавляем фильтр в CMAKE_AUTOMOC_DEPEND_FILTERS:

list(APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
  "JSON_BASED_CLASS"
  "[\n^][ \t]*JSON_BASED_CLASS[ \t]*\\([^,]*,[ \t]*\"([^\"]+)\""
)

Кроме того, мы предполагаем, что meta.json является GENERATED, поэтому мы должны добавить его в AUTOGEN_TARGET_DEPENDS:

set_property(TARGET my_target APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "meta.json")

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

Spec-Zone.ru

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