Spec-Zone.ru › CMake 3.23

AUTOMOC_DEPEND_FILTERS

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

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

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

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

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

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

Если любой из извлечённых файлов является GENERATED или если он не находится в исходных файлах целевого проекта, то может потребоваться добавить его в зависимости целевого проекта _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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/prop_tgt/AUTOMOC_DEPEND_FILTERS.html

Spec-Zone.ru

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