CMake Documentation Guide
*************************

The following is a guide to the CMake documentation source for developers.
See documentation on `CMake Development`_ for more information.

.. _`CMake Development`: README.rst

Help
====

The ``Help`` directory contains CMake help manual source files.
They are written using the `reStructuredText`_ markup syntax and
processed by `Sphinx`_ to generate the CMake help manuals.

.. _`reStructuredText`: https://docutils.sourceforge.net/docs/ref/rst/introduction.html
.. _`Sphinx`: https://sphinx-doc.org

To generate the HTML and/or man documentation locally from within the CMake
repository to ``build/html`` and ``build/man`` directories:

.. code-block:: console

  $ cmake -S Utilities/Sphinx -B build -DSPHINX_HTML=ON -DSPHINX_MAN=ON
  $ cmake --build build

Markup Constructs
-----------------

In addition to using Sphinx to generate the CMake help manuals, we
also use a C++-implemented document processor to print documents for
the ``--help-*`` command-line help options.  It supports a subset of
reStructuredText markup.  When authoring or modifying documents,
please verify that the command-line help looks good in addition to the
Sphinx-generated html and man pages.

The command-line help processor supports the following constructs
defined by reStructuredText, Sphinx, and a CMake extension to Sphinx.

..
 Note: This list must be kept consistent with the cmRST implementation.

CMake Domain directives
 Directives defined in the `CMake Domain`_ for defining CMake
 documentation objects are printed in command-line help output as
 if the lines were normal paragraph text with interpretation.

CMake Domain interpreted text roles
 Interpreted text roles defined in the `CMake Domain`_ for
 cross-referencing CMake documentation objects are replaced by their
 link text in command-line help output.  Other roles are printed
 literally and not processed.

``code-block`` directive
 Add a literal code block without interpretation.  The command-line
 help processor prints the block content without the leading directive
 line and with common indentation replaced by one space.

``include`` directive
 Include another document source file.  The command-line help
 processor prints the included document inline with the referencing
 document.

literal block after ``::``
 A paragraph ending in ``::`` followed by a blank line treats
 the following indented block as literal text without interpretation.
 The command-line help processor prints the ``::`` literally and
 prints the block content with common indentation replaced by one
 space.

``note`` directive
 Call out a side note.  The command-line help processor prints the
 block content as if the lines were normal paragraph text with
 interpretation.

``parsed-literal`` directive
 Add a literal block with markup interpretation.  The command-line
 help processor prints the block content without the leading
 directive line and with common indentation replaced by one space.

``productionlist`` directive
 Render context-free grammar productions.  The command-line help
 processor prints the block content as if the lines were normal
 paragraph text with interpretation.

``replace`` directive
 Define a ``|substitution|`` replacement.
 The command-line help processor requires a substitution replacement
 to be defined before it is referenced.

``|substitution|`` reference
 Reference a substitution replacement previously defined by
 the ``replace`` directive.  The command-line help processor
 performs the substitution and replaces all newlines in the
 replacement text with spaces.

``toctree`` directive
 Include other document sources in the Table-of-Contents
 document tree.  The command-line help processor prints
 the referenced documents inline as part of the referencing
 document.

``versionadded``, ``versionchanged`` directives
 Specify that something was added or changed by a named CMake version.
 The command-line help processor prints the block content as if the lines
 were normal paragraph text with interpretation.

Inline markup constructs not listed above are printed literally in the
command-line help output.  We prefer to use inline markup constructs that
look correct in source form, so avoid use of \\-escapes in favor of inline
literals when possible.

Explicit markup blocks not matching directives listed above are removed from
command-line help output.  Do not use them, except for plain ``..`` comments
that are removed by Sphinx too.

Note that nested indentation of blocks is not recognized by the
command-line help processor.  Therefore:

* Explicit markup blocks are recognized only when not indented
  inside other blocks.

