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
|
SET(UB_DIRECTORY_OF_CHECK_FLOATING_POINT_FORMAT_SCRIPT "${CMAKE_CURRENT_LIST_DIR}")
MACRO(UB_CHECK_FLOATING_POINT_FORMAT IEEE754_FLOATS FLOAT_BYTES_BIGENDIAN FLOAT_WORDS_BIGENDIAN)
IF(NOT DEFINED HAVE_${IEEE754_FLOATS})
MESSAGE(STATUS "Check floating point format")
SET(UB_CHECK_FLOATING_POINT_FORMAT_TARGET
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckFloatingPointFormat.bin")
TRY_COMPILE(HAVE_${IEEE754_FLOATS} "${CMAKE_BINARY_DIR}"
"${UB_DIRECTORY_OF_CHECK_FLOATING_POINT_FORMAT_SCRIPT}/CheckFloatingPointFormat.c"
COPY_FILE "${UB_CHECK_FLOATING_POINT_FORMAT_TARGET}")
IF(HAVE_${IEEE754_FLOATS})
FILE(STRINGS "${UB_CHECK_FLOATING_POINT_FORMAT_TARGET}"
UB_IEEE754_BIG_BIG REGEX "ABCDEFGH" LIMIT_COUNT 1)
FILE(STRINGS "${UB_CHECK_FLOATING_POINT_FORMAT_TARGET}"
UB_IEEE754_LITTLE_LITTLE REGEX "HGFEDCBA" LIMIT_COUNT 1)
FILE(STRINGS "${UB_CHECK_FLOATING_POINT_FORMAT_TARGET}"
UB_IEEE754_BIG_LITTLE REGEX "EFGHABCD" LIMIT_COUNT 1)
FILE(STRINGS "${UB_CHECK_FLOATING_POINT_FORMAT_TARGET}"
UB_IEEE754_LITTLE_BIG REGEX "DCBAHGFE" LIMIT_COUNT 1)
IF(UB_IEEE754_BIG_BIG OR UB_IEEE754_LITTLE_LITTLE OR
UB_IEEE754_LITTLE_BIG OR UB_IEEE754_BIG_LITTLE)
SET(UB_IEEE754 TRUE)
ELSE()
SET(UB_IEEE754 FALSE)
ENDIF()
ENDIF()
IF(UB_IEEE754)
SET(${IEEE754_FLOATS} 1 CACHE INTERNAL
"Stores whether the system uses IEEE754 floats" FORCE)
ENDIF(UB_IEEE754)
IF(UB_IEEE754_BIG_BIG OR UB_IEEE754_BIG_LITTLE)
SET(${FLOAT_BYTES_BIGENDIAN} 1 CACHE INTERNAL
"Stores whether IEEE754 floats store bytes in big endian" FORCE)
ENDIF(UB_IEEE754_BIG_BIG OR UB_IEEE754_BIG_LITTLE)
IF(UB_IEEE754_BIG_BIG OR UB_IEEE754_LITTLE_BIG)
SET(${FLOAT_WORDS_BIGENDIAN} 1 CACHE INTERNAL
"Stores whether IEEE754 words store bytes in big endian" FORCE)
ENDIF(UB_IEEE754_BIG_BIG OR UB_IEEE754_LITTLE_BIG)
IF(UB_IEEE754_BIG_BIG)
MESSAGE(STATUS "Check floating point format - IEEE-754, big endian")
ELSEIF(UB_IEEE754_LITTLE_LITTLE)
MESSAGE(STATUS "Check floating point format - IEEE-754, little endian")
ELSEIF(UB_IEEE754_BIG_LITTLE)
MESSAGE(STATUS "Check floating point format - IEEE-754, bytes are big endian, words are little endian")
ELSEIF(UB_IEEE754_LITTLE_BIG)
MESSAGE(STATUS "Check floating point format - IEEE-754, bytes are little endian, words are big endian")
ELSE()
MESSAGE(STATUS "Check floating point format - unknown")
ENDIF()
ENDIF()
ENDMACRO(UB_CHECK_FLOATING_POINT_FORMAT IEEE754_FLOATS FLOAT_BYTES_BIGENDIAN FLOAT_WORDS_BIGENDIAN)
|