AUTOMOC.rst 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. AUTOMOC
  2. -------
  3. Should the target be processed with automoc (for Qt projects).
  4. AUTOMOC is a boolean specifying whether CMake will handle the Qt ``moc``
  5. preprocessor automatically, i.e. without having to use the
  6. :module:`QT4_WRAP_CPP() <FindQt4>` or QT5_WRAP_CPP() macro. Currently Qt4 and Qt5 are
  7. supported.
  8. When this property is set ``ON``, CMake will scan the header and
  9. source files at build time and invoke moc accordingly.
  10. * If an ``#include`` statement like ``#include "moc_<basename>.cpp"`` is found,
  11. the ``Q_OBJECT`` or ``Q_GADGET`` macros are expected in an otherwise empty
  12. line of the ``<basename>.h(xx)`` header file. ``moc`` is run on the header
  13. file to generate ``moc_<basename>.cpp`` in the
  14. ``<AUTOGEN_BUILD_DIR>/include`` directory which is automatically added
  15. to the target's :prop_tgt:`INCLUDE_DIRECTORIES`.
  16. This allows the compiler to find the included ``moc_<basename>.cpp`` file
  17. regardless of the location the original source.
  18. * For multi configuration generators, except Xcode, the include directory is
  19. ``<AUTOGEN_BUILD_DIR>/include_<CONFIG>``.
  20. * See :prop_tgt:`AUTOGEN_BUILD_DIR`.
  21. * If an ``#include`` statement like ``#include "<basename>.moc"`` is found,
  22. then ``Q_OBJECT`` or ``Q_GADGET`` macros are expected in the current source
  23. file and ``moc`` is run on the source file itself.
  24. * Header files that are not included by an ``#include "moc_<basename>.cpp"``
  25. statement are nonetheless scanned for ``Q_OBJECT`` or ``Q_GADGET`` macros.
  26. The resulting ``moc_<basename>.cpp`` files are generated in custom
  27. directories and automatically included in a generated
  28. ``<AUTOGEN_BUILD_DIR>/mocs_compilation.cpp`` file,
  29. which is compiled as part of the target.
  30. * For multi configuration generators, except Xcode, the file names are
  31. ``moc_<basename>_<CONFIG>.cpp`` and
  32. ``<AUTOGEN_BUILD_DIR>/mocs_compilation_<CONFIG>.cpp``.
  33. * The custom directories with checksum
  34. based names help to avoid name collisions for moc files with the same
  35. ``<basename>``.
  36. * See :prop_tgt:`AUTOGEN_BUILD_DIR`.
  37. * Additionally, header files with the same base name as a source file,
  38. (like ``<basename>.h``) or ``_p`` appended to the base name (like
  39. ``<basename>_p.h``), are parsed for ``Q_OBJECT`` or ``Q_GADGET`` macros,
  40. and if found, ``moc`` is also executed on those files.
  41. * ``AUTOMOC`` always checks multiple header alternative extensions,
  42. such as ``hpp``, ``hxx``, etc. when searching for headers.
  43. * ``AUTOMOC`` looks for the ``Q_PLUGIN_METADATA`` macro and reruns the
  44. ``moc`` when the file addressed by the ``FILE`` argument of the macro changes.
  45. This property is initialized by the value of the :variable:`CMAKE_AUTOMOC`
  46. variable if it is set when a target is created.
  47. Additional command line options for moc can be set via the
  48. :prop_tgt:`AUTOMOC_MOC_OPTIONS` property.
  49. By enabling the :variable:`CMAKE_AUTOMOC_RELAXED_MODE` variable the
  50. rules for searching the files which will be processed by moc can be relaxed.
  51. See the documentation for this variable for more details.
  52. The global property :prop_gbl:`AUTOGEN_TARGETS_FOLDER` can be used to group the
  53. automoc targets together in an IDE, e.g. in MSVS.
  54. The global property :prop_gbl:`AUTOGEN_SOURCE_GROUP` can be used to group
  55. files generated by :prop_tgt:`AUTOMOC` together in an IDE, e.g. in MSVS.
  56. Additional ``moc`` dependency file names can be extracted from source code
  57. by using :prop_tgt:`AUTOMOC_DEPEND_FILTERS`.
  58. Source C++ files can be excluded from :prop_tgt:`AUTOMOC` processing by
  59. enabling :prop_sf:`SKIP_AUTOMOC` or the broader :prop_sf:`SKIP_AUTOGEN`.
  60. See the :manual:`cmake-qt(7)` manual for more information on using CMake
  61. with Qt.