From e3e361094b55464999bd979a11464cfc517d349b Mon Sep 17 00:00:00 2001 From: Nicholas Devenish Date: Sat, 12 Mar 2022 16:54:12 +0000 Subject: [PATCH 1/4] Add CMake build This pulls in it's own copy of HDF5, and builds it strictly statically. --- CMakeLists.txt | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..467bde2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 3.19 FATAL_ERROR) + +set(CMAKE_C_STANDARD 99) + + +project(durin LANGUAGES C) + +# Since we want the fortran building to be optional, check if it exists +include(CheckLanguage) +check_language(Fortran) + +############################################################################### +# Building HDF5 in-tree +set(FETCHCONTENT_QUIET OFF CACHE BOOL "Quiet Fetching" FORCE) +include(FetchContent) +FetchContent_Declare( + hdf5 + URL https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_12_1.tar.gz + URL_HASH SHA256=e6dde173c2d243551922d23a0387a79961205b018502e6a742acb30b61bc2d5f +) +# To get what we want, this includes overriding settings +set(HDF5_EXTERNALLY_CONFIGURED ON) +set(ALLOW_UNSUPPORTED ON CACHE BOOL "Allow HL and threadsafe" FORCE) +set(BUILD_TESTING OFF CACHE BOOL "Build HDF5 Unit Testing") +set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries") +set(HDF5_BUILD_CPP_LIB OFF CACHE BOOL "Build HDF5 C++ Library") +set(HDF5_BUILD_HL_LIB ON CACHE BOOL "Build HIGH Level HDF5 Library") +set(HDF5_BUILD_TOOLS OFF CACHE BOOL "Build HDF5 Tools") +set(HDF5_BUILD_EXAMPLES OFF CACHE BOOL "Build HDF5 Library Examples") +set(HDF5_DISABLE_COMPILER_WARNINGS ON CACHE BOOL "Disable HDF5 Warnings") +set(HDF5_GENERATE_HEADERS OFF CACHE BOOL "Don't regenerate HDF5 headers" FORCE) +set(HDF5_ENABLE_THREADSAFE ON CACHE BOOL "Enable thread-safety") +set(HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable Deprecated Symbols") + +FetchContent_MakeAvailable(hdf5) + +############################################################################### +# Bitshuffle +# +add_library(bslz4 + STATIC + bslz4/src/lz4.c + bslz4/src/bitshuffle.c + bslz4/src/bitshuffle_core.c + bslz4/src/iochain.c +) +target_include_directories(bslz4 PUBLIC bslz4/src) +set_property(TARGET bslz4 PROPERTY POSITION_INDEPENDENT_CODE ON) + +############################################################################### +# Objects shared between targeta +# +# Only build the objects shared between durin-plugin and example, once. +# +add_library(durin-objects OBJECT src/file.c src/err.c src/filters.c ) +target_link_libraries(durin-objects PUBLIC hdf5-static hdf5_hl-static ) +target_link_libraries(durin-objects PRIVATE bslz4 ) +set_property(TARGET durin-objects PROPERTY POSITION_INDEPENDENT_CODE ON) +# Even if using HDF5 1.12, we want the 1.10 API +target_compile_definitions(durin-objects PUBLIC H5_USE_110_API) + +############################################################################### +# durin-plugin +# +add_library(durin-plugin MODULE src/plugin.c ) +target_link_libraries(durin-plugin PRIVATE bslz4 durin-objects) +set_property(TARGET durin-plugin PROPERTY PREFIX "") + +############################################################################### +# example +# +add_executable(example src/test.c ) +target_link_libraries(example durin-objects ) +set_property(TARGET example PROPERTY EXCLUDE_FROM_ALL YES) +############################################################################### +# The fortran plugin tester is optional +# +if(CMAKE_Fortran_COMPILER) + enable_language(Fortran) + find_package(OpenMP COMPONENTS Fortran) + if (OpenMP_FOUND) + add_executable(test_plugin test/generic_data_plugin.f90 test/test_generic_host.f90) + target_link_libraries(test_plugin PRIVATE dl OpenMP::OpenMP_Fortran) + set_property(TARGET test_plugin PROPERTY EXCLUDE_FROM_ALL YES) + endif() +endif() From 13ae184e58d52844a9f4d15186eb08261dd1529a Mon Sep 17 00:00:00 2001 From: Nicholas Devenish Date: Sat, 12 Mar 2022 16:55:38 +0000 Subject: [PATCH 2/4] Reorder imports in test.c It looks like some configurations have stddef implicitly imported. --- src/test.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test.c b/src/test.c index 86546bf..11e3169 100644 --- a/src/test.c +++ b/src/test.c @@ -1,9 +1,10 @@ -#include "err.h" -#include "file.h" #include #include #include +#include "err.h" +#include "file.h" + #define COPY_AND_MASK(in, out, size, mask) \ { \ int i; \ From 5a0c35a434e45844a40901a3febcdec23f9c9643 Mon Sep 17 00:00:00 2001 From: Nicholas Devenish Date: Sun, 13 Mar 2022 11:12:55 +0000 Subject: [PATCH 3/4] Make a Release build by default The symbols for all of HDF5 causes >10mb bloat --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 467bde2..c5fc323 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,12 @@ project(durin LANGUAGES C) include(CheckLanguage) check_language(Fortran) +# Set the default build type to RelWithDebInfo +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") +endif() + ############################################################################### # Building HDF5 in-tree set(FETCHCONTENT_QUIET OFF CACHE BOOL "Quiet Fetching" FORCE) From de47afc30aeccbaac37b21cc497d0d7a2304e779 Mon Sep 17 00:00:00 2001 From: Nicholas Devenish Date: Mon, 28 Mar 2022 11:27:22 +0100 Subject: [PATCH 4/4] Make HDF5 self-building optional --- CMakeLists.txt | 55 +++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c5fc323..1efcac9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,28 +17,37 @@ endif() ############################################################################### # Building HDF5 in-tree -set(FETCHCONTENT_QUIET OFF CACHE BOOL "Quiet Fetching" FORCE) -include(FetchContent) -FetchContent_Declare( - hdf5 - URL https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_12_1.tar.gz - URL_HASH SHA256=e6dde173c2d243551922d23a0387a79961205b018502e6a742acb30b61bc2d5f -) -# To get what we want, this includes overriding settings -set(HDF5_EXTERNALLY_CONFIGURED ON) -set(ALLOW_UNSUPPORTED ON CACHE BOOL "Allow HL and threadsafe" FORCE) -set(BUILD_TESTING OFF CACHE BOOL "Build HDF5 Unit Testing") -set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries") -set(HDF5_BUILD_CPP_LIB OFF CACHE BOOL "Build HDF5 C++ Library") -set(HDF5_BUILD_HL_LIB ON CACHE BOOL "Build HIGH Level HDF5 Library") -set(HDF5_BUILD_TOOLS OFF CACHE BOOL "Build HDF5 Tools") -set(HDF5_BUILD_EXAMPLES OFF CACHE BOOL "Build HDF5 Library Examples") -set(HDF5_DISABLE_COMPILER_WARNINGS ON CACHE BOOL "Disable HDF5 Warnings") -set(HDF5_GENERATE_HEADERS OFF CACHE BOOL "Don't regenerate HDF5 headers" FORCE) -set(HDF5_ENABLE_THREADSAFE ON CACHE BOOL "Enable thread-safety") -set(HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable Deprecated Symbols") +option(BUILD_HDF5 "Build our own copy of HDF5" ON) + +if (BUILD_HDF5) + set(FETCHCONTENT_QUIET OFF CACHE BOOL "Quiet Fetching" FORCE) + include(FetchContent) + FetchContent_Declare( + hdf5 + URL https://github.com/HDFGroup/hdf5/archive/refs/tags/hdf5-1_12_1.tar.gz + URL_HASH SHA256=e6dde173c2d243551922d23a0387a79961205b018502e6a742acb30b61bc2d5f + ) + # To get what we want, this includes overriding settings + set(HDF5_EXTERNALLY_CONFIGURED ON) + set(ALLOW_UNSUPPORTED ON CACHE BOOL "Allow HL and threadsafe" FORCE) + set(BUILD_TESTING OFF CACHE BOOL "Build HDF5 Unit Testing") + set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries") + set(HDF5_BUILD_CPP_LIB OFF CACHE BOOL "Build HDF5 C++ Library") + set(HDF5_BUILD_HL_LIB ON CACHE BOOL "Build HIGH Level HDF5 Library") + set(HDF5_BUILD_TOOLS OFF CACHE BOOL "Build HDF5 Tools") + set(HDF5_BUILD_EXAMPLES OFF CACHE BOOL "Build HDF5 Library Examples") + set(HDF5_DISABLE_COMPILER_WARNINGS ON CACHE BOOL "Disable HDF5 Warnings") + set(HDF5_GENERATE_HEADERS OFF CACHE BOOL "Don't regenerate HDF5 headers" FORCE) + set(HDF5_ENABLE_THREADSAFE ON CACHE BOOL "Enable thread-safety") + set(HDF5_ENABLE_DEPRECATED_SYMBOLS ON CACHE BOOL "Enable Deprecated Symbols") -FetchContent_MakeAvailable(hdf5) + FetchContent_MakeAvailable(hdf5) + + add_library(HDF5::HDF5 INTERFACE IMPORTED) + target_link_libraries(HDF5::HDF5 INTERFACE hdf5-static hdf5_hl-static) +else() + find_package(HDF5 REQUIRED COMPONENTS C HL) +endif() ############################################################################### # Bitshuffle @@ -59,7 +68,7 @@ set_property(TARGET bslz4 PROPERTY POSITION_INDEPENDENT_CODE ON) # Only build the objects shared between durin-plugin and example, once. # add_library(durin-objects OBJECT src/file.c src/err.c src/filters.c ) -target_link_libraries(durin-objects PUBLIC hdf5-static hdf5_hl-static ) +target_link_libraries(durin-objects PUBLIC HDF5::HDF5 ) target_link_libraries(durin-objects PRIVATE bslz4 ) set_property(TARGET durin-objects PROPERTY POSITION_INDEPENDENT_CODE ON) # Even if using HDF5 1.12, we want the 1.10 API @@ -84,7 +93,7 @@ set_property(TARGET example PROPERTY EXCLUDE_FROM_ALL YES) if(CMAKE_Fortran_COMPILER) enable_language(Fortran) find_package(OpenMP COMPONENTS Fortran) - if (OpenMP_FOUND) + if (OpenMP_FOUND) add_executable(test_plugin test/generic_data_plugin.f90 test/test_generic_host.f90) target_link_libraries(test_plugin PRIVATE dl OpenMP::OpenMP_Fortran) set_property(TARGET test_plugin PROPERTY EXCLUDE_FROM_ALL YES)