Merge topic 'patch-CheckSymbolExists'

58e8999c28 CheckSymbolExists, CheckCXXSymbolExists: Update documentation

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !10804
diff --git a/Help/manual/cmake-toolchains.7.rst b/Help/manual/cmake-toolchains.7.rst
index c872143..29c5839 100644
--- a/Help/manual/cmake-toolchains.7.rst
+++ b/Help/manual/cmake-toolchains.7.rst
@@ -83,7 +83,7 @@
 Toolchain Features
 ==================
 
-CMake provides the :command:`try_compile` command and wrapper macros such as
+CMake provides the :command:`try_compile` command and modules such as
 :module:`CheckSourceCompiles`, :module:`CheckCXXSymbolExists` and
 :module:`CheckIncludeFile` to test capability and availability of various
 toolchain features. These APIs test the toolchain in some way and cache the
diff --git a/Modules/CheckCXXSymbolExists.cmake b/Modules/CheckCXXSymbolExists.cmake
index 490d97c..a53413e 100644
--- a/Modules/CheckCXXSymbolExists.cmake
+++ b/Modules/CheckCXXSymbolExists.cmake
@@ -5,41 +5,61 @@
 CheckCXXSymbolExists
 --------------------
 
-Check if a symbol exists as a function, variable, or macro in ``C++``.
+This module provides a command to check whether a C++ symbol exists.
+
+Load this module in a CMake project with:
+
+.. code-block:: cmake
+
+  include(CheckCXXSymbolExists)
+
+Commands
+^^^^^^^^
+
+This module provides the following command:
 
 .. command:: check_cxx_symbol_exists
 
+  Checks once whether a symbol exists as a function, variable, or preprocessor
+  macro in C++:
+
   .. code-block:: cmake
 
-    check_cxx_symbol_exists(<symbol> <files> <variable>)
+    check_cxx_symbol_exists(<symbol> <headers> <variable>)
 
-  Check that the ``<symbol>`` is available after including given header
-  ``<files>`` and store the result in a ``<variable>``.  Specify the list of
-  files in one argument as a semicolon-separated list.
-  ``check_cxx_symbol_exists()`` can be used to check for symbols as seen by
-  the C++ compiler, as opposed to :command:`check_symbol_exists`, which always
-  uses the ``C`` compiler.
+  This command checks whether the ``<symbol>`` is available after including
+  the specified header file(s) ``<headers>``, and stores the result in the
+  internal cache variable ``<variable>``.  Multiple header files can be
+  specified in one argument as a string using a
+  :ref:`semicolon-separated list <CMake Language Lists>`.
 
-  If the header files define the symbol as a macro it is considered
-  available and assumed to work.  If the header files declare the symbol
-  as a function or variable then the symbol must also be available for
-  linking.  If the symbol is a type, enum value, or C++ template it will
-  not be recognized: consider using the :module:`CheckTypeSize`
-  or :module:`CheckSourceCompiles` module instead.
+  If the header files define the symbol as a macro, it is considered
+  available and assumed to work.  If the symbol is declared as a function
+  or variable, the check also ensures that it links successfully
+  (i.e., the symbol must exist in a linked library or object file).
 
-.. note::
+  Symbols that are types, enum values, or C++ templates are not
+  recognized.  For those, consider using the :module:`CheckTypeSize` or
+  :module:`CheckSourceCompiles` module instead.
 
-  This command is unreliable when ``<symbol>`` is (potentially) an overloaded
-  function. Since there is no reliable way to predict whether a given function
-  in the system environment may be defined as an overloaded function or may be
-  an overloaded function on other systems or will become so in the future, it
-  is generally advised to use the :module:`CheckSourceCompiles` module for
-  checking any function symbol (unless somehow you surely know the checked
-  function is not overloaded on other systems or will not be so in the
-  future).
+  This command is intended to check symbols as they appear in C++.  For C
+  symbols, use the :module:`CheckSymbolExists` module instead.
 
-The following variables may be set before calling this macro to modify
-the way the check is run:
+  .. note::
+
+    This command is unreliable for symbols that are (potentially) overloaded
+    functions.  Since there is no reliable way to predict whether
+    a given function in the system environment may be defined as an
+    overloaded function or may be an overloaded function on other systems
+    or will become so in the future, it is generally advised to use the
+    :module:`CheckSourceCompiles` module for checking any function symbol
+    (unless it is certain the checked function is not overloaded on other
+    systems or will not be so in the future).
+
+  .. rubric:: Variables Affecting the Check
+
+  The following variables may be set before calling this command to modify
+  the way the check is run:
 
   .. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst
 
