diff options
Diffstat (limited to 'share/cmake-3.2/Help/manual/cmake-developer.7.rst')
-rw-r--r-- | share/cmake-3.2/Help/manual/cmake-developer.7.rst | 1035 |
1 files changed, 0 insertions, 1035 deletions
diff --git a/share/cmake-3.2/Help/manual/cmake-developer.7.rst b/share/cmake-3.2/Help/manual/cmake-developer.7.rst deleted file mode 100644 index e18250c..0000000 --- a/share/cmake-3.2/Help/manual/cmake-developer.7.rst +++ /dev/null @@ -1,1035 +0,0 @@ -.. cmake-manual-description: CMake Developer Reference - -cmake-developer(7) -****************** - -.. only:: html - - .. 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::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. - -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. - -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. - -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. Furthermore, set ``CMAKE_<LANG>_STANDARD_DEFAULT`` to the -default language standard level the compiler uses, or to the empty string -if the compiler has no notion of standard levels (such as ``MSVC``). - -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. A find module is useful in cases where an upstream -library does not provide a -:ref:`config file package <Config File Packages>`. - -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 -:ref:`config file packages <Config File Packages>` files as possible, by -providing :ref:`imported target <Imported targets>`. This has the advantage -of propagating :ref:`Target Usage Requirements` to consumers. - -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. For packages which provide both debug -and release binaries, it is common to create cache variables with a -``_LIBRARY_<CONFIG>`` suffix, such as ``Foo_LIBRARY_RELEASE`` and -``Foo_LIBRARY_DEBUG``. - -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.) - -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. - -The type of the :prop_tgt:`IMPORTED` target created in the -:command:`add_library` command can always be specified as ``UNKNOWN`` -type. This simplifies the code in cases where static or shared variants may -be found, and CMake will determine the type by inspecting the files. - -If the library is available with multiple configurations, the -:prop_tgt:`IMPORTED_CONFIGURATIONS` target property should also be -populated: - -.. code-block:: cmake - - if(Foo_FOUND) - if (NOT TARGET Foo::Foo) - add_library(Foo::Foo UNKNOWN IMPORTED) - endif() - if (Foo_LIBRARY_RELEASE) - set_property(TARGET Foo::Foo APPEND PROPERTY - IMPORTED_CONFIGURATIONS RELEASE - ) - set_target_properties(Foo::Foo PROPERTIES - IMPORTED_LOCATION_RELEASE "${Foo_LIBRARY_RELEASE}" - ) - endif() - if (Foo_LIBRARY_DEBUG) - set_property(TARGET Foo::Foo APPEND PROPERTY - IMPORTED_CONFIGURATIONS DEBUG - ) - set_target_properties(Foo::Foo PROPERTIES - IMPORTED_LOCATION_DEBUG "${Foo_LIBRARY_DEBUG}" - ) - endif() - set_target_properties(Foo::Foo PROPERTIES - INTERFACE_COMPILE_OPTIONS "${PC_Foo_CFLAGS_OTHER}" - INTERFACE_INCLUDE_DIRECTORIES "${Foo_INCLUDE_DIR}" - ) - endif() - -The ``RELEASE`` variant should be listed first in the property -so that that variant is chosen if the user uses a configuration which is -not an exact match for any listed ``IMPORTED_CONFIGURATIONS``. - -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}) |