Kaynağa Gözat

Tutorial: Simplify logic checking for cmath functions

Since commit 07223c5c27 (Tutorial: Update Step 5 to work on Windows,
2020-02-18, v3.18.0-rc1~655^2) the logic does not work on non-Windows
platforms when cmake is re-run on an existing build tree.  It is also
more complicated than we'd like for a tutorial example.  Avoid the need
to consider the `m` library case by performing the check as C++.

Since `check_cxx_symbol_exists` cannot handle overloaded functions
like `exp` and `log`, check with `check_cxx_source_compiles` instead.
This also presents a more general-purpose example in the tutorial.

Fixes: #23524
Brad King 3 yıl önce
ebeveyn
işleme
5c84eca210

+ 3 - 5
Help/guide/tutorial/Adding System Introspection.rst

@@ -9,17 +9,15 @@ 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.
+these functions using the :module:`CheckCXXSourceCompiles` module in
+``MathFunctions/CMakeLists.txt``.
 
 Add the checks for ``log`` and ``exp`` to ``MathFunctions/CMakeLists.txt``,
 after the call to :command:`target_include_directories`:
 
 .. literalinclude:: Step6/MathFunctions/CMakeLists.txt
   :caption: MathFunctions/CMakeLists.txt
-  :name: MathFunctions/CMakeLists.txt-check_symbol_exists
+  :name: MathFunctions/CMakeLists.txt-check_cxx_source_compiles
   :language: cmake
   :start-after: # to find MathFunctions.h, while we don't.
   :end-before: # add compile definitions

+ 15 - 13
Help/guide/tutorial/Step6/MathFunctions/CMakeLists.txt

@@ -7,19 +7,21 @@ target_include_directories(MathFunctions
           )
 
 # does this system provide the log and exp functions?
-include(CheckSymbolExists)
-check_symbol_exists(log "math.h" HAVE_LOG)
-check_symbol_exists(exp "math.h" HAVE_EXP)
-if(NOT (HAVE_LOG AND HAVE_EXP))
-  unset(HAVE_LOG CACHE)
-  unset(HAVE_EXP CACHE)
-  set(CMAKE_REQUIRED_LIBRARIES "m")
-  check_symbol_exists(log "math.h" HAVE_LOG)
-  check_symbol_exists(exp "math.h" HAVE_EXP)
-  if(HAVE_LOG AND HAVE_EXP)
-    target_link_libraries(MathFunctions PRIVATE m)
-  endif()
-endif()
+include(CheckCXXSourceCompiles)
+check_cxx_source_compiles("
+  #include <cmath>
+  int main() {
+    std::log(1.0);
+    return 0;
+  }
+" HAVE_LOG)
+check_cxx_source_compiles("
+  #include <cmath>
+  int main() {
+    std::exp(1.0);
+    return 0;
+  }
+" HAVE_EXP)
 
 # add compile definitions
 if(HAVE_LOG AND HAVE_EXP)

+ 1 - 1
Help/guide/tutorial/Step6/MathFunctions/mysqrt.cxx

@@ -12,7 +12,7 @@ double mysqrt(double x)
 
   // if we have both log and exp then use them
 #if defined(HAVE_LOG) && defined(HAVE_EXP)
-  double result = exp(log(x) * 0.5);
+  double result = std::exp(std::log(x) * 0.5);
   std::cout << "Computing sqrt of " << x << " to be " << result
             << " using log and exp" << std::endl;
 #else