#===-- cmake/modules/FlangCommon.txt ----------------------------===# # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # #===------------------------------------------------------------------------===# # # CMake definitions shared between Flang and Flang-RT # #===------------------------------------------------------------------------===# include(CheckCSourceCompiles) include(CheckIncludeFile) # The out of tree builds of the compiler and the Fortran runtime # must use the same setting of FLANG_RUNTIME_F128_MATH_LIB # to be composable. Failure to synchronize this setting may result # in linking errors or fatal failures in F128 runtime functions. set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING "Specifies the target library used for implementing IEEE-754 128-bit float \ math in F18 runtime, e.g. it might be libquadmath for targets where \ REAL(16) is mapped to __float128, or libm for targets where REAL(16) \ is mapped to long double, etc." ) if (FLANG_RUNTIME_F128_MATH_LIB) add_compile_definitions(FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}") endif() # Check if 128-bit float computations can be done via long double # Note that '-nostdinc++' might be implied when this code kicks in # (see 'runtimes/CMakeLists.txt'), so we cannot use 'cfloat' C++ header # file in the test below. # Compile it as C. check_c_source_compiles( "#include #if LDBL_MANT_DIG != 113 #error LDBL_MANT_DIG != 113 #endif int main() { return 0; } " HAVE_LDBL_MANT_DIG_113) # Discover the GCC installation, when the build compiler is Clang, # and try to find quadmath.h there. Set FLANG_INCLUDE_QUADMATH_H # to the path to quadmath.h, if found. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") if (NOT DEFINED FLANG_GCC_RESOURCE_DIR) set(FLANG_GCC_RESOURCE_DIR "FLANG_GCC_RESOURCE_DIR-NOTFOUND") # Prepare CMAKE_CXX_FLAGS so that they can be passed to execute_process # as separate flags. separate_arguments(flags UNIX_COMMAND "${CMAKE_CXX_FLAGS}") execute_process( COMMAND "${CMAKE_CXX_COMPILER}" ${flags} -v "-###" ERROR_FILE "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result" ) file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/clang_gcc_root_result" _errorresult) foreach (_line IN LISTS _errorresult) string(REGEX MATCH "^Selected GCC installation: (.+)$" _match "${_line}") if (CMAKE_MATCH_1) set(FLANG_GCC_RESOURCE_DIR "${CMAKE_MATCH_1}") message(STATUS "Found GCC installation selected by Clang: ${FLANG_GCC_RESOURCE_DIR}") break() endif () endforeach () set(FLANG_GCC_RESOURCE_DIR "${FLANG_GCC_RESOURCE_DIR}" CACHE INTERNAL "Path to GCC's resource dir selected by Clang" FORCE) endif () endif () check_include_file("quadmath.h" FOUND_QUADMATH_H) if (FOUND_QUADMATH_H) message(STATUS "quadmath.h found without additional include paths") set(FLANG_INCLUDE_QUADMATH_H "") elseif (FLANG_GCC_RESOURCE_DIR) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_INCLUDES "${FLANG_GCC_RESOURCE_DIR}/include") check_include_file("quadmath.h" FOUND_GCC_QUADMATH_H) cmake_pop_check_state() if (FOUND_GCC_QUADMATH_H) message(STATUS "quadmath.h found in Clang's selected GCC installation") set(FLANG_INCLUDE_QUADMATH_H "\"${FLANG_GCC_RESOURCE_DIR}/include/quadmath.h\"") endif () endif ()