* Literal blocks after paragraphs ending in ``::`` but not
  at the top indentation level may consume all indented lines
  following them.

Try to avoid these cases in practice.

CMake Domain
------------

CMake adds a `Sphinx Domain`_ called ``cmake``, also called the
"CMake Domain".  It defines several "object" types for CMake
documentation:

``command``
 A CMake language command.

``cpack_gen``
 A CPack package generator.
 See the `cpack(1)`_ command-line tool's ``-G`` option.

``envvar``
 An environment variable.
 See the `cmake-env-variables(7)`_ manual
 and the `set()`_ command.

``generator``
 A CMake native build system generator.
 See the `cmake(1)`_ command-line tool's ``-G`` option.

``genex``
 A CMake generator expression.
 See the `cmake-generator-expressions(7)`_ manual.

``manual``
 A CMake manual page, like the `cmake(1)`_ manual.

``module``
 A CMake module.
 See the `cmake-modules(7)`_ manual
 and the `include()`_ command.

``policy``
 A CMake policy.
 See the `cmake-policies(7)`_ manual
 and the `cmake_policy()`_ command.

``prop_cache, prop_dir, prop_gbl, prop_sf, prop_inst, prop_test, prop_tgt``
 A CMake cache, directory, global, source file, installed file, test,
 or target property, respectively.  See the `cmake-properties(7)`_
 manual and the `set_property()`_ command.

``variable``
 A CMake language variable.
 See the `cmake-variables(7)`_ manual
 and the `set()`_ command.

Documentation objects in the CMake Domain come from two sources:

1. The CMake extension to Sphinx transforms every document named
   with the form ``Help/<type>/<file-name>.rst`` to a domain object with
   type ``<type>``.  The object name is extracted from the document title,
   which is expected to be of the form::

    <object-name>
    -------------

   and to appear at or near the top of the ``.rst`` file before any other lines
   starting in a letter, digit, ``<``, or ``$``.  If no such title appears
   literally in the ``.rst`` file, the object name is the ``<file-name>``.
   If a title does appear, it is expected that ``<file-name>`` is equal
   to ``<object-name>`` with any ``<`` and ``>`` characters removed,
   or in the case of a ``$<genex-name>`` or ``$<genex-name:...>``, the
   ``genex-name``.

2. `CMake Domain directives`_ may be used in documents to explicitly define
   some object types:

   * `command directive`_
   * `envvar directive`_
   * `genex directive`_
   * `variable directive`_

   Object types for which no directive is available must be defined using
   the document transform above.

CMake Domain Directives
-----------------------

The CMake Domain provides the following directives.

``command`` directive
^^^^^^^^^^^^^^^^^^^^^

Document a "command" object:

.. code-block:: rst

  .. command:: <command-name>

    This indented block documents <command-name>.

The directive requires a single argument, the command name.

``envvar`` directive
^^^^^^^^^^^^^^^^^^^^

Document an "envvar" object:

.. code-block:: rst

  .. envvar:: <envvar-name>

    This indented block documents <envvar-name>.

The directive requires a single argument, the environment variable name.

``genex`` directive
^^^^^^^^^^^^^^^^^^^

Document a "genex" object:

.. code-block:: rst

 .. genex:: <genex-name>

  This indented block documents <genex-name>.

The directive requires a single argument, the generator expression name.

The optional ``:target:`` option allows a custom target name to be specified.
Because this will affect the ability to reference the "genex" object using the
``:genex:`` role, this option should be used very sparingly.

``signature`` directive
^^^^^^^^^^^^^^^^^^^^^^^

Document `CMake Command Signatures <Style: CMake Command Signatures_>`_
within a ``Help/command/<command-name>.rst`` document.

.. code-block:: rst

  .. signature:: <command-name>(<signature>)

    This indented block documents one or more signatures of a CMake command.

The ``signature`` directive requires one argument, the signature summary:

