AUTOMOC_DEPEND_FILTERS

New in version 3.9.

Filter definitions used by AUTOMOC to extract file names from a source file that are registered as additional dependencies for the moc file of the source file.

Filters are defined as KEYWORD;REGULAR_EXPRESSION pairs. First the file content is searched for KEYWORD. If it is found at least once, then file names are extracted by successively searching for REGULAR_EXPRESSION and taking the first match group.

The file name found in the first match group is searched for

  • first in the vicinity of the source file

  • and afterwards in the target’s INCLUDE_DIRECTORIES.

If any of the extracted files changes, then the moc file for the source file gets rebuilt even when the source file itself doesn’t change.

If any of the extracted files is GENERATED or if it is not in the target’s sources, then it might be necessary to add it to the _autogen target dependencies. See AUTOGEN_TARGET_DEPENDS for reference.

By default AUTOMOC_DEPEND_FILTERS is initialized from CMAKE_AUTOMOC_DEPEND_FILTERS, which is empty by default.

From Qt 5.15.0 on this variable is ignored as moc is able to output the correct dependencies.

See the cmake-qt(7) manual for more information on using CMake with Qt.

Example 1

A header file my_class.hpp uses a custom macro JSON_FILE_MACRO which is defined in an other header macros.hpp. We want the moc file of my_class.hpp to depend on the file name argument of JSON_FILE_MACRO:

// my_class.hpp
class My_Class : public QObject
{
  Q_OBJECT
  JSON_FILE_MACRO ( "info.json" )
...
};

In CMakeLists.txt we add a filter to CMAKE_AUTOMOC_DEPEND_FILTERS like this:

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

We assume info.json is a plain (not GENERATED) file that is listed in the target’s source. Therefore we do not need to add it to AUTOGEN_TARGET_DEPENDS.

Example 2

In the target my_target a header file complex_class.hpp uses a custom macro JSON_BASED_CLASS which is defined in an other header 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

Since complex_class.hpp doesn’t contain a Q_OBJECT macro it would be ignored by AUTOMOC. We change this by adding JSON_BASED_CLASS to CMAKE_AUTOMOC_MACRO_NAMES:

list(APPEND CMAKE_AUTOMOC_MACRO_NAMES "JSON_BASED_CLASS")

We want the moc file of complex_class.hpp to depend on meta.json. So we add a filter to CMAKE_AUTOMOC_DEPEND_FILTERS:

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

Additionally we assume meta.json is GENERATED which is why we have to add it to AUTOGEN_TARGET_DEPENDS:

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