summaryrefslogtreecommitdiffstats
path: root/Help/guide/tutorial/Adding System Introspection.rst
diff options
context:
space:
mode:
authorJosef Angstenberger <code@jtxa.de>2021-06-10 21:03:40 (GMT)
committerBrad King <brad.king@kitware.com>2021-06-17 15:53:55 (GMT)
commitd1c3e7e78af0b3a4a5637e2bf3af86cfa5ba6e6f (patch)
tree3b56495e87f31dcade321ea33ab81b74636cf8e0 /Help/guide/tutorial/Adding System Introspection.rst
parent13fdb263231598df2cec0fb7bc9515f1f56b5577 (diff)
downloadCMake-d1c3e7e78af0b3a4a5637e2bf3af86cfa5ba6e6f.zip
CMake-d1c3e7e78af0b3a4a5637e2bf3af86cfa5ba6e6f.tar.gz
CMake-d1c3e7e78af0b3a4a5637e2bf3af86cfa5ba6e6f.tar.bz2
Tutorial: Split steps into separate files
Fixes: #21737
Diffstat (limited to 'Help/guide/tutorial/Adding System Introspection.rst')
-rw-r--r--Help/guide/tutorial/Adding System Introspection.rst50
1 files changed, 50 insertions, 0 deletions
diff --git a/Help/guide/tutorial/Adding System Introspection.rst b/Help/guide/tutorial/Adding System Introspection.rst
new file mode 100644
index 0000000..0ee360c
--- /dev/null
+++ b/Help/guide/tutorial/Adding System Introspection.rst
@@ -0,0 +1,50 @@
+Step 5: Adding System Introspection
+===================================
+
+Let us consider adding some code to our project that depends on features the
+target platform may not have. For this example, we will add some code that
+depends on whether or not the target platform has the ``log`` and ``exp``
+functions. Of course almost every platform has these functions but for this
+tutorial assume that they are not common.
+
+If the platform has ``log`` and ``exp`` then we will use them to compute the
+square root in the ``mysqrt`` function. We first test for the availability of
+these functions using the :module:`CheckSymbolExists` module in
+``MathFunctions/CMakeLists.txt``. On some platforms, we will need to link to
+the m library. If ``log`` and ``exp`` are not initially found, require the m
+library and try again.
+
+.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
+ :language: cmake
+ :start-after: # does this system provide the log and exp functions?
+ :end-before: # add compile definitions
+
+If available, use :command:`target_compile_definitions` to specify
+``HAVE_LOG`` and ``HAVE_EXP`` as ``PRIVATE`` compile definitions.
+
+.. literalinclude:: Step6/MathFunctions/CMakeLists.txt
+ :language: cmake
+ :start-after: # add compile definitions
+ :end-before: # install rules
+
+If ``log`` and ``exp`` are available on the system, then we will use them to
+compute the square root in the ``mysqrt`` function. Add the following code to
+the ``mysqrt`` function in ``MathFunctions/mysqrt.cxx`` (don't forget the
+``#endif`` before returning the result!):
+
+.. literalinclude:: Step6/MathFunctions/mysqrt.cxx
+ :language: c++
+ :start-after: // if we have both log and exp then use them
+ :end-before: // do ten iterations
+
+We will also need to modify ``mysqrt.cxx`` to include ``cmath``.
+
+.. literalinclude:: Step6/MathFunctions/mysqrt.cxx
+ :language: c++
+ :end-before: #include <iostream>
+
+Run the :manual:`cmake <cmake(1)>` executable or the
+:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
+with your chosen build tool and run the Tutorial executable.
+
+Which function gives better results now, sqrt or mysqrt?