| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144 |
- .. cmake-manual-description: CMake Developer Reference
- cmake-developer(7)
- ******************
- .. only:: html or latex
- .. contents::
- Introduction
- ============
- This manual is intended for reference by developers modifying the CMake
- source tree itself.
- Permitted C++ Subset
- ====================
- CMake is required to build with ancient C++ compilers and standard library
- implementations. Some common C++ constructs may not be used in CMake in order
- to build with such toolchains.
- std::vector::at
- ---------------
- The ``at()`` member function of ``std::vector`` may not be used. Use
- ``operator[]`` instead:
- .. code-block:: c++
- std::vector<int> someVec = getVec();
- int i1 = someVec.at(5); // Wrong
- int i2 = someVec[5]; // Ok
- std::string::append and std::string::clear
- ------------------------------------------
- The ``append()`` and ``clear()`` member functions of ``std::string`` may not
- be used. Use ``operator+=`` and ``operator=`` instead:
- .. code-block:: c++
- std::string stringBuilder;
- stringBuilder.append("chunk"); // Wrong
- stringBuilder.clear(); // Wrong
- stringBuilder += "chunk"; // Ok
- stringBuilder = ""; // Ok
- std::set const iterators
- ------------------------
- The ``find()`` member function of a ``const`` ``std::set`` instance may not be
- used in a comparison with the iterator returned by ``end()``:
- .. code-block:: c++
- const std::set<std::string>& someSet = getSet();
- if (someSet.find("needle") == someSet.end()) // Wrong
- {
- // ...
- }
- The return value of ``find()`` must be assigned to an intermediate
- ``const_iterator`` for comparison:
- .. code-block:: c++
- const std::set<std::string>& someSet;
- const std::set<std::string>::const_iterator i = someSet.find("needle");
- if (i != propSet.end()) // Ok
- {
- // ...
- }
- Char Array to ``string`` Conversions with Algorithms
- ----------------------------------------------------
- In some implementations, algorithms operating on iterators to a container of
- ``std::string`` can not accept a ``const char*`` value:
- .. code-block:: c++
- const char* dir = /*...*/;
- std::vector<std::string> vec;
- // ...
- std::binary_search(vec.begin(), vec.end(), dir); // Wrong
- The ``std::string`` may need to be explicitly constructed:
- .. code-block:: c++
- const char* dir = /*...*/;
- std::vector<std::string> vec;
- // ...
- std::binary_search(vec.begin(), vec.end(), std::string(dir)); // Ok
- std::auto_ptr
- -------------
- Some implementations have a ``std::auto_ptr`` which can not be used as a
- return value from a function. ``std::auto_ptr`` may not be used. Use
- ``cmsys::auto_ptr`` instead.
- std::vector::insert and std::set
- --------------------------------
- Use of ``std::vector::insert`` with an iterator whose ``element_type`` requires
- conversion is not allowed:
- .. code-block:: c++
- std::set<const char*> theSet;
- std::vector<std::string> theVector;
- theVector.insert(theVector.end(), theSet.begin(), theSet.end()); // Wrong
- A loop must be used instead:
- .. code-block:: c++
- std::set<const char*> theSet;
- std::vector<std::string> theVector;
- for(std::set<const char*>::iterator li = theSet.begin();
- li != theSet.end(); ++li)
- {
- theVector.push_back(*li);
- }
- std::set::insert
- ----------------
- Use of ``std::set::insert`` is not allowed with any source container:
- .. code-block:: c++
- std::set<cmTarget*> theSet;
- theSet.insert(targets.begin(), targets.end()); // Wrong
- A loop must be used instead:
- .. code-block:: c++
- ConstIterator it = targets.begin();
- const ConstIterator end = targets.end();
- for ( ; it != end; ++it)
- {
- theSet.insert(*it);
- }
- .. MSVC6, SunCC 5.9
- Template Parameter Defaults
- ---------------------------
- On ancient compilers, C++ template must use template parameters in function
- arguments. If no parameter of that type is needed, the common workaround is
- to add a defaulted pointer to the type to the templated function. However,
- this does not work with other ancient compilers:
- .. code-block:: c++
- template<typename PropertyType>
- PropertyType getTypedProperty(cmTarget* tgt, const char* prop,
- PropertyType* = 0) // Wrong
- {
- }
- .. code-block:: c++
- template<typename PropertyType>
- PropertyType getTypedProperty(cmTarget* tgt, const char* prop,
- PropertyType*) // Ok
- {
- }
- and invoke it with the value ``0`` explicitly in all cases.
- std::min and std::max
- ---------------------
- ``min`` and ``max`` are defined as macros on some systems. ``std::min`` and
- ``std::max`` may not be used. Use ``cmMinimum`` and ``cmMaximum`` instead.
- size_t
- ------
- Various implementations have differing implementation of ``size_t``. When
- assigning the result of ``.size()`` on a container for example, the result
- should be assigned to ``size_t`` not to ``std::size_t``, ``unsigned int`` or
- similar types.
- Templates
- ---------
- Some template code is permitted, but with some limitations. Member templates
- may not be used, and template friends may not be used.
- Adding Compile Features
- =======================
- CMake reports an error if a compiler whose features are known does not report
- support for a particular requested feature. A compiler is considered to have
- known features if it reports support for at least one feature.
- When adding a new compile feature to CMake, it is therefore necessary to list
- support for the feature for all CompilerIds which already have one or more
- feature supported, if the new feature is available for any version of the
- compiler.
- When adding the first supported feature to a particular CompilerId, it is
- necessary to list support for all features known to cmake (See
- :variable:`CMAKE_C_COMPILE_FEATURES` and
- :variable:`CMAKE_CXX_COMPILE_FEATURES` as appropriate), where available for
- the compiler.
- It is sensible to record the features for the most recent version of a
- particular CompilerId first, and then work backwards. It is sensible to
- try to create a continuous range of versions of feature releases of the
- compiler. Gaps in the range indicate incorrect features recorded for
- intermediate releases.
- Generally, features are made available for a particular version if the
- compiler vendor documents availability of the feature with that
- version. Note that sometimes partially implemented features appear to
- be functional in previous releases (such as ``cxx_constexpr`` in GNU 4.6,
- though availability is documented in GNU 4.7), and sometimes compiler vendors
- document availability of features, though supporting infrastructure is
- not available (such as ``__has_feature(cxx_generic_lambdas)`` indicating
- non-availability in Clang 3.4, though it is documented as available, and
- fixed in Clang 3.5). Similar cases for other compilers and versions
- need to be investigated when extending CMake to support them.
- When a vendor releases a new version of a known compiler which supports
- a previously unsupported feature, and there are already known features for
- that compiler, the feature should be listed as supported in CMake for
- that version of the compiler as soon as reasonably possible.
- Standard-specific/compiler-specific variables such
- ``CMAKE_CXX98_COMPILE_FEATURES`` are deliberately not documented. They
- only exist for the compiler-specific implementation of adding the ``-std``
- compile flag for compilers which need that.
- 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`: http://docutils.sourceforge.net/docs/ref/rst/introduction.html
- .. _`Sphinx`: http://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.
- 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.
- ``generator``
- A CMake native build system generator.
- See the :manual:`cmake(1)` command-line tool's ``-G`` option.
- ``manual``
- A CMake manual page, like this :manual:`cmake-developer(7)` manual.
- ``module``
- A CMake module.
- See the :manual:`cmake-modules(7)` manual
- and the :command:`include` command.
- ``policy``
- A CMake policy.
- See the :manual:`cmake-policies(7)` manual
- and the :command:`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 :manual:`cmake-properties(7)`
- manual and the :command:`set_property` command.
- ``variable``
- A CMake language variable.
- See the :manual:`cmake-variables(7)` manual
- and the :command:`set` command.
- Documentation objects in the CMake Domain come from two sources.
- First, 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.
- Second, the CMake Domain provides directives to define objects inside
- other documents:
- .. code-block:: rst
- .. command:: <command-name>
- This indented block documents <command-name>.
- .. variable:: <variable-name>
- This indented block documents <variable-name>.
- Object types for which no directive is available must be defined using
- the first approach above.
- .. _`Sphinx Domain`: http://sphinx-doc.org/domains.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 :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.
- 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.
- 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
- 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
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- Command signatures should be marked up as plain literal blocks, not as
- cmake ``code-blocks``.
- Signatures are separated from preceding content by a section header.
- That is, use:
- .. code-block:: rst
- ... preceding paragraph.
- Normal Libraries
- ^^^^^^^^^^^^^^^^
- ::
- add_library(<lib> ...)
- This signature is used for ...
- Signatures of commands should wrap optional parts with square brackets,
- and should mark list of optional arguments with an ellipsis (``...``).
- Elements of the signature which are specified by the user should be
- specified with angle brackets, and may be referred to in prose using
- ``inline-literal`` syntax.
- Style: Boolean Constants
- ^^^^^^^^^^^^^^^^^^^^^^^^
- Use "``OFF``" and "``ON``" for boolean values which can be modified by
- the user, such as :prop_tgt:`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
- :prop_tgt:`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
- (`<http://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
- (``IMPORTED``), a target property (:prop_tgt:`IMPORTED`), or a
- concept (:ref:`Imported Targets`).
- 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 :prop_tgt:`CMP0022` is set to ``NEW`` the behavior is ...
- However, markup self-references with ``inline-literal`` syntax.
- For example, within the :command:`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:``.
- Add to the top of ``Modules/<module-name>.cmake`` a
- :ref:`Line Comment` block of the form:
- .. code-block:: cmake
- #.rst:
- # <module-name>
- # -------------
- #
- # <reStructuredText documentation of module>
- or a :ref:`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 ``Modules/Findxxx.cmake`` module may contain:
- .. code-block:: cmake
- #.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()
- After the top documentation block, leave a *BLANK* line, and then add a
- copyright and licence notice block like this one (change only the year
- range and name)
- .. code-block:: cmake
- #=============================================================================
- # Copyright 2009-2011 Your Name
- #
- # Distributed under the OSI-approved BSD License (the "License");
- # see accompanying file Copyright.txt for details.
- #
- # This software is distributed WITHOUT ANY WARRANTY; without even the
- # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- # See the License for more information.
- #=============================================================================
- # (To distribute this file outside of CMake, substitute the full
- # License text for the above reference.)
- 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.
- Find Modules
- ------------
- A "find module" is a ``Modules/Find<package>.cmake`` file to be loaded
- by the :command:`find_package` command when invoked for ``<package>``.
- The primary task of a find module is to determine whether a package
- exists on the system, set the ``<package>_FOUND`` variable to reflect
- this and provide any variables, macros and imported targets required to
- use the package.
- The traditional approach is to use variables for everything, including
- libraries and executables: see the `Standard Variable Names`_ section
- below. This is what most of the existing find modules provided by CMake
- do.
- The more modern approach is to behave as much like
- ``<package>Config.cmake`` files as possible, by providing imported
- targets. As well as matching how ``*Config.cmake`` files work, the
- libraries, include directories and compile definitions are all set just
- by using the target in a :command:`target_link_libraries` call. The
- disadvantage is that ``*Config.cmake`` files of projects that use
- imported targets from find modules may require more work to make sure
- those imported targets that are in the link interface are available.
- In either case (or even when providing both variables and imported
- targets), find modules should provide backwards compatibility with old
- versions that had the same name.
- A FindFoo.cmake module will typically be loaded by the command::
- find_package(Foo [major[.minor[.patch[.tweak]]]]
- [EXACT] [QUIET] [REQUIRED]
- [[COMPONENTS] [components...]]
- [OPTIONAL_COMPONENTS components...]
- [NO_POLICY_SCOPE])
- See the :command:`find_package` documentation for details on what
- variables are set for the find module. Most of these are dealt with by
- using :module:`FindPackageHandleStandardArgs`.
- Briefly, the module should only locate versions of the package
- compatible with the requested version, as described by the
- ``Foo_FIND_VERSION`` family of variables. If ``Foo_FIND_QUIETLY`` is
- set to true, it should avoid printing messages, including anything
- complaining about the package not being found. If ``Foo_FIND_REQUIRED``
- is set to true, the module should issue a ``FATAL_ERROR`` if the package
- cannot be found. If neither are set to true, it should print a
- non-fatal message if it cannot find the package.
- Packages that find multiple semi-independent parts (like bundles of
- libraries) should search for the components listed in
- ``Foo_FIND_COMPONENTS`` if it is set , and only set ``Foo_FOUND`` to
- true if for each searched-for component ``<c>`` that was not found,
- ``Foo_FIND_REQUIRED_<c>`` is not set to true. The ``HANDLE_COMPONENTS``
- argument of ``find_package_handle_standard_args()`` can be used to
- implement this.
- If ``Foo_FIND_COMPONENTS`` is not set, which modules are searched for
- and required is up to the find module, but should be documented.
- For internal implementation, it is a generally accepted convention that
- variables starting with underscore are for temporary use only.
- Like all modules, find modules should be properly documented. To add a
- module to the CMake documentation, follow the steps in the `Module
- Documentation`_ section above.
- Standard Variable Names
- ^^^^^^^^^^^^^^^^^^^^^^^
- For a ``FindXxx.cmake`` module that takes the approach of setting
- variables (either instead of or in addition to creating imported
- targets), the following variable names should be used to keep things
- consistent between find modules. Note that all variables start with
- ``Xxx_`` to make sure they do not interfere with other find modules; the
- same consideration applies to macros, functions and imported targets.
- ``Xxx_INCLUDE_DIRS``
- The final set of include directories listed in one variable for use by
- client code. This should not be a cache entry.
- ``Xxx_LIBRARIES``
- The libraries to link against to use Xxx. These should include full
- paths. This should not be a cache entry.
- ``Xxx_DEFINITIONS``
- Definitions to use when compiling code that uses Xxx. This really
- shouldn't include options such as ``-DHAS_JPEG`` that a client
- source-code file uses to decide whether to ``#include <jpeg.h>``
- ``Xxx_EXECUTABLE``
- Where to find the Xxx tool.
- ``Xxx_Yyy_EXECUTABLE``
- Where to find the Yyy tool that comes with Xxx.
- ``Xxx_LIBRARY_DIRS``
- Optionally, the final set of library directories listed in one
- variable for use by client code. This should not be a cache entry.
- ``Xxx_ROOT_DIR``
- Where to find the base directory of Xxx.
- ``Xxx_VERSION_Yy``
- Expect Version Yy if true. Make sure at most one of these is ever true.
- ``Xxx_WRAP_Yy``
- If False, do not try to use the relevant CMake wrapping command.
- ``Xxx_Yy_FOUND``
- If False, optional Yy part of Xxx sytem is not available.
- ``Xxx_FOUND``
- Set to false, or undefined, if we haven't found, or don't want to use
- Xxx.
- ``Xxx_NOT_FOUND_MESSAGE``
- Should be set by config-files in the case that it has set
- ``Xxx_FOUND`` to FALSE. The contained message will be printed by the
- :command:`find_package` command and by
- ``find_package_handle_standard_args()`` to inform the user about the
- problem.
- ``Xxx_RUNTIME_LIBRARY_DIRS``
- Optionally, the runtime library search path for use when running an
- executable linked to shared libraries. The list should be used by
- user code to create the ``PATH`` on windows or ``LD_LIBRARY_PATH`` on
- UNIX. This should not be a cache entry.
- ``Xxx_VERSION``
- The full version string of the package found, if any. Note that many
- existing modules provide ``Xxx_VERSION_STRING`` instead.
- ``Xxx_VERSION_MAJOR``
- The major version of the package found, if any.
- ``Xxx_VERSION_MINOR``
- The minor version of the package found, if any.
- ``Xxx_VERSION_PATCH``
- The patch version of the package found, if any.
- The following names should not usually be used in CMakeLists.txt files, but
- are typically cache variables for users to edit and control the
- behaviour of find modules (like entering the path to a library manually)
- ``Xxx_LIBRARY``
- The path of the Xxx library (as used with :command:`find_library`, for
- example).
- ``Xxx_Yy_LIBRARY``
- The path of the Yy library that is part of the Xxx system. It may or
- may not be required to use Xxx.
- ``Xxx_INCLUDE_DIR``
- Where to find headers for using the Xxx library.
- ``Xxx_Yy_INCLUDE_DIR``
- Where to find headers for using the Yy library of the Xxx system.
- To prevent users being overwhelmed with settings to configure, try to
- keep as many options as possible out of the cache, leaving at least one
- option which can be used to disable use of the module, or locate a
- not-found library (e.g. ``Xxx_ROOT_DIR``). For the same reason, mark
- most cache options as advanced.
- While these are the standard variable names, you should provide
- backwards compatibility for any old names that were actually in use.
- Make sure you comment them as deprecated, so that no-one starts using
- them.
- A Sample Find Module
- ^^^^^^^^^^^^^^^^^^^^
- We will describe how to create a simple find module for a library
- ``Foo``.
- The first thing that is needed is documentation. CMake's documentation
- system requires you to start the file with a documentation marker and
- the name of the module. You should follow this with a simple statement
- of what the module does.
- .. code-block:: cmake
- #.rst:
- # FindFoo
- # -------
- #
- # Finds the Foo library
- #
- More description may be required for some packages. If there are
- caveats or other details users of the module should be aware of, you can
- add further paragraphs below this. Then you need to document what
- variables and imported targets are set by the module, such as
- .. code-block:: cmake
- # This will define the following variables::
- #
- # Foo_FOUND - True if the system has the Foo library
- # Foo_VERSION - The version of the Foo library which was found
- #
- # and the following imported targets::
- #
- # Foo::Foo - The Foo library
- If the package provides any macros, they should be listed here, but can
- be documented where they are defined. See the `Module
- Documentation`_ section above for more details.
- After the documentation, leave a blank line, and then add a copyright and
- licence notice block
- .. code-block:: cmake
- #=============================================================================
- # Copyright 2009-2011 Your Name
- #
- # Distributed under the OSI-approved BSD License (the "License");
- # see accompanying file Copyright.txt for details.
- #
- # This software is distributed WITHOUT ANY WARRANTY; without even the
- # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- # See the License for more information.
- #=============================================================================
- # (To distribute this file outside of CMake, substitute the full
- # License text for the above reference.)
- If the module is new to CMake, you may want to provide a warning for
- projects that do not require a high enough CMake version.
- .. code-block:: cmake
- if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 3.0.0)
- message(AUTHOR_WARNING "Your project should require at least CMake 3.0.0 to use FindFoo.cmake")
- endif()
- Now the actual libraries and so on have to be found. The code here will
- obviously vary from module to module (dealing with that, after all, is the
- point of find modules), but there tends to be a common pattern for libraries.
- First, we try to use ``pkg-config`` to find the library. Note that we
- cannot rely on this, as it may not be available, but it provides a good
- starting point.
- .. code-block:: cmake
- find_package(PkgConfig)
- pkg_check_modules(PC_Foo QUIET Foo)
- This should define some variables starting ``PC_Foo_`` that contain the
- information from the ``Foo.pc`` file.
- Now we need to find the libraries and include files; we use the
- information from ``pkg-config`` to provide hints to CMake about where to
- look.
- .. code-block:: cmake
- find_path(Foo_INCLUDE_DIR
- NAMES foo.h
- PATHS ${PC_Foo_INCLUDE_DIRS}
- # if you need to put #include <Foo/foo.h> in your code, add:
- PATH_SUFFIXES Foo
- )
- find_library(Foo_LIBRARY
- NAMES foo
- PATHS ${PC_Foo_LIBRARY_DIRS}
- )
- If you have a good way of getting the version (from a header file, for
- example), you can use that information to set ``Foo_VERSION`` (although
- note that find modules have traditionally used ``Foo_VERSION_STRING``,
- so you may want to set both). Otherwise, attempt to use the information
- from ``pkg-config``
- .. code-block:: cmake
- set(Foo_VERSION ${PC_Foo_VERSION})
- Now we can use :module:`FindPackageHandleStandardArgs` to do most of the
- rest of the work for us
- .. code-block:: cmake
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(Foo
- FOUND_VAR Foo_FOUND
- REQUIRED_VARS
- Foo_LIBRARY
- Foo_INCLUDE_DIR
- VERSION_VAR Foo_VERSION
- )
- This will check that the ``REQUIRED_VARS`` contain values (that do not
- end in ``-NOTFOUND``) and set ``Foo_FOUND`` appropriately. It will also
- cache those values. If ``Foo_VERSION`` is set, and a required version
- was passed to :command:`find_package`, it will check the requested version
- against the one in ``Foo_VERSION``. It will also print messages as
- appropriate; note that if the package was found, it will print the
- contents of the first required variable to indicate where it was found.
- At this point, we have to provide a way for users of the find module to
- link to the library or libraries that were found. There are two
- approaches, as discussed in the `Find Modules`_ section above. The
- traditional variable approach looks like
- .. code-block:: cmake
- if(Foo_FOUND)
- set(Foo_LIBRARIES ${Foo_LIBRARY})
- set(Foo_INCLUDE_DIRS ${Foo_INCLUDE_DIR})
- set(Foo_DEFINITIONS ${PC_Foo_CFLAGS_OTHER})
- endif()
- If more than one library was found, all of them should be included in
- these variables (see the `Standard Variable Names`_ section for more
- information).
- When providing imported targets, these should be namespaced (hence the
- ``Foo::`` prefix); CMake will recognize that values passed to
- :command:`target_link_libraries` that contain ``::`` in their name are
- supposed to be imported targets (rather than just library names), and
- will produce appropriate diagnostic messages if that target does not
- exist (see policy :policy:`CMP0028`).
- .. code-block:: cmake
- if(Foo_FOUND AND NOT TARGET Foo::Foo)
- add_library(Foo::Foo UNKNOWN IMPORTED)
- set_target_properties(Foo::Foo PROPERTIES
- IMPORTED_LOCATION "${Foo_LIBRARY}"
- INTERFACE_COMPILE_OPTIONS "${PC_Foo_CFLAGS_OTHER}"
- INTERFACE_INCLUDE_DIRECTORIES "${Foo_INCLUDE_DIR}"
- )
- endif()
- One thing to note about this is that the ``INTERFACE_INCLUDE_DIRECTORIES`` and
- similar properties should only contain information about the target itself, and
- not any of its dependencies. Instead, those dependencies should also be
- targets, and CMake should be told that they are dependencies of this target.
- CMake will then combine all the necessary information automatically.
- We should also provide some information about the package, such as where to
- download it.
- .. code-block:: cmake
- include(FeatureSummary)
- set_package_properties(Foo PROPERTIES
- URL "http://www.foo.example.com/"
- DESCRIPTION "A library for doing useful things"
- )
- Most of the cache variables should be hidden in the ``ccmake`` interface unless
- the user explicitly asks to edit them.
- .. code-block:: cmake
- mark_as_advanced(
- Foo_INCLUDE_DIR
- Foo_LIBRARY
- )
- If this module replaces an older version, you should set compatibility variables
- to cause the least disruption possible.
- .. code-block:: cmake
- # compatibility variables
- set(Foo_VERSION_STRING ${Foo_VERSION})
|