[PATCH] D56799: [NFC] Factor out + document build requirements

JF Bastien via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 16 11:30:56 PST 2019


jfb created this revision.
Herald added subscribers: llvm-commits, dexonsmith, jkorous, mgorny.

This change factors out compiler checking / warning, and documents LLVM_FORCE_USE_OLD_TOOLCHAIN. It doesn't introduce any functional changes nor policy changes, these will come late.


Repository:
  rL LLVM

https://reviews.llvm.org/D56799

Files:
  cmake/modules/CheckCompilerVersion.cmake
  docs/CMake.rst


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
 ============
 
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()


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56799.182109.patch
Type: text/x-patch
Size: 4233 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190116/0eb49489/attachment.bin>


More information about the llvm-commits mailing list