From b6993a05913eddb7b3e4d7131ef3cfe81a699173 Mon Sep 17 00:00:00 2001 From: Kris Thielemans Date: Fri, 21 Jun 2019 14:44:37 +0100 Subject: [PATCH] changes to HDF5 support (mostly for Windows compatibility) - use version HDF5 1.8.12 on Windows if Matlab is being built (see #208). At the moment the version is hard-wired. However, this likely introduced a conflict with Python as it usually uses a more recent version of HDF5 (certainly the Anaconda version does) - add a patch for HDF5 1.8.12 such that it compiles post VS 2013. - introduce a HDF5_DOWNLOAD_VERSION variable - introduce a HDF5_CMAKE_ARGS variable for use in the cmake files that depend on HDF5 This now works fine on Windows as far as I see. On Windows, we will need to have 2 separate builds for MATLAB or Python support unfortunately. --- SuperBuild/External_HDF5.cmake | 64 +++++++++++++++++++++++++++------- patches/hdf5-1.8.12.patch | 11 ++++++ version_config.cmake | 28 +++++++++++++-- 3 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 patches/hdf5-1.8.12.patch diff --git a/SuperBuild/External_HDF5.cmake b/SuperBuild/External_HDF5.cmake index c609f0e2..73c55b82 100644 --- a/SuperBuild/External_HDF5.cmake +++ b/SuperBuild/External_HDF5.cmake @@ -42,6 +42,7 @@ set(${proj}_TMP_DIR "${SUPERBUILD_WORK_DIR}/builds/${proj}/tmp" ) if(NOT ( DEFINED "USE_SYSTEM_${externalProjName}" AND "${USE_SYSTEM_${externalProjName}}" ) ) message(STATUS "${__indent}Adding project ${proj}") + message(STATUS "HDF5_DOWNLOAD_VERSION=${HDF5_DOWNLOAD_VERSION}") ### --- Project specific additions here set(HDF5_Install_Dir ${SUPERBUILD_INSTALL_DIR}) @@ -58,34 +59,76 @@ if(NOT ( DEFINED "USE_SYSTEM_${externalProjName}" AND "${USE_SYSTEM_${externalPr set(HDF5_BUILD_HL_LIB "ON") endif() - ExternalProject_Add(${proj} + if (WIN32 AND (${HDF5_DOWNLOAD_VERSION} STREQUAL 1.8.12)) + find_program(GIT "git") + set(PATCHFILE "${CMAKE_SOURCE_DIR}/patches/hdf5-${HDF5_DOWNLOAD_VERSION}.patch") + set(PATCH_COMMAND "git apply -v --ignore-space-change --ignore-whitespace ${PATCHFILE}") + endif() + + if (PATCH_COMMAND) + message(STATUS "HDF5 PATCH_COMMAND=${PATCH_COMMAND}") + endif() + + # sadly, cannot use "PATCH_COMMAND ${PATCH_COMMAND}" below. with weird error + if (PATCHFILE) + ExternalProject_Add(${proj} ${${proj}_EP_ARGS} URL ${${proj}_URL} URL_HASH MD5=${${proj}_MD5} + PATCH_COMMAND ${GIT} apply -v --ignore-space-change --ignore-whitespace ${PATCHFILE} + #PATCH_COMMAND ${PATCH_COMMAND} + SOURCE_DIR ${${proj}_SOURCE_DIR} + BINARY_DIR ${${proj}_BINARY_DIR} + DOWNLOAD_DIR ${${proj}_DOWNLOAD_DIR} + STAMP_DIR ${${proj}_STAMP_DIR} + TMP_DIR ${${proj}_TMP_DIR} + CMAKE_ARGS + ${CLANG_ARG} + -DHDF5_BUILD_EXAMPLES:BOOL=OFF + -DHDF5_BUILD_TOOLS:BOOL=OFF + -DHDF5_BUILD_HL_LIB:BOOL=${HDF5_BUILD_HL_LIB} + -DBUILD_TESTING:BOOL=OFF + INSTALL_DIR ${HDF5_Install_Dir} + ) + else() + ExternalProject_Add(${proj} + ${${proj}_EP_ARGS} + URL ${${proj}_URL} + URL_HASH MD5=${${proj}_MD5} SOURCE_DIR ${${proj}_SOURCE_DIR} BINARY_DIR ${${proj}_BINARY_DIR} DOWNLOAD_DIR ${${proj}_DOWNLOAD_DIR} STAMP_DIR ${${proj}_STAMP_DIR} TMP_DIR ${${proj}_TMP_DIR} - CMAKE_ARGS ${CLANG_ARG} - -DHDF5_BUILD_EXAMPLES=OFF - -DHDF5_BUILD_TOOLS=OFF - -DHDF5_BUILD_HL_LIB=${HDF5_BUILD_HL_LIB} - -DBUILD_TESTING=OFF + -DHDF5_BUILD_EXAMPLES:BOOL=OFF + -DHDF5_BUILD_TOOLS:BOOL=OFF + -DHDF5_BUILD_HL_LIB:BOOL=${HDF5_BUILD_HL_LIB} + -DBUILD_TESTING:BOOL=OFF INSTALL_DIR ${HDF5_Install_Dir} - ) + ) + endif() set( HDF5_ROOT ${HDF5_Install_Dir} ) set( HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include ) + set(HDF5_CMAKE_ARGS + "-DHDF5_ROOT:PATH=${HDF5_ROOT} + -DHDF5_INCLUDE_DIRS:PATH=${HDF5_INCLUDE_DIRS} + -DHDF5_FIND_DEBUG:BOOL=ON" + ) else() if(${USE_SYSTEM_${externalProjName}}) find_package(${proj} ${${externalProjName}_REQUIRED_VERSION} REQUIRED) message(STATUS "USING the system ${externalProjName}, found HDF5_INCLUDE_DIRS=${HDF5_INCLUDE_DIRS}, HDF5_C_LIBRARY_hdf5=${HDF5_C_LIBRARY_hdf5},HDF5_LIBRARIES=${HDF5_LIBRARIES}") + set(HDF5_CMAKE_ARGS + "-DHDF5_INCLUDE_DIRS:PATH=${HDF5_INCLUDE_DIRS} + -DHDF5_LIBRARIES:STRING=${HDF5_LIBRARIES} + -DHDF5_FIND_DEBUG:BOOL=ON" + ) endif() ExternalProject_Add_Empty(${proj} DEPENDS "${${proj}_DEPENDENCIES}" SOURCE_DIR ${${proj}_SOURCE_DIR} @@ -96,9 +139,4 @@ if(NOT ( DEFINED "USE_SYSTEM_${externalProjName}" AND "${USE_SYSTEM_${externalPr ) endif() -mark_as_superbuild( - VARS - ${externalProjName}_DIR:PATH - LABELS - "FIND_PACKAGE" -) +message(STATUS "HDF5_CMAKE_ARGS=${HDF5_CMAKE_ARGS}") diff --git a/patches/hdf5-1.8.12.patch b/patches/hdf5-1.8.12.patch new file mode 100644 index 00000000..b7214ff2 --- /dev/null +++ b/patches/hdf5-1.8.12.patch @@ -0,0 +1,11 @@ +--- xx 2019-06-20 20:38:35.399865600 +0000 ++++ ./config/cmake/ConfigureChecks.cmake 2019-06-20 20:20:00.586270800 +0000 +@@ -185,7 +185,7 @@ + ENDIF (NOT UNIX AND NOT CYGWIN AND NOT MINGW) + SET (H5_HAVE_FUNCTION 1) + SET (H5_GETTIMEOFDAY_GIVES_TZ 1) +- SET (H5_HAVE_TIMEZONE 1) ++ SET (H5_HAVE_TIMEZONE 0) + SET (H5_HAVE_GETTIMEOFDAY 1) + SET (H5_LONE_COLON 0) + IF (MINGW) diff --git a/version_config.cmake b/version_config.cmake index 94ac53c3..0a15403f 100644 --- a/version_config.cmake +++ b/version_config.cmake @@ -65,12 +65,34 @@ set(FFTW3double_MD5 ${FFTW3_MD5}) if (WIN32) # 1.8.15 hdf5-targets.cmake refers to non-existent zlib files # (or at least this was the case for older Anaconda installations) - set(HDF5_REQUIRED_VERSION 1.8.17) + if (USE_SYSTEM_HDF5) + set(HDF5_REQUIRED_VERSION 1.8.17) + #set(HDF5_REQUIRED_VERSION 1.8) + endif() + if (BUILD_MATLAB) + set(HDF5_DOWNLOAD_MAJOR_MINOR_VERSION "1.8") + set(HDF5_DOWNLOAD_PATCH_VERSION "12") + else() + set(HDF5_DOWNLOAD_MAJOR_MINOR_VERSION "1.10") + set(HDF5_DOWNLOAD_PATCH_VERSION "1") + endif() + set(HDF5_DOWNLOAD_VERSION "${HDF5_DOWNLOAD_MAJOR_MINOR_VERSION}.${HDF5_DOWNLOAD_PATCH_VERSION}") + set(HDF5_URL https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-${HDF5_DOWNLOAD_MAJOR_MINOR_VERSION}/hdf5-${HDF5_DOWNLOAD_VERSION}/src/hdf5-${HDF5_DOWNLOAD_VERSION}.tar.gz) else() set(HDF5_REQUIRED_VERSION 1.8) + set(HDF5_DOWNLOAD_MAJOR_MINOR_VERSION "1.10") + set(HDF5_DOWNLOAD_PATCH_VERSION "1") + set(HDF5_DOWNLOAD_VERSION "${HDF5_DOWNLOAD_MAJOR_MINOR_VERSION}.${HDF5_DOWNLOAD_PATCH_VERSION}") + set(HDF5_URL https://www.ccppetmr.ac.uk/sites/www.ccppetmr.ac.uk/files/downloads/hdf5-${HDF5_DOWNLOAD_VERSION}.tar.gz) +endif() + +if (${HDF5_DOWNLOAD_VERSION} STREQUAL 1.8.12) + set(HDF5_MD5 4711e0d6b87d442f194c5d29ba7fbe62 ) +elseif (${HDF5_DOWNLOAD_VERSION} STREQUAL 1.10.1) + set(HDF5_MD5 43a2f9466702fb1db31df98ae6677f15 ) +else() + message(FATAL_ERROR "Developer error: need to set HDF5_MD5 for version ${HDF5_DOWNLOAD_VERSION}") endif() -set(HDF5_URL https://www.ccppetmr.ac.uk/sites/www.ccppetmr.ac.uk/files/downloads/hdf5-1.10.1.tar.gz) -set(HDF5_MD5 43a2f9466702fb1db31df98ae6677f15 ) ## SWIG set (SWIG_REQUIRED_VERSION 2)