74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			CMake
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			CMake
		
	
	
	
#
 | 
						|
#//===----------------------------------------------------------------------===//
 | 
						|
#//
 | 
						|
#//                     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()
 |