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