8f1ca9dd33a23b16fc71803bbb7ef438b6cd7655
[platform/upstream/cmake.git] / Modules / CheckFortranFunctionExists.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 #[=======================================================================[.rst:
5 CheckFortranFunctionExists
6 --------------------------
7
8 Check if a Fortran function exists.
9
10 .. command:: CHECK_FORTRAN_FUNCTION_EXISTS
11
12   .. code-block:: cmake
13
14     CHECK_FORTRAN_FUNCTION_EXISTS(<function> <result>)
15
16   where
17
18   ``<function>``
19     the name of the Fortran function
20   ``<result>``
21     variable to store the result; will be created as an internal cache variable.
22
23 .. note::
24
25   This command does not detect functions in Fortran modules. In general it is
26   recommended to use :module:`CheckSourceCompiles` instead to determine if a
27   Fortran function or subroutine is available.
28
29 The following variables may be set before calling this macro to modify
30 the way the check is run:
31
32 ``CMAKE_REQUIRED_LINK_OPTIONS``
33   .. versionadded:: 3.14
34     A :ref:`;-list <CMake Language Lists>` of options to add to the link
35     command (see :command:`try_compile` for further details).
36
37 ``CMAKE_REQUIRED_LIBRARIES``
38   A :ref:`;-list <CMake Language Lists>` of libraries to add to the link
39   command. These can be the name of system libraries or they can be
40   :ref:`Imported Targets <Imported Targets>` (see :command:`try_compile` for
41   further details).
42 #]=======================================================================]
43
44 include_guard(GLOBAL)
45
46 macro(CHECK_FORTRAN_FUNCTION_EXISTS FUNCTION VARIABLE)
47   if(NOT DEFINED ${VARIABLE})
48     message(CHECK_START "Looking for Fortran ${FUNCTION}")
49     if(CMAKE_REQUIRED_LINK_OPTIONS)
50       set(CHECK_FUNCTION_EXISTS_ADD_LINK_OPTIONS
51         LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS})
52     else()
53       set(CHECK_FUNCTION_EXISTS_ADD_LINK_OPTIONS)
54     endif()
55     if(CMAKE_REQUIRED_LIBRARIES)
56       set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
57         LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
58     else()
59       set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
60     endif()
61     file(WRITE
62     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f
63     "
64       program TESTFortran
65       external ${FUNCTION}
66       call ${FUNCTION}()
67       end program TESTFortran
68     "
69     )
70     try_compile(${VARIABLE}
71       ${CMAKE_BINARY_DIR}
72       ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f
73       ${CHECK_FUNCTION_EXISTS_ADD_LINK_OPTIONS}
74       ${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
75       OUTPUT_VARIABLE OUTPUT
76     )
77     if(${VARIABLE})
78       set(${VARIABLE} 1 CACHE INTERNAL "Have Fortran function ${FUNCTION}")
79       message(CHECK_PASS "found")
80       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
81         "Determining if the Fortran ${FUNCTION} exists passed with the following output:\n"
82         "${OUTPUT}\n\n")
83     else()
84       message(CHECK_FAIL "not found")
85       set(${VARIABLE} "" CACHE INTERNAL "Have Fortran function ${FUNCTION}")
86       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
87         "Determining if the Fortran ${FUNCTION} exists failed with the following output:\n"
88         "${OUTPUT}\n\n")
89     endif()
90   endif()
91 endmacro()