1# 2#//===----------------------------------------------------------------------===// 3#// 4#// The LLVM Compiler Infrastructure 5#// 6#// This file is dual licensed under the MIT and the University of Illinois Open 7#// Source Licenses. See LICENSE.txt for details. 8#// 9#//===----------------------------------------------------------------------===// 10# 11 12# Checking a fortran compiler flag 13# There is no real trivial way to do this in CMake, so we implement it here 14# this will have ${boolean} = TRUE if the flag succeeds, otherwise false. 15function(libomp_check_fortran_flag flag boolean) 16 if(NOT DEFINED "${boolean}") 17 set(retval TRUE) 18 set(fortran_source 19" program hello 20 print *, \"Hello World!\" 21 end program hello") 22 23 set(failed_regexes "[Ee]rror;[Uu]nknown;[Ss]kipping") 24 if(CMAKE_VERSION VERSION_GREATER 3.1 OR CMAKE_VERSION VERSION_EQUAL 3.1) 25 include(CheckFortranSourceCompiles) 26 check_fortran_source_compiles("${fortran_source}" ${boolean} FAIL_REGEX "${failed_regexes}") 27 set(${boolean} ${${boolean}} PARENT_SCOPE) 28 return() 29 else() 30 # Our manual check for cmake versions that don't have CheckFortranSourceCompiles 31 set(base_dir ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/fortran_flag_check) 32 file(MAKE_DIRECTORY ${base_dir}) 33 file(WRITE ${base_dir}/fortran_source.f "${fortran_source}") 34 35 message(STATUS "Performing Test ${boolean}") 36 execute_process( 37 COMMAND ${CMAKE_Fortran_COMPILER} "${flag}" ${base_dir}/fortran_source.f 38 WORKING_DIRECTORY ${base_dir} 39 RESULT_VARIABLE exit_code 40 OUTPUT_VARIABLE OUTPUT 41 ERROR_VARIABLE OUTPUT 42 ) 43 44 if(${exit_code} EQUAL 0) 45 foreach(regex IN LISTS failed_regexes) 46 if("${OUTPUT}" MATCHES ${regex}) 47 set(retval FALSE) 48 endif() 49 endforeach() 50 else() 51 set(retval FALSE) 52 endif() 53 54 if(${retval}) 55 set(${boolean} 1 CACHE INTERNAL "Test ${boolean}") 56 message(STATUS "Performing Test ${boolean} - Success") 57 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 58 "Performing Fortran Compiler Flag test ${boolean} succeeded with the following output:\n" 59 "${OUTPUT}\n" 60 "Source file was:\n${fortran_source}\n") 61 else() 62 set(${boolean} "" CACHE INTERNAL "Test ${boolean}") 63 message(STATUS "Performing Test ${boolean} - Failed") 64 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 65 "Performing Fortran Compiler Flag test ${boolean} failed with the following output:\n" 66 "${OUTPUT}\n" 67 "Source file was:\n${fortran_source}\n") 68 endif() 69 endif() 70 71 set(${boolean} ${retval} PARENT_SCOPE) 72 endif() 73endfunction() 74