aboutsummaryrefslogtreecommitdiff
path: root/final/runtime/cmake/LibompCheckFortranFlag.cmake
blob: c37b3ad24a111365af12e97e0e4c61ac51485240 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#
#//===----------------------------------------------------------------------===//
#//
#//                     The LLVM Compiler Infrastructure
#//
#// This file is dual licensed under the MIT and the University of Illinois Open
#// Source Licenses. See LICENSE.txt for details.
#//
#//===----------------------------------------------------------------------===//
#

# Checking a fortran compiler flag
# There is no real trivial way to do this in CMake, so we implement it here
# this will have ${boolean} = TRUE if the flag succeeds, otherwise false.
function(libomp_check_fortran_flag flag boolean)
  if(NOT DEFINED "${boolean}")
    set(retval TRUE)
    set(fortran_source
"      program hello
           print *, \"Hello World!\"
      end program hello")

  set(failed_regexes "[Ee]rror;[Uu]nknown;[Ss]kipping")
  if(CMAKE_VERSION VERSION_GREATER 3.1 OR CMAKE_VERSION VERSION_EQUAL 3.1)
    include(CheckFortranSourceCompiles)
    check_fortran_source_compiles("${fortran_source}" ${boolean} FAIL_REGEX "${failed_regexes}")
    set(${boolean} ${${boolean}} PARENT_SCOPE)
    return()
  else()
    # Our manual check for cmake versions that don't have CheckFortranSourceCompiles
    set(base_dir ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_flag_check)
    file(MAKE_DIRECTORY ${base_dir})
    file(WRITE ${base_dir}/fortran_source.f "${fortran_source}")

    message(STATUS "Performing Test ${boolean}")
    execute_process(
      COMMAND ${CMAKE_Fortran_COMPILER} "${flag}" ${base_dir}/fortran_source.f
      WORKING_DIRECTORY ${base_dir}
      RESULT_VARIABLE exit_code
      OUTPUT_VARIABLE OUTPUT
      ERROR_VARIABLE OUTPUT
    )

    if(${exit_code} EQUAL 0)
      foreach(regex IN LISTS failed_regexes)
        if("${OUTPUT}" MATCHES ${regex})
          set(retval FALSE)
        endif()
      endforeach()
    else()
      set(retval FALSE)
    endif()

    if(${retval})
      set(${boolean} 1 CACHE INTERNAL "Test ${boolean}")
      message(STATUS "Performing Test ${boolean} - Success")
      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
        "Performing Fortran Compiler Flag test ${boolean} succeeded with the following output:\n"
        "${OUTPUT}\n"
        "Source file was:\n${fortran_source}\n")
    else()
      set(${boolean} "" CACHE INTERNAL "Test ${boolean}")
      message(STATUS "Performing Test ${boolean} - Failed")
      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
        "Performing Fortran Compiler Flag test ${boolean} failed with the following output:\n"
        "${OUTPUT}\n"
        "Source file was:\n${fortran_source}\n")
    endif()
  endif()

  set(${boolean} ${retval} PARENT_SCOPE)
  endif()
endfunction()