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
中定义。我们希望 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")