Index: cmake/modules/CheckCompilerVersion.cmake =================================================================== --- cmake/modules/CheckCompilerVersion.cmake +++ cmake/modules/CheckCompilerVersion.cmake @@ -1,28 +1,45 @@ -# Check if the host compiler is new enough. LLVM requires at least GCC 4.8, -# MSVC 2015 (Update 3), or Clang 3.1. +# Check if the host compiler is new enough. +# These versions are updated based on the following policy: +# llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library include(CheckCXXSourceCompiles) +set(GCC_MIN 4.8) +set(GCC_WARN 4.8) +set(CLANG_MIN 3.1) +set(CLANG_WARN 3.1) +set(APPLECLANG_MIN 3.1) +set(APPLECLANG_WARN 3.1) +set(MSVC_MIN 19.0) +set(MSVC_WARN 19.00.24213.1) + +function(check_compiler_version NAME NICE_NAME MINIMUM_VERSION WARN_VERSION) + if(CMAKE_CXX_COMPILER_ID STREQUAL NAME) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS MINIMUM_VERSION) + message(FATAL_ERROR "Host ${NICE_NAME} version must be at least ${MINIMUM_VERSION}, your version is ${CMAKE_CXX_COMPILER_VERSION}.") + elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS WARN_VERSION) + message(WARNING "Host ${NICE_NAME} version must be at least ${WARN_VERSION} due to miscompiles from earlier versions, your version is ${CMAKE_CXX_COMPILER_VERSION}.") + endif() + endif() +endfunction(check_compiler_version) + if(NOT DEFINED LLVM_COMPILER_CHECKED) set(LLVM_COMPILER_CHECKED ON) if(NOT LLVM_FORCE_USE_OLD_TOOLCHAIN) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) - message(FATAL_ERROR "Host GCC version must be at least 4.8!") - endif() - elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1) - message(FATAL_ERROR "Host Clang version must be at least 3.1!") - endif() + check_compiler_version("GNU" "GCC" ${GCC_MIN} ${GCC_WARN}) + check_compiler_version("Clang" "Clang" ${CLANG_MIN} ${CLANG_WARN}) + check_compiler_version("AppleClang" "Apple Clang" ${APPLECLANG_MIN} ${APPLECLANG_WARN}) + check_compiler_version("MSVC" "Visual Studio" ${MSVC_MIN} ${MSVC_WARN}) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if (CMAKE_CXX_SIMULATE_ID MATCHES "MSVC") - if (CMAKE_CXX_SIMULATE_VERSION VERSION_LESS 19.0) - message(FATAL_ERROR "Host Clang must have at least -fms-compatibility-version=19.0") + if (CMAKE_CXX_SIMULATE_VERSION VERSION_LESS MSVC_MIN) + message(FATAL_ERROR "Host Clang must have at least -fms-compatibility-version=${MSVC_MIN}, your version is ${CMAKE_CXX_COMPILER_VERSION}.") endif() set(CLANG_CL 1) elseif(NOT LLVM_ENABLE_LIBCXX) - # Otherwise, test that we aren't using too old of a version of libstdc++ + # Test that we aren't using too old of a version of libstdc++ # with the Clang compiler. This is tricky as there is no real way to # check the version of libstdc++ directly. Instead we test for a known # bug in libstdc++4.6 that is fixed in libstdc++4.7. @@ -40,13 +57,7 @@ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES}) endif() - elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0) - message(FATAL_ERROR "Host Visual Studio must be at least 2015") - elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.00.24213.1) - message(WARNING "Host Visual Studio should at least be 2015 Update 3 (MSVC 19.00.24213.1)" - " due to miscompiles from earlier versions") - endif() endif() + endif() endif() Index: docs/CMake.rst =================================================================== --- docs/CMake.rst +++ docs/CMake.rst @@ -573,6 +573,11 @@ options, which are passed to the CCACHE_MAXSIZE and CCACHE_DIR environment variables, respectively. +**LLVM_FORCE_USE_OLD_TOOLCHAIN**:BOOL + If enabled, the compiler and standard library versions won't be checked. LLVM + may not compile at all, or might fail at runtime due to known bugs in these + toolchains. + CMake Caches ============