@@ -55,7 +75,12 @@
 
   .. include:: /module/include/CMAKE_REQUIRED_QUIET.rst
 
-For example:
+Examples
+^^^^^^^^
+
+The following example demonstrates how to check for the presence of a
+preprocessor macro ``SEEK_SET`` and the C++ function ``std::fopen()`` from
+the ``<cstdio>`` header using this module:
 
 .. code-block:: cmake
 
@@ -63,8 +88,14 @@
 
   # Check for macro SEEK_SET
   check_cxx_symbol_exists(SEEK_SET "cstdio" HAVE_SEEK_SET)
+
   # Check for function std::fopen
   check_cxx_symbol_exists(std::fopen "cstdio" HAVE_STD_FOPEN)
+
+See Also
+^^^^^^^^
+
+* The :module:`CheckSymbolExists` module to check whether a C symbol exists.
 #]=======================================================================]
 
 include_guard(GLOBAL)
diff --git a/Modules/CheckSymbolExists.cmake b/Modules/CheckSymbolExists.cmake
index ddf1700..46d1ab3 100644
--- a/Modules/CheckSymbolExists.cmake
+++ b/Modules/CheckSymbolExists.cmake
@@ -5,31 +5,52 @@
 CheckSymbolExists
 -----------------
 
-Provides a macro to check if a symbol exists as a function, variable,
-or macro in ``C``.
+This module provides a command to check whether a C symbol exists.
+
+Load this module in a CMake project with:
+
+.. code-block:: cmake
+
+  include(CheckSymbolExists)
+
+Commands
+^^^^^^^^
+
+This module provides the following command:
 
 .. command:: check_symbol_exists
 
+  Checks once whether a symbol exists as a function, variable, or preprocessor
+  macro in C:
+
   .. code-block:: cmake
 
-    check_symbol_exists(<symbol> <files> <variable>)
+    check_symbol_exists(<symbol> <headers> <variable>)
 
-  Check that the ``<symbol>`` is available after including given header
-  ``<files>`` and store the result in a ``<variable>``.  Specify the list
-  of files in one argument as a semicolon-separated list.
-  ``<variable>`` will be created as an internal cache variable.
+  This command checks whether the ``<symbol>`` is available after including
+  the specified header file(s) ``<headers>``, and stores the result in the
+  internal cache variable ``<variable>``.  Multiple header files can be
+  specified in one argument as a string using a
+  :ref:`semicolon-separated list <CMake Language Lists>`.
 
-If the header files define the symbol as a macro it is considered
-available and assumed to work.  If the header files declare the symbol
-as a function or variable then the symbol must also be available for
-linking (so intrinsics may not be detected).
-If the symbol is a type, enum value, or intrinsic it will not be recognized
-(consider using :module:`CheckTypeSize` or :module:`CheckSourceCompiles`).
-If the check needs to be done in C++, consider using
-:module:`CheckCXXSymbolExists` instead.
+  If the header files define the symbol as a macro, it is considered
+  available and assumed to work.  If the symbol is declared as a function
+  or variable, the check also ensures that it links successfully
+  (i.e., the symbol must exist in a linked library or object file).
+  Compiler intrinsics may not be detected, as they are not always linkable
+  or explicitly declared in headers.
 
-The following variables may be set before calling this macro to modify
-the way the check is run:
+  Symbols that are types, enum values, or compiler intrinsics are not
+  recognized.  For those, consider using the :module:`CheckTypeSize` or
+  :module:`CheckSourceCompiles` module instead.
+
+  This command is intended to check symbols as they appear in C.  For C++
+  symbols, use the :module:`CheckCXXSymbolExists` module instead.
+
+  .. rubric:: Variables Affecting the Check
+
+  The following variables may be set before calling this command to modify
+  the way the check is run:
 
   .. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst
 
@@ -45,7 +66,12 @@
 
   .. include:: /module/include/CMAKE_REQUIRED_QUIET.rst
 
-For example:
+Examples
+^^^^^^^^
+
+The following example demonstrates how to check for the presence of a
+preprocessor macro ``SEEK_SET`` and the C function ``fopen()`` from
+the ``<stdio.h>`` header using this module:
 
 .. code-block:: cmake
 
@@ -53,8 +79,15 @@
 
   # Check for macro SEEK_SET
   check_symbol_exists(SEEK_SET "stdio.h" HAVE_SEEK_SET)
+
   # Check for function fopen
   check_symbol_exists(fopen "stdio.h" HAVE_FOPEN)
+
+See Also
+^^^^^^^^
+
+* The :module:`CheckCXXSymbolExists` module to check whether a C++ symbol
+  exists.
 #]=======================================================================]
 
 include_guard(GLOBAL)