* One or more signatures must immediately follow the ``::``.
  The first signature may optionally be placed on the same line.
  A blank line following the ``signature`` directive will result in a
  documentation generation error: ``1 argument(s) required, 0 supplied``.

* Signatures may be split across multiple lines, but the final ``)`` of each
  signature must be the last character on its line.

* Blank lines between signatures are not allowed.  (Content after a blank line
  is treated as part of the description.)

* Whitespace in signatures is not preserved.  To document a complex signature,
  abbreviate it in the ``signature`` directive argument and specify the full
  signature in a ``code-block`` in the description.

The ``signature`` directive generates a hyperlink target for each signature:

* Default target names are automatically extracted from leading "keyword"
  arguments in the signatures, where a keyword is any sequence of
  non-space starting with a letter.  For example, the signature
  ``string(REGEX REPLACE <match-regex> ...)`` generates the target
  ``REGEX REPLACE``, similar to ``.. _`REGEX REPLACE`:``.

* Custom target names may be specified using a ``:target:`` option.
  For example:

  .. code-block:: rst

    .. signature::
      cmake_path(GET <path-var> ROOT_NAME <out-var>)
      cmake_path(GET <path-var> ROOT_PATH <out-var>)
      :target:
        GET ROOT_NAME
        GET ROOT_PATH

  Provide a custom target name for each signature, one per line.
  The first target may optionally be placed on the same line as ``:target:``.

* If a target name is already in use earlier in the document, no hyperlink
  target will be generated.

* The targets may be referenced from within the same document using
  ```REF`_`` or ```TEXT <REF_>`_`` syntax.  Like reStructuredText section
  headers, the targets do not work with Sphinx ``:ref:`` syntax, however
  they can be globally referenced using e.g. ``:command:`string(APPEND)```.

Although whitespace in the signature is not preserved, by default, line breaks
are suppressed inside of square- or angle-brackets.  This behavior can be
controlled using the ``:break:`` option; note, however, that there is no way
to *force* a line break.  The default value is 'smart'.  Allowable values are:

``all``
  Allow line breaks at any whitespace.

``smart`` (default)
  Allow line breaks at whitespace, except between matched square- or
  angle-brackets.  For example, if a signature contains the text
  ``<input>... [OUTPUT_VARIABLE <out-var>]``, a line break would be allowed
  after ``<input>...`` but not between ``OUTPUT_VARIABLE`` and ``<out-var>``.

``verbatim``
  Allow line breaks only where the source document contains a newline.

The directive treats its content as the documentation of the signature(s).
Indent the signature documentation accordingly.

``variable`` directive
^^^^^^^^^^^^^^^^^^^^^^

Document a "variable" object:

.. code-block:: rst

 .. variable:: <variable-name>

  This indented block documents <variable-name>.

The directive requires a single argument, the variable name.

.. _`Sphinx Domain`: https://sphinx-doc.org/domains.html
.. _`cmake(1)`: https://cmake.org/cmake/help/latest/manual/cmake.1.html
.. _`cmake-env-variables(7)`: https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html
.. _`cmake-generator-expressions(7)`: https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
.. _`cmake-modules(7)`: https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html
.. _`cmake-policies(7)`: https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html
.. _`cmake-properties(7)`: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html
.. _`cmake-variables(7)`: https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
.. _`cmake_policy()`: https://cmake.org/cmake/help/latest/command/cmake_policy.html
.. _`cpack(1)`: https://cmake.org/cmake/help/latest/manual/cpack.1.html
.. _`include()`: https://cmake.org/cmake/help/latest/command/include.html
.. _`set()`: https://cmake.org/cmake/help/latest/command/set.html
.. _`set_property()`: https://cmake.org/cmake/help/latest/command/set_property.html

Cross-References
----------------

