AUTOMOC_DEPEND_FILTERS

自版本 3.9 中新增。

过滤器定义由 AUTOMOC 用于从源文件中提取作为源文件 moc 文件额外依赖项注册的文件名。

过滤器被定义为 关键字;正则表达式 对。首先在文件内容中搜索 关键字。如果至少找到一次,则通过连续搜索 正则表达式 并获取第一个匹配组来提取文件名。

在第一个匹配组中找到的文件名被搜索

如果任何提取的文件发生更改,即使源文件本身未更改,也会重建源文件的 moc 文件。

如果任何提取的文件是 GENERATED 或者如果它不在目标资源中,则可能需要将其添加到 目标 <ORIGIN>_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 使用在其他头文件 macros.hpp 中定义的自定义宏 JSON_FILE_MACRO。我们希望 my_class.hppmoc 文件依赖于 JSON_FILE_MACRO 的 filename 参数

// 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.hppmoc 文件依赖于 meta.json。因此,我们向 CMAKE_AUTOMOC_DEPEND_FILTERS 添加了一个过滤器

list(APPEND CMAKE_AUTOMOC_DEPEND_FILTERS
  "JSON_BASED_CLASS"
  "[\n^][ \t]*JSON_BASED_CLASS[ \t]*\\([^,]*,[ \t]*\"([^\"]+)\""
)

此外,我们假设 meta.jsonGENERATED,这就是为什么我们必须将其添加到 AUTOGEN_TARGET_DEPENDS 的原因

set_property(TARGET my_target APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "meta.json")