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 能够输出正确的依赖关系。
有关在 Qt 中使用 CMake 的更多信息,请参阅 cmake-qt(7) 手册。
示例 1¶
头文件“my_class.hpp”使用自定义宏“JSON_FILE_MACRO”,它在另一个头文件“macros.hpp”中定义。我们希望 my_class.hpp 的 moc 文件依赖于 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")
我们希望 complex_class.hpp 的 moc 文件依赖于 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")