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 см. в руководстве cmake-qt(7).
Пример 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–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/AUTOMOC_DEPEND_FILTERS.html