# AUTOMOC

Should the target be processed with automoc (for Qt projects).

`AUTOMOC` is a boolean specifying whether CMake will handle the Qt `moc` preprocessor automatically, i.e. without having to use the `QT4_WRAP_CPP()` or QT5_WRAP_CPP() macro. Currently Qt4 and Qt5 are supported.

When this property is set `ON`, CMake will scan the header and source files at build time and invoke moc accordingly.

- If an `#include` statement like `#include "moc_<basename>.cpp"` is found, a macro from `AUTOMOC_MACRO_NAMES` is expected to appear in the `<basename>.h(xx)` header file. `moc` is run on the header file to generate `moc_<basename>.cpp` in the `<AUTOGEN_BUILD_DIR>/include` directory which is automatically added to the target’s `INCLUDE_DIRECTORIES`. This allows the compiler to find the included `moc_<basename>.cpp` file regardless of the location the original source.
  - For `multi configuration generators`, the include directory is `<AUTOGEN_BUILD_DIR>/include_<CONFIG>`.
  - See `AUTOGEN_BUILD_DIR`.
- If an `#include` statement like `#include "<basename>.moc"` is found, a macro from `AUTOMOC_MACRO_NAMES` is expected to appear in the source file and `moc` is run on the source file itself.
- Header files that are not included by an `#include "moc_<basename>.cpp"` statement are nonetheless scanned for a macro out of `AUTOMOC_MACRO_NAMES`. The resulting `moc_<basename>.cpp` files are generated in custom directories and automatically included in a generated `<AUTOGEN_BUILD_DIR>/mocs_compilation.cpp` file, which is compiled as part of the target.
  - The custom directories with checksum based names help to avoid name collisions for `moc` files with the same `<basename>`.
  - See `AUTOGEN_BUILD_DIR`.
- Additionally, header files with the same base name as a source file, (like `<basename>.h`) or `_p` appended to the base name (like `<basename>_p.h`), are scanned for a macro out of `AUTOMOC_MACRO_NAMES`, and if found, `moc` is also executed on those files.
- `AUTOMOC` always checks multiple header alternative extensions, such as `hpp`, `hxx`, etc. when searching for headers.
- `AUTOMOC` looks for the `Q_PLUGIN_METADATA` macro and reruns the `moc` when the file addressed by the `FILE` argument of the macro changes.

This property is initialized by the value of the `CMAKE_AUTOMOC` variable if it is set when a target is created.

The `moc` executable will be detected automatically, but can be forced to a certain binary using the `AUTOMOC_EXECUTABLE` property.

Additional command line options for `moc` can be set via the `AUTOMOC_MOC_OPTIONS` property.

By enabling the `CMAKE_AUTOMOC_RELAXED_MODE` variable the rules for searching the files which will be processed by `moc` can be relaxed. See the documentation for this variable for more details.

The global property `AUTOGEN_TARGETS_FOLDER` can be used to group the automoc targets together in an IDE, e.g. in MSVS.

The global property `AUTOGEN_SOURCE_GROUP` can be used to group files generated by `AUTOMOC` together in an IDE, e.g. in MSVS.

Additional macro names to search for can be added to `AUTOMOC_MACRO_NAMES`.

Additional `moc` dependency file names can be extracted from source code by using `AUTOMOC_DEPEND_FILTERS`.

Compiler pre definitions for `moc` are written to a `moc_predefs.h` file which is controlled by `AUTOMOC_COMPILER_PREDEFINES`.

Source C++ files can be excluded from `AUTOMOC` processing by enabling `SKIP_AUTOMOC` or the broader `SKIP_AUTOGEN`.

The number of parallel `moc` processes to start can be modified by setting `AUTOGEN_PARALLEL`.

A global `autogen` target that depends on all `AUTOMOC` generated `<ORIGIN>_autogen` targets in the project can be generated by enabling `CMAKE_GLOBAL_AUTOGEN_TARGET`.

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