Select Git revision
CMakeLists.txt
-
Stéphane Del Pino authored
subrepo: subdir: "packages/HighFive" merged: "0e308c244" upstream: origin: "git@github.com:highfive-devs/HighFive.git" branch: "main" commit: "0e308c244" git-subrepo: version: "0.4.9" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "30db3b8"
Stéphane Del Pino authoredsubrepo: subdir: "packages/HighFive" merged: "0e308c244" upstream: origin: "git@github.com:highfive-devs/HighFive.git" branch: "main" commit: "0e308c244" git-subrepo: version: "0.4.9" origin: "git@github.com:ingydotnet/git-subrepo.git" commit: "30db3b8"
CMakeLists.txt 5.97 KiB
cmake_minimum_required(VERSION 3.13)
cmake_policy(VERSION 3.13)
project(HighFive VERSION 3.0.0)
set(HIGHFIVE_VERSION_PRERELEASE 2)
# Configure HighFive
# ------------------
option(HIGHFIVE_VERBOSE "Set logging level to verbose." OFF)
# Controls if HighFive classes are friends of each other.
#
# There are two compiler bugs that require incompatible choices. The
# GCC compiler bug [1] prevents us from writing:
#
# template<class D>
# friend class NodeTraits<D>;
#
# While a MSVC compiler bug [2] complains that it can't access a
# protected constructor, e.g., `HighFive::Object::Object`.
#
# Starting with `2.7.0` these friend declarations don't matter
# anymore. It's mearly a means of appeasing a compiler.
#
# The values of `HIGHFIVE_HAS_FRIEND_DECLARATIONS` are:
# - that the macro is undefined.
# - `0` which implies not adding the friend declarations.
# - any non-zero integer, i.e. `1`, to add the friend declarations.
#
# Not defining the macro implies that it'll be set to `1` if MSVC is
# detected (or other compilers requiring the friend declarations).
#
# [1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52625
# [2]: https://developercommunity.visualstudio.com/t/MSVC-compiler-improperly-implements-N489/1516410
option(HIGHFIVE_HAS_FRIEND_DECLARATIONS "Enable additional friend declarations. Certain compiler require this On, others Off." OFF)
mark_as_advanced(HIGHFIVE_HAS_FRIEND_DECLARATIONS)
option(HIGHFIVE_FIND_HDF5 "Find and link with HDF5." On)
# Configure Tests & Examples
# --------------------------
# Internal variable that controls the default value for building
# optional things like tests, examples and docs.
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(HIGHFIVE_EXTRAS_DEFAULT ON)
else()
set(HIGHFIVE_EXTRAS_DEFAULT OFF)
endif()
if (CMAKE_CXX_STANDARD GREATER_EQUAL 20)
include(CheckIncludeFileCXX)
CHECK_INCLUDE_FILE_CXX(span HIGHFIVE_TEST_SPAN_DEFAULT)
else()
set(HIGHFIVE_TEST_SPAN_DEFAULT Off)
endif()
option(HIGHFIVE_UNIT_TESTS "Compile unit-tests" ${HIGHFIVE_EXTRAS_DEFAULT})
option(HIGHFIVE_EXAMPLES "Compile examples" ${HIGHFIVE_EXTRAS_DEFAULT})
option(HIGHFIVE_BUILD_DOCS "Build documentation" ${HIGHFIVE_EXTRAS_DEFAULT})
option(HIGHFIVE_TEST_SPAN "Enable testing std::span, requires C++20" ${HIGHFIVE_TEST_SPAN_DEFAULT})
option(HIGHFIVE_TEST_BOOST "Enable testing Boost features" OFF)
option(HIGHFIVE_TEST_BOOST_SPAN "Additionally, enable testing `boost::span`" OFF)
option(HIGHFIVE_TEST_EIGEN "Enable testing Eigen" OFF)
option(HIGHFIVE_TEST_OPENCV "Enable testing OpenCV" OFF)
option(HIGHFIVE_TEST_XTENSOR "Enable testing xtensor" OFF)
option(HIGHFIVE_TEST_HALF_FLOAT "Enable testing half-precision floats" OFF)
# TODO remove entirely.
option(HIGHFIVE_HAS_CONCEPTS "Print readable compiler errors w/ C++20 concepts" OFF)
set(HIGHFIVE_MAX_ERRORS 0 CACHE STRING "Maximum number of compiler errors.")
option(HIGHFIVE_HAS_WERROR "Convert warnings to errors." OFF)
option(HIGHFIVE_GLIBCXX_ASSERTIONS "Enable bounds check for STL." OFF)
# TODO these some magic to get a drop down menu in ccmake
set(HIGHFIVE_SANITIZER OFF CACHE STRING "Enable a group of sanitizers, requires compiler support. Supported: 'address' and 'undefined'.")
mark_as_advanced(HIGHFIVE_SANITIZER)
# Check compiler cxx_std requirements
# -----------------------------------
set(HIGHFIVE_CXX_STANDARD_DEFAULT 14)
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD ${HIGHFIVE_CXX_STANDARD_DEFAULT})
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS ${HIGHFIVE_CXX_STANDARD_DEFAULT})
message(FATAL_ERROR "HighFive needs to be compiled with at least C++${HIGHFIVE_CXX_STANDARD_DEFAULT}")
endif()
add_compile_definitions(HIGHFIVE_CXX_STD=${CMAKE_CXX_STANDARD})
# HighFive
# --------
add_library(HighFiveInclude INTERFACE)
add_library(HighFive::Include ALIAS HighFiveInclude)
set_target_properties(HighFiveInclude PROPERTIES EXPORT_NAME Include)
target_include_directories(HighFiveInclude INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
add_library(HighFive INTERFACE)
add_library(HighFive::HighFive ALIAS HighFive)
target_link_libraries(HighFive INTERFACE HighFive::Include)
if(HIGHFIVE_FIND_HDF5)
find_package(HDF5 REQUIRED)
target_link_libraries(HighFive INTERFACE HDF5::HDF5)
endif()
if(HDF5_IS_PARALLEL)
find_package(MPI REQUIRED)
target_link_libraries(HighFive
INTERFACE
$<BUILD_INTERFACE:MPI::MPI_C>
$<BUILD_INTERFACE:MPI::MPI_CXX>
)
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/highfive/H5Version.hpp.in
${CMAKE_CURRENT_SOURCE_DIR}/include/highfive/H5Version.hpp)
# Install
# -------
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/cmake/HighFiveConfigVersion.cmake
VERSION ${PACKAGE_VERSION}
COMPATIBILITY AnyNewerVersion
)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/
DESTINATION "include"
PATTERN "*.in" EXCLUDE)
install(TARGETS HighFive HighFiveInclude EXPORT HighFiveTargets)
install(EXPORT HighFiveTargets
FILE HighFiveTargets.cmake
NAMESPACE HighFive::
DESTINATION lib/cmake/HighFive
)
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/cmake/HighFiveConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/cmake/HighFiveConfigVersion.cmake
DESTINATION lib/cmake/HighFive
)
# Preparing local building (tests, examples)
# ------------------------------------------
if(HIGHFIVE_EXAMPLES OR HIGHFIVE_UNIT_TESTS)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/HighFiveWarnings.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/HighFiveFlags.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/HighFiveOptionalDependencies.cmake)
endif()
if(HIGHFIVE_EXAMPLES)
add_subdirectory(src/examples)
endif()
if(HIGHFIVE_UNIT_TESTS)
add_subdirectory(deps/catch2 EXCLUDE_FROM_ALL)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/contrib)
enable_testing()
add_subdirectory(tests/unit)
endif()
if(HIGHFIVE_BUILD_DOCS)
add_subdirectory(doc)
endif()