55 lines
2.3 KiB
CMake
55 lines
2.3 KiB
CMake
include(CheckCSourceRuns)
|
|
|
|
cmake_push_check_state(RESET)
|
|
|
|
# Check whether IEEE754 doubles are laid out in little-endian order. We do this
|
|
# only when not cross-compiling; during cross-compilation, the host architecture
|
|
# might have different endianness conventions than the target, and we are running
|
|
# the test on the host here
|
|
if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR)
|
|
# If we are cross-compiling and we have no emulator, let's just assume that
|
|
# IEEE754 doubles use the same endianness as uint64_t
|
|
set(IEEE754_DOUBLE_ENDIANNESS_MATCHES YES)
|
|
message(WARNING "\
|
|
igraph is being cross-compiled, therefore we cannot validate whether the \
|
|
endianness of IEEE754 doubles is the same as the endianness of uint64_t. \
|
|
Most likely it is, unless you are compiling for some esoteric platform, \
|
|
in which case you need make sure that this is the case on your own.\
|
|
")
|
|
else()
|
|
if(NOT DEFINED CACHE{IEEE754_DOUBLE_ENDIANNESS_MATCHES})
|
|
try_run(
|
|
IEEE754_DOUBLE_ENDIANNESS_TEST_EXIT_CODE
|
|
IEEE754_DOUBLE_ENDIANNESS_TEST_COMPILES
|
|
${CMAKE_BINARY_DIR}
|
|
${PROJECT_SOURCE_DIR}/etc/cmake/ieee754_endianness_check.c
|
|
RUN_OUTPUT_VARIABLE IEEE754_DOUBLE_ENDIANNESS_TEST_RESULT
|
|
)
|
|
# Strip trailing newline, which is necessary on some platforms (such as node.js)
|
|
# to complete printing the output.
|
|
string(STRIP "${IEEE754_DOUBLE_ENDIANNESS_TEST_RESULT}" IEEE754_DOUBLE_ENDIANNESS_TEST_RESULT)
|
|
if(IEEE754_DOUBLE_ENDIANNESS_TEST_EXIT_CODE EQUAL 0)
|
|
if(IEEE754_DOUBLE_ENDIANNESS_TEST_RESULT STREQUAL "OK")
|
|
set(TEST_RESULT YES)
|
|
else()
|
|
set(TEST_RESULT NO)
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "IEEE754 double endianness test terminated abnormally.")
|
|
endif()
|
|
|
|
set(
|
|
IEEE754_DOUBLE_ENDIANNESS_MATCHES ${TEST_RESULT} CACHE BOOL
|
|
"Specifies whether the endianness of IEEE754 doubles is the same as the endianness of uint64_t."
|
|
FORCE
|
|
)
|
|
mark_as_advanced(IEEE754_DOUBLE_ENDIANNESS_MATCHES)
|
|
endif()
|
|
endif()
|
|
|
|
cmake_pop_check_state()
|
|
|
|
if(NOT IEEE754_DOUBLE_ENDIANNESS_MATCHES)
|
|
message(FATAL_ERROR "igraph only supports platforms where IEEE754 doubles have the same endianness as uint64_t.")
|
|
endif()
|