Autogen: Documentation update

Closes #15254
This commit is contained in:
Sebastian Holtermann
2017-02-19 20:11:18 +01:00
committed by Brad King
parent cdb72127dc
commit d60f1ddc39
2 changed files with 44 additions and 30 deletions

View File

@@ -63,20 +63,24 @@ If a ``Q_OBJECT`` or ``Q_GADGET`` macro is found in a header file, ``moc``
will be run on the file. The result will be put into a file named according will be run on the file. The result will be put into a file named according
to ``moc_<basename>.cpp``. If the macro is found in a C++ implementation to ``moc_<basename>.cpp``. If the macro is found in a C++ implementation
file, the moc output will be put into a file named according to file, the moc output will be put into a file named according to
``<basename>.moc``, following the Qt conventions. The ``moc file`` may be ``<basename>.moc``, following the Qt conventions. The ``<basename>.moc`` must
included by the user in the C++ implementation file with a preprocessor be included by the user in the C++ implementation file with a preprocessor
``#include``. If it is not so included, it will be added to a separate file ``#include``.
which is compiled into the target.
Included ``moc_*.cpp`` and ``*.moc`` files will be generated in the
``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include`` directory which is
automatically added to the target's :prop_tgt:`INCLUDE_DIRECTORIES`.
(This differs from CMake 3.7 and below; see their documentation for details.)
Not included ``moc_<basename>.cpp`` files will be generated in custom
folders to avoid name collisions and included in a separate
``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/moc_compilation.cpp``
file which is compiled into the target.
The ``moc`` command line will consume the :prop_tgt:`COMPILE_DEFINITIONS` and The ``moc`` command line will consume the :prop_tgt:`COMPILE_DEFINITIONS` and
:prop_tgt:`INCLUDE_DIRECTORIES` target properties from the target it is being :prop_tgt:`INCLUDE_DIRECTORIES` target properties from the target it is being
invoked for, and for the appropriate build configuration. invoked for, and for the appropriate build configuration.
The generated ``moc_*.cpp`` and ``*.moc`` files are placed in the
``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include`` directory which is
automatically added to the target's :prop_tgt:`INCLUDE_DIRECTORIES`.
(This differs from CMake 3.7 and below; see their documentation for details.)
The :prop_tgt:`AUTOMOC` target property may be pre-set for all The :prop_tgt:`AUTOMOC` target property may be pre-set for all
following targets by setting the :variable:`CMAKE_AUTOMOC` variable. The following targets by setting the :variable:`CMAKE_AUTOMOC` variable. The
:prop_tgt:`AUTOMOC_MOC_OPTIONS` target property may be populated to set :prop_tgt:`AUTOMOC_MOC_OPTIONS` target property may be populated to set

View File

@@ -8,31 +8,41 @@ preprocessor automatically, i.e. without having to use the
:module:`QT4_WRAP_CPP() <FindQt4>` or QT5_WRAP_CPP() macro. Currently Qt4 and Qt5 are :module:`QT4_WRAP_CPP() <FindQt4>` or QT5_WRAP_CPP() macro. Currently Qt4 and Qt5 are
supported. supported.
When this property is set ``ON``, CMake will scan the When this property is set ``ON``, CMake will scan the header and
source files at build time and invoke moc accordingly. source files at build time and invoke moc accordingly.
* If an ``#include`` statement like ``#include "moc_foo.cpp"`` is found, * If an ``#include`` statement like ``#include "moc_<basename>.cpp"`` is found,
the ``Q_OBJECT`` class declaration is expected in the header, and the ``Q_OBJECT`` or ``Q_GADGET`` macros are expected in an otherwise empty
``moc`` is run on the header file. A ``moc_foo.cpp`` file will be line of the ``<basename>.h(xx)`` header file. ``moc`` is run on the header file to
generated from the source's header into the generate ``moc_<basename>.cpp`` in the
``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include`` ``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/include`` directory
directory which is automatically added to the target's which is automatically added to the target's
:prop_tgt:`INCLUDE_DIRECTORIES`. This allows the compiler to find the :prop_tgt:`INCLUDE_DIRECTORIES`. This allows the compiler to find the
included ``moc_foo.cpp`` file regardless of the location the original source. included ``moc_<basename>.cpp`` file regardless of the location the
However, if multiple source files in different directories do this then their original source.
generated moc files would collide. In this case a diagnostic will be issued.
* If an ``#include`` statement like ``#include "foo.moc"`` is found, * If an ``#include`` statement like ``#include "<basename>.moc"`` is found,
then a ``Q_OBJECT`` is expected in the current source file and ``moc`` then ``Q_OBJECT`` or ``Q_GADGET`` macros are expected in the current source
is run on the file itself. Additionally, header files with the same file and ``moc`` is run on the source file itself.
base name (like ``foo.h``) or ``_p`` appended to the base name (like
``foo_p.h``) are parsed for ``Q_OBJECT`` macros, and if found, ``moc`` * Header files that are not included by an ``#include "moc_<basename>.cpp"``
is also executed on those files. ``AUTOMOC`` checks multiple header statement are nonetheless scanned for ``Q_OBJECT`` or ``Q_GADGET`` macros.
alternative extensions, such as ``hpp``, ``hxx`` etc when searching The resulting ``moc_<basename>.cpp`` files are generated in custom
for headers. The resulting moc files, which are not included as shown directories and automatically included in the generated
above in any of the source files are included in a generated ``<CMAKE_CURRENT_BINARY_DIR>/<TARGETNAME>_autogen/moc_compilation.cpp`` file,
``moc_compilation.cpp`` file, which is compiled as part of the which is compiled as part of the target. The custom directories help to
target. avoid name collisions for moc files with the same ``<basename>``.
* 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 parsed for ``Q_OBJECT`` or ``Q_GADGET`` macros,
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 :variable:`CMAKE_AUTOMOC` This property is initialized by the value of the :variable:`CMAKE_AUTOMOC`
variable if it is set when a target is created. variable if it is set when a target is created.