From e807dee0fd6c007d7c41327c1ed0e8f5bc617f72 Mon Sep 17 00:00:00 2001 From: Dana Robinson <43805+derobins@users.noreply.github.com> Date: Tue, 14 Nov 2023 20:36:47 -0800 Subject: Add CMake long double cross-compile defaults (#3683) HDF5 performs a couple of checks at build time to see if long double values can be converted correctly (IBM's Power architecture uses a special format for long doubles). These checks were performed using TRY_RUN, which is a problem when cross-compiling. These checks now use default values appropriate for most non-Power systems when cross-compiling. The cache values can be pre-set if necessary, which will preempt both the TRY_RUN and the default. Affected values: H5_LDOUBLE_TO_LONG_SPECIAL (default no) H5_LONG_TO_LDOUBLE_SPECIAL (default no) H5_LDOUBLE_TO_LLONG_ACCURATE (default yes) H5_LLONG_TO_LDOUBLE_CORRECT (default yes) H5_DISABLE_SOME_LDOUBLE_CONV (default no) Fixes GitHub #3585 --- config/cmake/ConfigureChecks.cmake | 59 ++++++++++++++++++++++---------------- release_docs/RELEASE.txt | 20 +++++++++++++ 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake index 3d4c23b..8013363 100644 --- a/config/cmake/ConfigureChecks.cmake +++ b/config/cmake/ConfigureChecks.cmake @@ -872,35 +872,46 @@ if (HDF5_BUILD_FORTRAN) endif() #----------------------------------------------------------------------------- -# Macro to determine the various conversion capabilities +# Macro to determine long double conversion properties #----------------------------------------------------------------------------- -macro (H5ConversionTests TEST msg) +macro (H5ConversionTests TEST def msg) if (NOT DEFINED ${TEST}) - TRY_RUN (${TEST}_RUN ${TEST}_COMPILE - ${CMAKE_BINARY_DIR} - ${HDF_RESOURCES_DIR}/ConversionTests.c - CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-D${TEST}_TEST - OUTPUT_VARIABLE OUTPUT - ) - if (${TEST}_COMPILE) - if (${TEST}_RUN EQUAL "0") - set (${TEST} 1 CACHE INTERNAL ${msg}) - message (VERBOSE "${msg}... yes") + if (NOT CMAKE_CROSSCOMPILING) + # Build and run the test code if not cross-compiling + TRY_RUN (${TEST}_RUN ${TEST}_COMPILE + ${CMAKE_BINARY_DIR} + ${HDF_RESOURCES_DIR}/ConversionTests.c + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-D${TEST}_TEST + OUTPUT_VARIABLE OUTPUT + ) + if (${TEST}_COMPILE) + if (${TEST}_RUN EQUAL "0") + set (${TEST} 1 CACHE INTERNAL ${msg}) + message (VERBOSE "${msg}... yes") + else () + set (${TEST} "" CACHE INTERNAL ${msg}) + message (VERBOSE "${msg}... no") + file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Test ${TEST} Run failed with the following output and exit code:\n ${OUTPUT}\n" + ) + endif () else () set (${TEST} "" CACHE INTERNAL ${msg}) message (VERBOSE "${msg}... no") file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log - "Test ${TEST} Run failed with the following output and exit code:\n ${OUTPUT}\n" + "Test ${TEST} Compile failed with the following output:\n ${OUTPUT}\n" ) endif () else () - set (${TEST} "" CACHE INTERNAL ${msg}) - message (VERBOSE "${msg}... no") - file (APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log - "Test ${TEST} Compile failed with the following output:\n ${OUTPUT}\n" - ) + # Use the default if there's no cache variable and cross-compiling + if (${def}) + message (VERBOSE "${msg}... yes (cross-compile default)") + set (${TEST} 1 CACHE INTERNAL ${msg}) + else () + message (VERBOSE "${msg}... no (cross-compile default)") + set (${TEST} "" CACHE INTERNAL ${msg}) + endif () endif () - endif () endmacro () @@ -917,7 +928,7 @@ endmacro () # The machine's conversion gets the correct value. We define the macro and disable # this kind of test until we figure out what algorithm they use. #----------------------------------------------------------------------------- -H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LONG_SPECIAL "Checking IF your system converts long double to (unsigned) long values with special algorithm") +H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LONG_SPECIAL FALSE "Checking IF your system converts long double to (unsigned) long values with special algorithm") # ---------------------------------------------------------------------- # Set the flag to indicate that the machine is using a special algorithm # to convert some values of '(unsigned) long' to 'long double' values. @@ -926,7 +937,7 @@ H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LONG_SPECIAL "Checking IF your syst # ..., 7fffff..., the compiler uses a unknown algorithm. We define a # macro and skip the test for now until we know about the algorithm. #----------------------------------------------------------------------------- -H5ConversionTests (${HDF_PREFIX}_LONG_TO_LDOUBLE_SPECIAL "Checking IF your system can convert (unsigned) long to long double values with special algorithm") +H5ConversionTests (${HDF_PREFIX}_LONG_TO_LDOUBLE_SPECIAL FALSE "Checking IF your system can convert (unsigned) long to long double values with special algorithm") # ---------------------------------------------------------------------- # Set the flag to indicate that the machine can accurately convert # 'long double' to '(unsigned) long long' values. (This flag should be set for @@ -936,7 +947,7 @@ H5ConversionTests (${HDF_PREFIX}_LONG_TO_LDOUBLE_SPECIAL "Checking IF your syste # 0x4351ccf385ebc8a0dfcc... or 0x4351ccf385ebc8a0ffcc... will make the converted # values wildly wrong. This test detects this wrong behavior and disable the test. #----------------------------------------------------------------------------- -H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LLONG_ACCURATE "Checking IF correctly converting long double to (unsigned) long long values") +H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LLONG_ACCURATE TRUE "Checking IF correctly converting long double to (unsigned) long long values") # ---------------------------------------------------------------------- # Set the flag to indicate that the machine can accurately convert # '(unsigned) long long' to 'long double' values. (This flag should be set for @@ -944,9 +955,9 @@ H5ConversionTests (${HDF_PREFIX}_LDOUBLE_TO_LLONG_ACCURATE "Checking IF correctl # 007fff..., 00ffff..., 01ffff..., ..., 7fffff..., the converted values are twice # as big as they should be. #----------------------------------------------------------------------------- -H5ConversionTests (${HDF_PREFIX}_LLONG_TO_LDOUBLE_CORRECT "Checking IF correctly converting (unsigned) long long to long double values") +H5ConversionTests (${HDF_PREFIX}_LLONG_TO_LDOUBLE_CORRECT TRUE "Checking IF correctly converting (unsigned) long long to long double values") # ---------------------------------------------------------------------- # Set the flag to indicate that the machine can accurately convert # some long double values #----------------------------------------------------------------------------- -H5ConversionTests (${HDF_PREFIX}_DISABLE_SOME_LDOUBLE_CONV "Checking IF the cpu is power9 and cannot correctly converting long double values") +H5ConversionTests (${HDF_PREFIX}_DISABLE_SOME_LDOUBLE_CONV FALSE "Checking IF the cpu is power9 and cannot correctly converting long double values") diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 66355a0..8268cbe 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -47,6 +47,26 @@ New Features Configuration: ------------- + - Added defaults to CMake for long double conversion checks + + HDF5 performs a couple of checks at build time to see if long double + values can be converted correctly (IBM's Power architecture uses a + special format for long doubles). These checks were performed using + TRY_RUN, which is a problem when cross-compiling. + + These checks now use default values appropriate for most non-Power + systems when cross-compiling. The cache values can be pre-set if + necessary, which will preempt both the TRY_RUN and the default. + + Affected values: + H5_LDOUBLE_TO_LONG_SPECIAL (default no) + H5_LONG_TO_LDOUBLE_SPECIAL (default no) + H5_LDOUBLE_TO_LLONG_ACCURATE (default yes) + H5_LLONG_TO_LDOUBLE_CORRECT (default yes) + H5_DISABLE_SOME_LDOUBLE_CONV (default no) + + Fixes GitHub #3585 + - Improved support for Intel oneAPI * Separates the old 'classic' Intel compiler settings and warnings -- cgit v0.12