diff --git a/CMakeLists.txt b/CMakeLists.txt index fe75953d21580d1671a5609faa95b632889ad0f2..c483d93936ae7851d346c2c425bb7e3cc6654da2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,16 +98,28 @@ SET(COMPILER_FLAGS -pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wconversion INCLUDE("cmake/compiler-flag-checks.cmake") -# Check for C++17 and require C++17 if available else fallback to C++14 (should currently be sufficient) +# Use CCache if available +FIND_PROGRAM(CCACHE_FOUND ccache) +IF(CCACHE_FOUND) + MESSAGE(STATUS "Using Ccache: ${CCACHE_FOUND}") + SET(CMAKE_CXX_COMPILER_LAUNCHER + "${CCACHE_FOUND}" + CACHE PATH "CCache program" FORCE) +ENDIF() + +# Require C++17 CHECK_CXX_COMPILER_FLAG(-std=c++17 SUPPORT_STD_CXX17) -IF(SUPPORT_STD_CXX17) - SET(CMAKE_CXX_STANDARD 17) -ELSE() - SET(CMAKE_CXX_STANDARD 14) +IF(NOT SUPPORT_STD_CXX17) + MESSAGE(FATAL_ERROR "Compiler does not support required standard C++17") ENDIF() + +SET(CMAKE_CXX_STANDARD 17) SET(CMAKE_CXX_STANDARD_REQUIRED ON) SET(CMAKE_CXX_EXTENSIONS OFF) +# Check if compiler version supports all features: +INCLUDE("cmake/compiler-version-checks.cmake") + # Set some debug flags # FIXME: not using the flag checker now because it wrongly rejects a sanitizer flag.. IF(CMAKE_BUILD_TYPE MATCHES Debug AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))) diff --git a/cmake/compiler-version-checks.cmake b/cmake/compiler-version-checks.cmake new file mode 100644 index 0000000000000000000000000000000000000000..0efa780931842a959eeb07b7c8e1f866c40a4c9b --- /dev/null +++ b/cmake/compiler-version-checks.cmake @@ -0,0 +1,51 @@ +# General overview for compiler support of CXX language and library features: +# https://en.cppreference.com/w/cpp/compiler_support +# +# TODO: at some point this should probably be replaced by a proper use of CMAKE_CXX_COMPILE_FEATURES +# https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html + +# Minimum GCC versions for C++14 and C++17 feature support. +# based on +# https://gcc.gnu.org/projects/cxx-status.html +# https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 +SET(GCC_CXX_14_VERSION_MIN "6.1") +SET(GCC_CXX_17_VERSION_MIN "8.0") + +# Minimum Clang versions for C++14 and C++17 feature support. +# based on +# https://clang.llvm.org/cxx_status.html +SET(CLANG_CXX_14_VERSION_MIN "3.4") +SET(CLANG_CXX_17_VERSION_MIN "7.0") + +# Minimum Apple Clang versions for C++14 and C++17 feature support. +# based on +# https://trac.macports.org/wiki/XcodeVersionInfo +SET(APPLECLANG_CXX_14_VERSION_MIN "6.1") +SET(APPLECLANG_CXX_17_VERSION_MIN "10.0") + +IF(CMAKE_CXX_STANDARD EQUAL 17) + SET(GCC_VERSION_MIN ${GCC_CXX_17_VERSION_MIN}) + SET(CLANG_VERSION_MIN ${CLANG_CXX_17_VERSION_MIN}) + SET(APPLECLANG_VERSION_MIN ${APPLECLANG_CXX_17_VERSION_MIN}) +ELSE() + SET(GCC_VERSION_MIN ${GCC_CXX_14_VERSION_MIN}) + SET(CLANG_VERSION_MIN ${CLANG_CXX_14_VERSION_MIN}) + SET(APPLECLANG_VERSION_MIN ${APPLECLANG_CXX_14_VERSION_MIN}) +ENDIF() + +IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS GCC_VERSION_MIN) + MESSAGE(FATAL_ERROR "Requiring at least GCC version ${GCC_VERSION_MIN}. Available version" + " ${CMAKE_CXX_COMPILER_VERSION} does not fully support required C++ features") + ENDIF() +ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS CLANG_VERSION_MIN) + MESSAGE(FATAL_ERROR "Requiring at least Clang version ${CLANG_VERSION_MIN}. Available version" + " ${CMAKE_CXX_COMPILER_VERSION} does not fully support required C++ features") + ENDIF() +ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS APPLECLANG_VERSION_MIN) + MESSAGE(FATAL_ERROR "Requiring at least AppleClang version ${APPLECLANG_VERSION_MIN}. Available version" + " ${CMAKE_CXX_COMPILER_VERSION} does not fully support required C++ features") + ENDIF() +ENDIF()