Sphinx uses reStructuredText interpreted text roles to provide
cross-reference syntax.  The `CMake Domain`_ provides for each
domain object type a role of the same name to cross-reference it.
CMake Domain roles are inline markup of the forms::

 :type:`name`
 :type:`text <name>`

where ``type`` is the domain object type and ``name`` is the
domain object name.  In the first form the link text will be
``name`` (or ``name()`` if the type is ``command``) and in
the second form the link text will be the explicit ``text``.
For example, the code:

.. code-block:: rst

 * The :command:`list` command.
 * The :command:`list(APPEND)` sub-command.
 * The :command:`list() command <list>`.
 * The :command:`list(APPEND) sub-command <list>`.
 * The :variable:`CMAKE_VERSION` variable.
 * The :prop_tgt:`OUTPUT_NAME_<CONFIG>` target property.

produces:

* The `list()`_ command.
* The `list(APPEND)`_ sub-command.
* The `list() command`_.
* The `list(APPEND) sub-command`_.
* The `CMAKE_VERSION`_ variable.
* The `OUTPUT_NAME_<CONFIG>`_ target property.

Note that CMake Domain roles differ from Sphinx and reStructuredText
convention in that the form ``a<b>``, without a space preceding ``<``,
is interpreted as a name instead of link text with an explicit target.
This is necessary because we use ``<placeholders>`` frequently in
object names like ``OUTPUT_NAME_<CONFIG>``.  The form ``a <b>``,
with a space preceding ``<``, is still interpreted as a link text
with an explicit target.

Additionally, the ``cref`` role may be used to create references
to local targets that have literal styling.  This is especially
useful for referencing a subcommand in the command's documentation.

.. _`list()`: https://cmake.org/cmake/help/latest/command/list.html
.. _`list(APPEND)`: https://cmake.org/cmake/help/latest/command/list.html
.. _`list(APPEND) sub-command`: https://cmake.org/cmake/help/latest/command/list.html
.. _`list() command`: https://cmake.org/cmake/help/latest/command/list.html
.. _`CMAKE_VERSION`: https://cmake.org/cmake/help/latest/variable/CMAKE_VERSION.html
.. _`OUTPUT_NAME_<CONFIG>`: https://cmake.org/cmake/help/latest/prop_tgt/OUTPUT_NAME_CONFIG.html

Style
-----

Style: Section Headers
^^^^^^^^^^^^^^^^^^^^^^

When marking section titles, make the section decoration line as long as
the title text.  Use only a line below the title, not above. For
example:

.. code-block:: rst

  Title Text
  ----------

Capitalize the first letter of each non-minor word in the title.

The section header underline character hierarchy is

* ``#``: Manual group (part) in the master document
* ``*``: Manual (chapter) title
* ``=``: Section within a manual
* ``-``: Subsection or `CMake Domain`_ object document title
* ``^``: Subsubsection or `CMake Domain`_ object document section
* ``"``: Paragraph or `CMake Domain`_ object document subsection
* ``~``: `CMake Domain`_ object document subsubsection

Style: Whitespace
^^^^^^^^^^^^^^^^^

Use two spaces for indentation.  Use two spaces between sentences in
prose.

Style: Line Length
^^^^^^^^^^^^^^^^^^

Prefer to restrict the width of lines to 75-80 columns.  This is not a
hard restriction, but writing new paragraphs wrapped at 75 columns
allows space for adding minor content without significant re-wrapping of
content.

Style: Prose
^^^^^^^^^^^^

Use American English spellings in prose.

Style: Starting Literal Blocks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Prefer to mark the start of literal blocks with ``::`` at the end of
the preceding paragraph. In cases where the following block gets
a ``code-block`` marker, put a single ``:`` at the end of the preceding
paragraph.

Style: CMake Command Signatures
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

A ``Help/command/<command-name>.rst`` document defines one ``command``
object in the `CMake Domain`_, but some commands have multiple signatures.
Use the CMake Domain's `signature directive`_ to document each signature.
Separate signatures from preceding content by a section header.
For example:

