From bbba0624261c9164161a62a2ee10af907b957a2d Mon Sep 17 00:00:00 2001 From: Lars Bilke <lars.bilke@ufz.de> Date: Thu, 3 Dec 2020 09:37:04 +0100 Subject: [PATCH] [CMake] Introduced option OGS_USE_XDMF (defaults to OFF). Makes hdf5 and libxml2 dependencies optional. --- CMakeLists.txt | 5 +++ MeshLib/CMakeLists.txt | 8 +++- MeshLib/IO/writeMeshToFile.cpp | 2 + ProcessLib/Output/Output.cpp | 8 ++++ ProcessLib/Output/Output.h | 6 +++ ProcessLib/Output/ProcessOutput.cpp | 6 +++ Tests/CMakeLists.txt | 4 +- ThirdParty/CMakeLists.txt | 68 ++++++++++++++--------------- scripts/ci/jobs/code-quality.yml | 2 +- scripts/cmake/ConanSetup.cmake | 32 ++++++++------ 10 files changed, 89 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 928bf041b43..72339dbf4ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,6 +110,7 @@ option(OGS_INSITU "Builds OGS with insitu visualization capabilities." OFF) option(OGS_USE_LIS "Use Lis" OFF) option(OGS_USE_PETSC "Use PETSc routines" OFF) option(OGS_USE_NETCDF "Add NetCDF support." OFF) +option(OGS_USE_XDMF "Add Xdmf file IO support" OFF) # Eigen option(OGS_USE_EIGEN "Use Eigen linear solver" ON) @@ -237,6 +238,10 @@ if(OGS_USE_EIGEN) endif() # End Eigen +if(OGS_USE_XDMF) + add_definitions(-DOGS_USE_XDMF) +endif() + if(OGS_FATAL_ABORT) add_definitions(-DOGS_FATAL_ABORT) endif() diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt index c328d33c7cd..e73de0542b3 100644 --- a/MeshLib/CMakeLists.txt +++ b/MeshLib/CMakeLists.txt @@ -12,7 +12,9 @@ append_source_files(SOURCES Elements) append_source_files(SOURCES IO) append_source_files(SOURCES IO/Legacy) append_source_files(SOURCES IO/VtkIO) -append_source_files(SOURCES IO/XDMF) +if(OGS_USE_XDMF) + append_source_files(SOURCES IO/XDMF) +endif() append_source_files(SOURCES MeshQuality) append_source_files(SOURCES Vtk) @@ -26,7 +28,9 @@ ogs_add_library(MeshLib ${SOURCES}) target_link_libraries( MeshLib - PUBLIC BaseLib GeoLib GitInfoLib MathLib ${VTK_LIBRARIES} OgsXdmf + PUBLIC + BaseLib GeoLib GitInfoLib MathLib ${VTK_LIBRARIES} + $<$<TARGET_EXISTS:OgsXdmf>:OgsXdmf> PRIVATE spdlog::spdlog) if(OGS_USE_MPI AND TARGET MPI::MPI_CXX) diff --git a/MeshLib/IO/writeMeshToFile.cpp b/MeshLib/IO/writeMeshToFile.cpp index 2d1165e5012..86dda37ec86 100644 --- a/MeshLib/IO/writeMeshToFile.cpp +++ b/MeshLib/IO/writeMeshToFile.cpp @@ -42,6 +42,7 @@ int writeMeshToFile(const MeshLib::Mesh& mesh, } return 0; } +#ifdef OGS_USE_XDMF if (file_path.extension().string() == ".xdmf") { auto writer = @@ -56,6 +57,7 @@ int writeMeshToFile(const MeshLib::Mesh& mesh, return 0; } +#endif ERR("writeMeshToFile(): Unknown mesh file format in file {:s}.", file_path.string()); return -1; diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp index bd4035eec12..c2b4e1f9af0 100644 --- a/ProcessLib/Output/Output.cpp +++ b/ProcessLib/Output/Output.cpp @@ -227,6 +227,7 @@ struct Output::OutputFile } }; +#ifdef OGS_USE_XDMF void Output::outputMeshXdmf(OutputFile const& output_file, MeshLib::Mesh const& mesh, int const timestep, @@ -245,6 +246,7 @@ void Output::outputMeshXdmf(OutputFile const& output_file, } _mesh_xdmf_writer->writeStep(timestep, t); } +#endif void Output::outputMesh(OutputFile const& output_file, MeshLib::IO::PVDFile* const pvd_file, @@ -313,12 +315,18 @@ void Output::doOutputAlways(Process const& process, } else if (_output_file_type == ProcessLib::OutputType::xdmf) { +#ifdef OGS_USE_XDMF OutputFile const file(_output_directory, _output_file_type, _output_file_prefix, "", mesh.getName(), timestep, t, _output_file_data_mode, _output_file_compression); outputMeshXdmf(file, mesh, timestep, t); +#else + OGS_FATAL( + "Trying to write Xdmf file but OGS was not built with " + "Xdmf-support."); +#endif } }; diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h index 23d6ceec6ed..e75f35c88d6 100644 --- a/ProcessLib/Output/Output.h +++ b/ProcessLib/Output/Output.h @@ -14,7 +14,9 @@ #include <utility> #include "MeshLib/IO/VtkIO/PVDFile.h" +#ifdef OGS_USE_XDMF #include "MeshLib/IO/XDMF/Xdmf3Writer.h" +#endif #include "ProcessOutput.h" namespace ProcessLib @@ -89,13 +91,17 @@ private: MeshLib::Mesh const& mesh, int const timestep, double const t) const; +#ifdef OGS_USE_XDMF void outputMeshXdmf(OutputFile const& output_file, MeshLib::Mesh const& mesh, int const timestep, double const t); +#endif private: +#ifdef OGS_USE_XDMF std::unique_ptr<MeshLib::IO::Xdmf3Writer> _mesh_xdmf_writer; +#endif std::string const _output_directory; OutputType const _output_file_type; std::string const _output_file_prefix; diff --git a/ProcessLib/Output/ProcessOutput.cpp b/ProcessLib/Output/ProcessOutput.cpp index d84278f8a69..5297b79d2f9 100644 --- a/ProcessLib/Output/ProcessOutput.cpp +++ b/ProcessLib/Output/ProcessOutput.cpp @@ -285,11 +285,17 @@ void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh, case OutputType::xdmf: { +#ifdef OGS_USE_XDMF MeshLib::IO::Xdmf3Writer writer( file_name, MeshLib::IO::transformGeometry(mesh), MeshLib::IO::transformTopology(mesh), MeshLib::IO::transformAttributes(mesh), time_step); writer.writeStep(time_step, time); +#else + OGS_FATAL( + "Trying to write Xdmf file but OGS was not built with " + "Xdmf-support."); +#endif } } diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 350ed3570d5..f3e902b7904 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1,5 +1,7 @@ ### xdmfdiff ### -add_subdirectory(xdmfdiff) +if(OGS_USE_XDMF) + add_subdirectory(xdmfdiff) +endif() ### testrunner ### include(${PROJECT_SOURCE_DIR}/scripts/cmake/OGSEnabledElements.cmake) diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 14bdd3ae703..c42ad6743d4 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -88,42 +88,42 @@ if(OGS_BUILD_UTILS) list(APPEND DISABLE_WARNINGS_TARGETS ogs_metis mpmetis) endif() -# Xdmf -find_package(ZLIB REQUIRED) # ZLIB is a HDF5 dependency -set(XDMF_LIBNAME OgsXdmf CACHE INTERNAL "") -add_subdirectory(xdmf) -target_include_directories(${XDMF_LIBNAME} PUBLIC - ${PROJECT_SOURCE_DIR}/ThirdParty/xdmf - ${PROJECT_BINARY_DIR}/ThirdParty/xdmf -) -if(OGS_USE_CONAN AND UNIX AND APPLE) - find_package(Iconv REQUIRED) +if(OGS_USE_XDMF) + find_package(ZLIB REQUIRED) # ZLIB is a HDF5 dependency + set(XDMF_LIBNAME OgsXdmf CACHE INTERNAL "") + add_subdirectory(xdmf) + target_include_directories(${XDMF_LIBNAME} PUBLIC + ${PROJECT_SOURCE_DIR}/ThirdParty/xdmf + ${PROJECT_BINARY_DIR}/ThirdParty/xdmf + ) + if(OGS_USE_CONAN AND UNIX AND APPLE) + find_package(Iconv REQUIRED) + endif() + + if(MSVC AND OGS_USE_CONAN) + # Hack: Conan HDF5 not found on Windows + target_link_libraries(${XDMF_LIBNAME} ${CONAN_LIBS}) + else() + target_link_libraries(${XDMF_LIBNAME} Boost::boost ${Iconv_LIBRARIES} ZLIB::ZLIB) + endif() + target_include_directories(${XDMF_LIBNAME}Core PUBLIC + ${PROJECT_SOURCE_DIR}/ThirdParty/xdmf/core + ${PROJECT_BINARY_DIR}/ThirdParty/xdmf/core + ) + find_package(LibXml2 REQUIRED) # LibXml2 is a XdmfCore dependency + target_link_libraries(${XDMF_LIBNAME}Core PUBLIC LibXml2::LibXml2) + + set_target_properties(${XDMF_LIBNAME} ${XDMF_LIBNAME}Core PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR} + LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} + ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} + ) + if(BUILD_SHARED_LIBS) + install(TARGETS ${XDMF_LIBNAME} ${XDMF_LIBNAME}Core LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif() + list(APPEND DISABLE_WARNINGS_TARGETS ${XDMF_LIBNAME} ${XDMF_LIBNAME}Core) endif() -if(MSVC AND OGS_USE_CONAN) - # Hack: Conan HDF5 not found on Windows - target_link_libraries(${XDMF_LIBNAME} ${CONAN_LIBS}) -else() - target_link_libraries(${XDMF_LIBNAME} Boost::boost ${Iconv_LIBRARIES} ZLIB::ZLIB) -endif() -target_include_directories(${XDMF_LIBNAME}Core PUBLIC - ${PROJECT_SOURCE_DIR}/ThirdParty/xdmf/core - ${PROJECT_BINARY_DIR}/ThirdParty/xdmf/core -) -find_package(LibXml2 REQUIRED) # LibXml2 is a XdmfCore dependency -target_link_libraries(${XDMF_LIBNAME}Core PUBLIC LibXml2::LibXml2) - -set_target_properties(${XDMF_LIBNAME} ${XDMF_LIBNAME}Core PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR} - LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} - ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} -) -if(BUILD_SHARED_LIBS) - install(TARGETS ${XDMF_LIBNAME} ${XDMF_LIBNAME}Core LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() -list(APPEND DISABLE_WARNINGS_TARGETS ${XDMF_LIBNAME} ${XDMF_LIBNAME}Core) -# Xdmf end - foreach(TARGET ${DISABLE_WARNINGS_TARGETS}) target_compile_options(${TARGET} PRIVATE $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>,$<CXX_COMPILER_ID:GNU>>:-w> diff --git a/scripts/ci/jobs/code-quality.yml b/scripts/ci/jobs/code-quality.yml index d7f4021b5c6..59916cf3f8b 100644 --- a/scripts/ci/jobs/code-quality.yml +++ b/scripts/ci/jobs/code-quality.yml @@ -8,7 +8,7 @@ cppcheck: script: - > cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DOGS_USE_CONAN=OFF - -DOGS_USE_UNITY_BUILDS=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + -DOGS_USE_UNITY_BUILDS=OFF -DOGS_USE_XDMF=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - bash cppcheck.sh artifacts: reports: diff --git a/scripts/cmake/ConanSetup.cmake b/scripts/cmake/ConanSetup.cmake index a2eab45b23b..bec3c0476b4 100644 --- a/scripts/cmake/ConanSetup.cmake +++ b/scripts/cmake/ConanSetup.cmake @@ -35,8 +35,6 @@ set(CONAN_REQUIRES boost/${ogs.minimum_version.boost}@conan/stable eigen/${ogs.minimum_version.eigen}@conan/stable vtk/${ogs.tested_version.vtk}@bilke/stable - hdf5/${ogs.tested_version.hdf5} - libxml2/${ogs.tested_version.libxml2} CACHE INTERNAL "" ) @@ -47,9 +45,6 @@ set(CONAN_OPTIONS vtk:iolegacy=True CACHE INTERNAL "" ) -if(UNIX AND NOT APPLE) - list(APPEND CONAN_OPTIONS libxml2:iconv=False) -endif() if((UNIX AND NOT APPLE) AND BUILD_SHARED_LIBS) set(CONAN_OPTIONS ${CONAN_OPTIONS} vtk:fPIC=True) @@ -59,6 +54,24 @@ if(OGS_USE_MPI) set(CONAN_OPTIONS ${CONAN_OPTIONS} vtk:mpi_minimal=True) endif() +if(OGS_USE_XDMF) + list(APPEND CONAN_REQUIRES + hdf5/${ogs.tested_version.hdf5} + libxml2/${ogs.tested_version.libxml2} + ) + if(UNIX AND NOT APPLE) + list(APPEND CONAN_OPTIONS libxml2:iconv=False) + endif() + if(MSVC) + # Hack: Conan HDF5 not found on Windows + # Use custom FindHDF5 with forced values from Conan + list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/scripts/cmake/conan/win-hdf5") + else() + # Hack: Suppress hdf5 compiler wrapper checks + set(HDF5_C_COMPILER_EXECUTABLE "OFF" CACHE INTERNAL "") + endif() +endif() + if(OGS_USE_PETSC) set(CONAN_REQUIRES ${CONAN_REQUIRES} petsc/${ogs.minimum_version.petsc}@bilke/testing) if(OGS_CONAN_USE_SYSTEM_OPENMPI) @@ -194,12 +207,3 @@ endif() if(OGS_USE_PETSC) set(PETSC_DIR ${CONAN_PETSC_ROOT} CACHE INTERNAL "") endif() - -if(MSVC) - # Hack: Conan HDF5 not found on Windows - # Use custom FindHDF5 with forced values from Conan - list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/scripts/cmake/conan/win-hdf5") -else() - # Hack: Suppress hdf5 compiler wrapper checks - set(HDF5_C_COMPILER_EXECUTABLE "OFF" CACHE INTERNAL "") -endif() -- GitLab