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
5if(CMAKE_Fortran_COMPILER_FORCED)
6  # The compiler configuration was forced by the user.
7  # Assume the user has configured all compiler information.
8  set(CMAKE_Fortran_COMPILER_WORKS TRUE)
9  return()
10endif()
11
12include(CMakeTestCompilerCommon)
13
14# Remove any cached result from an older CMake version.
15# We now store this in CMakeFortranCompiler.cmake.
16unset(CMAKE_Fortran_COMPILER_WORKS CACHE)
17
18# Try to identify the ABI and configure it into CMakeFortranCompiler.cmake
19include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerABI.cmake)
20CMAKE_DETERMINE_COMPILER_ABI(Fortran ${CMAKE_ROOT}/Modules/CMakeFortranCompilerABI.F90)
21if(CMAKE_Fortran_ABI_COMPILED)
22  # The compiler worked so skip dedicated test below.
23  set(CMAKE_Fortran_COMPILER_WORKS TRUE)
24  set(CMAKE_Fortran_COMPILER_SUPPORTS_F90 1)
25  message(STATUS "Check for working Fortran compiler: ${CMAKE_Fortran_COMPILER} - skipped")
26else()
27  cmake_determine_compiler_abi(Fortran ${CMAKE_ROOT}/Modules/CMakeFortranCompilerABI.F)
28  if(CMAKE_Fortran_ABI_COMPILED)
29    set(CMAKE_Fortran_COMPILER_WORKS TRUE)
30    message(STATUS "Check for working Fortran 77 compiler: ${CMAKE_Fortran_COMPILER} - skipped")
31  endif()
32endif()
33
34# This file is used by EnableLanguage in cmGlobalGenerator to
35# determine that the selected Fortran compiler can actually compile
36# and link the most basic of programs.   If not, a fatal error
37# is set and cmake stops processing commands and will not generate
38# any makefiles or projects.
39if(NOT CMAKE_Fortran_COMPILER_WORKS)
40  PrintTestCompilerStatus("Fortran")
41  file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f "
42        PROGRAM TESTFortran
43        PRINT *, 'Hello'
44        END
45  ")
46  # Clear result from normal variable.
47  unset(CMAKE_Fortran_COMPILER_WORKS)
48  # Puts test result in cache variable.
49  try_compile(CMAKE_Fortran_COMPILER_WORKS ${CMAKE_BINARY_DIR}
50    ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f
51    OUTPUT_VARIABLE OUTPUT)
52  # Move result from cache to normal variable.
53  set(CMAKE_Fortran_COMPILER_WORKS ${CMAKE_Fortran_COMPILER_WORKS})
54  unset(CMAKE_Fortran_COMPILER_WORKS CACHE)
55  if(NOT CMAKE_Fortran_COMPILER_WORKS)
56    PrintTestCompilerResult(CHECK_FAIL "broken")
57    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
58      "Determining if the Fortran compiler works failed with "
59      "the following output:\n${OUTPUT}\n\n")
60    string(REPLACE "\n" "\n  " _output "${OUTPUT}")
61    message(FATAL_ERROR "The Fortran compiler\n  \"${CMAKE_Fortran_COMPILER}\"\n"
62      "is not able to compile a simple test program.\nIt fails "
63      "with the following output:\n  ${_output}\n\n"
64      "CMake will not be able to correctly generate this project.")
65  endif()
66  PrintTestCompilerResult(CHECK_PASS "works")
67  file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
68    "Determining if the Fortran compiler works passed with "
69    "the following output:\n${OUTPUT}\n\n")
70endif()
71
72# Test for Fortran 90 support by using an f90-specific construct.
73if(NOT DEFINED CMAKE_Fortran_COMPILER_SUPPORTS_F90)
74  message(CHECK_START "Checking whether ${CMAKE_Fortran_COMPILER} supports Fortran 90")
75  file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompilerF90.f90 "
76    PROGRAM TESTFortran90
77    integer stop ; stop = 1 ; do while ( stop .eq. 0 ) ; end do
78    END PROGRAM TESTFortran90
79")
80  try_compile(CMAKE_Fortran_COMPILER_SUPPORTS_F90 ${CMAKE_BINARY_DIR}
81    ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompilerF90.f90
82    OUTPUT_VARIABLE OUTPUT)
83  if(CMAKE_Fortran_COMPILER_SUPPORTS_F90)
84    message(CHECK_PASS "yes")
85    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
86      "Determining if the Fortran compiler supports Fortran 90 passed with "
87      "the following output:\n${OUTPUT}\n\n")
88    set(CMAKE_Fortran_COMPILER_SUPPORTS_F90 1)
89  else()
90    message(CHECK_FAIL "no")
91    file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
92      "Determining if the Fortran compiler supports Fortran 90 failed with "
93      "the following output:\n${OUTPUT}\n\n")
94    set(CMAKE_Fortran_COMPILER_SUPPORTS_F90 0)
95  endif()
96  unset(CMAKE_Fortran_COMPILER_SUPPORTS_F90 CACHE)
97endif()
98
99# Re-configure to save learned information.
100configure_file(
101  ${CMAKE_ROOT}/Modules/CMakeFortranCompiler.cmake.in
102  ${CMAKE_PLATFORM_INFO_DIR}/CMakeFortranCompiler.cmake
103  @ONLY
104  )
105include(${CMAKE_PLATFORM_INFO_DIR}/CMakeFortranCompiler.cmake)
106
107if(CMAKE_Fortran_SIZEOF_DATA_PTR)
108  foreach(f ${CMAKE_Fortran_ABI_FILES})
109    include(${f})
110  endforeach()
111  unset(CMAKE_Fortran_ABI_FILES)
112endif()
113