.. code-block:: rst

  ... preceding paragraph.

  Normal Libraries
  ^^^^^^^^^^^^^^^^

  .. signature::
    add_library(<lib> ...)

    This signature is used for ...

Use the following conventions in command signature documentation:

* Use an angle-bracket ``<placeholder>`` for arguments to be specified
  by the caller.  Refer to them in prose using
  `inline literal <Style: Inline Literals_>`_ syntax.

* Wrap optional parts with square brackets.

* Mark repeatable parts with a trailing ellipsis (``...``).

The ``signature`` directive may be used multiple times for different
signatures of the same command.

Style: Boolean Constants
^^^^^^^^^^^^^^^^^^^^^^^^

Use "``OFF``" and "``ON``" for boolean values which can be modified by
the user, such as ``POSITION_INDEPENDENT_CODE``.  Such properties
may be "enabled" and "disabled". Use "``True``" and "``False``" for
inherent values which can't be modified after being set, such as the
``IMPORTED`` property of a build target.

Style: Inline Literals
^^^^^^^^^^^^^^^^^^^^^^

Mark up references to keywords in signatures, file names, and other
technical terms with ``inline-literal`` syntax, for example:

.. code-block:: rst

  If ``WIN32`` is used with :command:`add_executable`, the
  :prop_tgt:`WIN32_EXECUTABLE` target property is enabled. That command
  creates the file ``<name>.exe`` on Windows.

Style: Cross-References
^^^^^^^^^^^^^^^^^^^^^^^

Mark up linkable references as links, including repeats.
An alternative, which is used by wikipedia
(`<https://en.wikipedia.org/wiki/WP:REPEATLINK>`_),
is to link to a reference only once per article. That style is not used
in CMake documentation.

Style: Referencing CMake Concepts
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If referring to a concept which corresponds to a property, and that
concept is described in a high-level manual, prefer to link to the
manual section instead of the property. For example:

.. code-block:: rst

  This command creates an :ref:`Imported Target <Imported Targets>`.

instead of:

.. code-block:: rst

  This command creates an :prop_tgt:`IMPORTED` target.

The latter should be used only when referring specifically to the
property.

References to manual sections are not automatically created by creating
a section, but code such as:

.. code-block:: rst

  .. _`Imported Targets`:

creates a suitable anchor.  Use an anchor name which matches the name
of the corresponding section.  Refer to the anchor using a
cross-reference with specified text.

Imported Targets need the ``IMPORTED`` term marked up with care in
particular because the term may refer to a command keyword, a target
property, or a concept.

Where a property, command or variable is related conceptually to others,
by for example, being related to the buildsystem description, generator
expressions or Qt, each relevant property, command or variable should
link to the primary manual, which provides high-level information.  Only
particular information relating to the command should be in the
documentation of the command.

Style: Referencing CMake Domain Objects
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When referring to `CMake Domain`_ objects such as properties, variables,
commands etc, prefer to link to the target object and follow that with
the type of object it is.  For example:

.. code-block:: rst

  Set the :prop_tgt:`AUTOMOC` target property to ``ON``.

Instead of

.. code-block:: rst

  Set the target property :prop_tgt:`AUTOMOC` to ``ON``.

The ``policy`` directive is an exception, and the type us usually
referred to before the link:

.. code-block:: rst

  If policy :policy:`CMP0022` is set to ``NEW`` the behavior is ...

However, markup self-references with ``inline-literal`` syntax.
For example, within the ``add_executable`` command documentation, use

.. code-block:: rst

  ``add_executable``

not

.. code-block:: rst

  :command:`add_executable`

which is used elsewhere.

Modules
=======

The ``Modules`` directory contains CMake-language ``.cmake`` module files.

Module Documentation
--------------------

