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

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:

::

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

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

::

  #[=======================================================================[.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:

::

  # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
  # file Copyright.txt 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
