#
#//===----------------------------------------------------------------------===//
#//
#//                     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()
