diff --git a/.github/workflows/ci-ifcopenshell-docker.yml b/.github/workflows/ci-ifcopenshell-docker.yml index cdc2e173b4..f4291b799e 100644 --- a/.github/workflows/ci-ifcopenshell-docker.yml +++ b/.github/workflows/ci-ifcopenshell-docker.yml @@ -63,7 +63,6 @@ jobs: -DMPFR_INCLUDE_DIR=/usr/include \ -DGMP_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ -DMPFR_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ - -DHDF5_INCLUDE_DIR=/usr/include/hdf5/serial \ -DGLTF_SUPPORT=On \ -DJSON_INCLUDE_DIR=/usr/include \ -DEIGEN_DIR=/usr/include/eigen3 \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4db5284ab1..486e244eb2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,6 +118,13 @@ jobs: -DUSE_MMAP=On \ "-DSCHEMA_VERSIONS=2x3;4;4x3_add2" \ -DGLTF_SUPPORT=On \ + -DJSON_INCLUDE_DIR=/usr/include \ + -DCGAL_INCLUDE_DIR=/usr/include \ + -DGMP_INCLUDE_DIR=/usr/include \ + -DMPFR_INCLUDE_DIR=/usr/include \ + -DGMP_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ + -DMPFR_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ + -DEIGEN_DIR=/usr/include/eigen3 \ -DWITH_ROCKSDB=On \ ../cmake sudo make -j $(nproc) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 93ecaf11d8..94e2dac4f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,6 @@ jobs: -DMPFR_INCLUDE_DIR=/usr/include \ -DGMP_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ -DMPFR_LIBRARY_DIR=/usr/lib/x86_64-linux-gnu \ - -DHDF5_INCLUDE_DIR=/usr/include/hdf5/serial \ -DOPENCOLLADA_INCLUDE_DIR=/usr/include/opencollada \ -DOPENCOLLADA_LIBRARY_DIR=/usr/lib/opencollada/ \ ../cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c4f8d0aad2..149be34461 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -104,6 +104,9 @@ endif() project(IfcOpenShell VERSION ${RELEASE_VERSION}) +# Make sure CMake modules in this project are found first +list(PREPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) + if(MINIMAL_BUILD) message(STATUS "Setting options for minimal build") set(BUILD_GEOMSERVER OFF) @@ -730,91 +733,7 @@ endif() if(HDF5_SUPPORT) - if("${HDF5_INCLUDE_DIR}" STREQUAL "") - message(STATUS "No HDF5 include directory specified") - else() - set(HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIR}" CACHE FILEPATH "HDF5 header files") - endif() - - if("${HDF5_LIBRARY_DIR}" STREQUAL "") - message(STATUS "No HDF5 library directory specified") - else() - set(HDF5_LIBRARY_DIR "${HDF5_LIBRARY_DIR}" CACHE FILEPATH "HDF5 library files") - endif() - - if(HDF5_LIBRARY_DIR) - # result of the HDF5 ctest package - # Find zlib using cmake find_library. How should this be implemented? - # FIND_LIBRARY(NAMES z libz libz_debug PATHS ... NO_DEFAULT_PATH) - if("$ENV{CONDA_BUILD}" STREQUAL "") - # result of the HDF5 ctest package - if(WIN32) - set(zlib_post lib) - set(lib_ext lib) - else() - set(lib_ext a) - endif() - - if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set(debug_postfix "_debug") - endif() - - set(HDF5_LIBRARIES - "${HDF5_LIBRARY_DIR}/libhdf5_cpp${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libhdf5${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libz${zlib_post}${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libsz${debug_postfix}.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libaec${debug_postfix}.${lib_ext}" - ) - - else() - message(STATUS "Packaging hdf5 and zlib for conda distribution") - - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - # macOS - set(zlib_post libz) - set(lib_ext dylib) - set(HDF5_LIBRARIES - "${HDF5_LIBRARY_DIR}/libhdf5_cpp.${lib_ext}" - "${HDF5_LIBRARY_DIR}/libhdf5.${lib_ext}" - "${HDF5_LIBRARY_DIR}/${zlib_post}.${lib_ext}" - ) - else() - # linux and windows - # Find HDF5 package - find_package(HDF5 REQUIRED COMPONENTS C CXX) - # Find ZLIB package - find_package(ZLIB REQUIRED) - # Include directories - include_directories(${HDF5_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) - # Link libraries - set(HDF5_LIBRARIES ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES}) - message(STATUS "HDF5 libraries: ${HDF5_LIBRARIES}") - endif() - endif() - endif() - - if(NOT HDF5_INCLUDE_DIR OR NOT HDF5_LIBRARY_DIR) - # First try to find it as a config. - find_package(HDF5 CONFIG) - if(HDF5_DIR) - message(STATUS "HDF5: found config at '${HDF5_DIR}'.") - set(HDF5_LIBRARIES hdf5_cpp-static) - else() - # If it failed, still try to find as a module. - # E.g. on Ubuntu `libhdf5-dev` doesn't provie hdf5-config.cmake. - # Will automatically fill HDF5_LIBRARIES and HDF5_INCLUDE_DIR. - find_package(HDF5 COMPONENTS CXX) - if(NOT HDF5_INCLUDE_DIR) - message( - FATAL_ERROR - "HDF5_INCLUDE_DIR is not provided (current value: '${HDF5_INCLUDE_DIR}'). " - "HDF5_LIBRARY_DIR is not provided (current value: '${HDF5_LIBRARY_DIR}'). " - "Also could not find HDF5 package (neither module or config)." - ) - endif() - endif() - endif() + find_package(HDF5 REQUIRED COMPONENTS C CXX) add_definitions(-DWITH_HDF5) set(SWIG_DEFINES ${SWIG_DEFINES} -DWITH_HDF5) @@ -948,7 +867,7 @@ endif() include_directories(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR} ${JSON_INCLUDE_DIR} ${HDF5_INCLUDE_DIR} + ${Boost_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR} ${JSON_INCLUDE_DIR} ${HDF5_INCLUDE_DIRS} ${EIGEN_DIR} ${CGAL_INCLUDE_DIR} ${GMP_INCLUDE_DIR} ${MPFR_INCLUDE_DIR} ${USD_INCLUDE_DIR} ${TBB_INCLUDE_DIR} ) diff --git a/cmake/CMakePresets.json b/cmake/CMakePresets.json index 9c10495ad3..bef211b735 100644 --- a/cmake/CMakePresets.json +++ b/cmake/CMakePresets.json @@ -51,8 +51,6 @@ "MPFR_LIBRARY_DIR": "$env{LIBRARY_PREFIX}/lib", "Boost_LIBRARY_DIR": "$env{LIBRARY_PREFIX}/lib", "Boost_INCLUDE_DIR": "$env{LIBRARY_PREFIX}/include", - "HDF5_INCLUDE_DIR": "$env{LIBRARY_PREFIX}/include", - "HDF5_LIBRARY_DIR": "$env{LIBRARY_PREFIX}/lib", "ZLIB_INCLUDE_DIR": "$env{LIBRARY_PREFIX}/include" } }, diff --git a/cmake/HDF5Config.cmake b/cmake/HDF5Config.cmake new file mode 100644 index 0000000000..f4ffe492f8 --- /dev/null +++ b/cmake/HDF5Config.cmake @@ -0,0 +1,88 @@ +# To avoid cyclic calls to this file +list(REMOVE_ITEM CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) + +if("${HDF5_INCLUDE_DIR}" STREQUAL "") + message(STATUS "No HDF5 include directory specified") +else() + set(HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIR}" CACHE FILEPATH "HDF5 header files") +endif() + +if("${HDF5_LIBRARY_DIR}" STREQUAL "") + message(STATUS "No HDF5 library directory specified") +else() + set(HDF5_LIBRARY_DIR "${HDF5_LIBRARY_DIR}" CACHE FILEPATH "HDF5 library files") +endif() + +if(HDF5_LIBRARY_DIR) + # result of the HDF5 ctest package + # Find zlib using cmake find_library. How should this be implemented? + # FIND_LIBRARY(NAMES z libz libz_debug PATHS ... NO_DEFAULT_PATH) + if("$ENV{CONDA_BUILD}" STREQUAL "") + # result of the HDF5 ctest package + if(WIN32) + set(zlib_post lib) + set(lib_ext lib) + else() + set(lib_ext a) + endif() + + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + set(debug_postfix "_debug") + endif() + + set(HDF5_LIBRARIES + "${HDF5_LIBRARY_DIR}/libhdf5_cpp${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libhdf5${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libz${zlib_post}${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libsz${debug_postfix}.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libaec${debug_postfix}.${lib_ext}" + ) + + else() + message(STATUS "Packaging hdf5 and zlib for conda distribution") + + if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + # macOS + set(zlib_post libz) + set(lib_ext dylib) + set(HDF5_LIBRARIES + "${HDF5_LIBRARY_DIR}/libhdf5_cpp.${lib_ext}" + "${HDF5_LIBRARY_DIR}/libhdf5.${lib_ext}" + "${HDF5_LIBRARY_DIR}/${zlib_post}.${lib_ext}" + ) + else() + # linux and windows + # Find HDF5 package + find_package(HDF5 REQUIRED COMPONENTS C CXX) + # Find ZLIB package + find_package(ZLIB REQUIRED) + # Include directories + include_directories(${HDF5_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) + # Link libraries + set(HDF5_LIBRARIES ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES}) + message(STATUS "HDF5 libraries: ${HDF5_LIBRARIES}") + endif() + endif() +endif() + +if(NOT HDF5_INCLUDE_DIR OR NOT HDF5_LIBRARY_DIR) + # First try to find it as a config. + find_package(HDF5 CONFIG) + if(HDF5_DIR) + message(STATUS "HDF5: found config at '${HDF5_DIR}'.") + set(HDF5_LIBRARIES hdf5_cpp-static) + else() + # If it failed, still try to find as a module. + # E.g. on Ubuntu `libhdf5-dev` doesn't provie hdf5-config.cmake. + # Will automatically fill HDF5_LIBRARIES and HDF5_INCLUDE_DIR. + find_package(HDF5 COMPONENTS CXX) + if(NOT HDF5_INCLUDE_DIR) + message( + FATAL_ERROR + "HDF5_INCLUDE_DIR is not provided (current value: '${HDF5_INCLUDE_DIR}'). " + "HDF5_LIBRARY_DIR is not provided (current value: '${HDF5_LIBRARY_DIR}'). " + "Also could not find HDF5 package (neither module or config)." + ) + endif() + endif() +endif() diff --git a/conda/build.bat b/conda/build.bat index 388e5cd746..6403ab0f21 100644 --- a/conda/build.bat +++ b/conda/build.bat @@ -24,8 +24,6 @@ cmake -G "Ninja" ^ -D MPFR_LIBRARY_DIR:FILEPATH="%LIBRARY_PREFIX%\lib" ^ -D COLLADA_SUPPORT=OFF ^ -D HDF5_SUPPORT=ON ^ - -D HDF5_INCLUDE_DIR="%LIBRARY_PREFIX%\include" ^ - -D HDF5_LIBRARY_DIR="%LIBRARY_PREFIX%\lib" ^ -D JSON_INCLUDE_DIR="%LIBRARY_PREFIX%\include" ^ -D PYTHON_INCLUDE_DIR=%PREFIX%\include ^ -D PYTHON_EXECUTABLE:FILEPATH=%PREFIX%\python.exe ^ diff --git a/conda/build.sh b/conda/build.sh index b17bc87159..9722e1eb01 100644 --- a/conda/build.sh +++ b/conda/build.sh @@ -26,8 +26,6 @@ cmake ${CMAKE_ARGS} -G Ninja \ -DOCC_INCLUDE_DIR=$PREFIX/include/opencascade \ -DOCC_LIBRARY_DIR=$PREFIX/lib \ -DHDF5_SUPPORT:BOOL=ON \ - -DHDF5_INCLUDE_DIR=$PREFIX/include \ - -DHDF5_LIBRARY_DIR=$PREFIX/lib \ -DJSON_INCLUDE_DIR=$PREFIX/include \ -DCGAL_INCLUDE_DIR=$PREFIX/include \ -DLIBXML2_INCLUDE_DIR=$PREFIX/include/libxml2 \