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–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/prop_tgt/AUTOMOC_DEPEND_FILTERS.html