| 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 | |
| Depending on how Sphinx is installed on the system, optionally configure with | |
| ``-DSPHINX_EXECUTABLE=/path/to/sphinx-build``. | |
| Sphinx Extensions | |
| ----------------- | |
| When building the HTML help, CMake uses the following third-party | |
| `extensions`_: | |
| * `sphinx-copybutton`_: Adds an interactive copy button to the corner of | |
| ``code-block`` directives. To generate the documentation locally with this | |
| extension, configure CMake as above with ``-DSPHINX_HTML_COPYBUTTON=ON``. | |
| Ensure the extension is installed in the same environment (or on the system) | |
| as the ``SPHINX_EXECUTABLE``. | |
| .. _`extensions`: https://www.sphinx-doc.org/en/master/usage/extensions/index.html | |
| .. _`sphinx-copybutton`: https://sphinx-copybutton.readthedocs.io/en/latest/ | |
| 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 |