File: CheckFloatingPointFormat.cmake

package info (click to toggle)
swi-prolog 9.2.9%2Bdfsg-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 84,456 kB
  • sloc: ansic: 401,705; perl: 374,799; lisp: 9,080; cpp: 8,920; java: 5,525; sh: 3,282; javascript: 2,690; python: 2,655; ruby: 1,594; yacc: 845; makefile: 440; xml: 317; sed: 12; sql: 6
file content (63 lines) | stat: -rw-r--r-- 2,781 bytes parent folder | download | duplicates (2)
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
61
62
63
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")
		SET(CMAKE_TRY_COMPILE_TARGET_TYPE_SAVE ${CMAKE_TRY_COMPILE_TARGET_TYPE})
		SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # added to silence Windows Defender
		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}")
		SET(CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE_SAVE})

		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)