To document CMake module ``Modules/<module-name>.cmake``, modify
``Help/manual/cmake-modules.7.rst`` to reference the module in the
``toctree`` directive, in sorted order, as::

 /module/<module-name>

Then add the module document file ``Help/module/<module-name>.rst``
containing just the line::

 .. cmake-module:: ../../Modules/<module-name>.cmake

The ``cmake-module`` directive will scan the module file to extract
reStructuredText markup from comment blocks that start in ``.rst:``.
At the top of ``Modules/<module-name>.cmake``, begin with the following
license notice:

.. code-block:: cmake

 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
 # file LICENSE.rst or https://cmake.org/licensing for details.

After this notice, add a *BLANK* line.  Then, add documentation using
a `Bracket Comment`_ of the form:

.. code-block:: cmake

  #[=======================================================================[.rst:
  <module-name>
  -------------

  <reStructuredText documentation of module>
  #]=======================================================================]

Any number of ``=`` may be used in the opening and closing brackets
as long as they match.  Content on the line containing the closing
bracket is excluded if and only if the line starts in ``#``.

Additional such ``.rst:`` comments may appear anywhere in the module file.
All such comments must start with ``#`` in the first column.

For example, a ``FindXxx.cmake`` module may contain:

.. code-block:: cmake

  # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
  # file LICENSE.rst or https://cmake.org/licensing for details.

  #[=======================================================================[.rst:
  FindXxx
  -------

  This is a cool module.
  This module does really cool stuff.
  It can do even more than you think.

  It even needs two paragraphs to tell you about it.
  And it defines the following variables:

  ``VAR_COOL``
    this is great isn't it?
  ``VAR_REALLY_COOL``
    cool right?
  #]=======================================================================]

  <code>

  #[=======================================================================[.rst:
  .. command:: Xxx_do_something

   This command does something for Xxx::

    Xxx_do_something(some arguments)
  #]=======================================================================]
  macro(Xxx_do_something)
    <code>
  endmacro()

Test the documentation formatting by running
``cmake --help-module <module-name>``, and also by enabling the
``SPHINX_HTML`` and ``SPHINX_MAN`` options to build the documentation.
Edit the comments until generated documentation looks satisfactory.  To
have a .cmake file in this directory NOT show up in the modules
documentation, simply leave out the ``Help/module/<module-name>.rst``
file and the ``Help/manual/cmake-modules.7.rst`` toctree entry.

.. _`Bracket Comment`: https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-comment

Module Functions and Macros
---------------------------

Modules may provide CMake functions and macros defined by the `function()`_
and `macro()`_ commands.  To avoid conflicts across modules, name the
functions and macros using the prefix ``<ModuleName>_`` followed by the
rest of the name, where ``<ModuleName>`` is the exact-case spelling of
the module name.  We have no convention for the portion of names after
the ``<ModuleName>_`` prefix.

For historical reasons, some modules that come with CMake do not follow
this prefix convention.  When adding new functions to these modules,
discussion during review can decide whether to follow their existing
convention or to use the module name prefix.

Documentation of public functions and macros should be provided in
the module, typically in the main `module documentation`_ at the top.
For example, a ``MyModule`` module may document a function like this::

  #[=======================================================================[.rst:
  MyModule
  --------

  This is my module.  It provides some functions.

  .. command:: MyModule_Some_Function

    This is some function:

    .. code-block:: cmake

      MyModule_Some_Function(...)
  #]=======================================================================]

Documentation may alternatively be placed just before each definition.
For example, a ``MyModule`` module may document another function like this::

  #[=======================================================================[.rst:
  .. command:: MyModule_Other_Function

    This is another function:

    .. code-block:: cmake

      MyModule_Other_Function(...)
  #]=======================================================================]
  function(MyModule_Other_Function ...)
    # ...
  endfunction()

.. _`function()`: https://cmake.org/cmake/help/latest/command/function.html
.. _`macro()`: https://cmake.org/cmake/help/latest/command/macro.html
