Bump minimum toolchain version

Summary:
The RFC on moving past C++11 got good traction:
  http://lists.llvm.org/pipermail/llvm-dev/2019-January/129452.html

This patch therefore bumps the toolchain versions according to our policy:
  llvm.org/docs/DeveloperPolicy.html#toolchain

Subscribers: mgorny, jkorous, dexonsmith, llvm-commits, mehdi_amini, jyknight, rsmith, chandlerc, smeenai, hans, reames, lattner, lhames, erichkeane

Differential Revision: https://reviews.llvm.org/D57264

llvm-svn: 353374
This commit is contained in:
JF Bastien 2019-02-07 05:20:00 +00:00
parent eac500f0c3
commit 388cefa78d
4 changed files with 87 additions and 40 deletions

View File

@ -448,9 +448,12 @@ option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
"Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.") "Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN option(LLVM_FORCE_USE_OLD_TOOLCHAIN
"Set to ON to force using an old, unsupported host toolchain." OFF) "Set to ON to force using an old, unsupported host toolchain." OFF)
option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
"Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
option(LLVM_USE_INTEL_JITEVENTS option(LLVM_USE_INTEL_JITEVENTS
"Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code" "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
OFF) OFF)

View File

@ -5,13 +5,18 @@
include(CheckCXXSourceCompiles) include(CheckCXXSourceCompiles)
set(GCC_MIN 4.8) set(GCC_MIN 4.8)
set(GCC_WARN 4.8) set(GCC_SOFT_ERROR 5.1)
set(CLANG_MIN 3.1) set(CLANG_MIN 3.1)
set(CLANG_WARN 3.1) set(CLANG_SOFT_ERROR 3.5)
set(APPLECLANG_MIN 3.1) set(APPLECLANG_MIN 3.1)
set(APPLECLANG_WARN 3.1) set(APPLECLANG_SOFT_ERROR 6.0)
set(MSVC_MIN 19.0) set(MSVC_MIN 19.00.24213.1)
set(MSVC_WARN 19.00.24213.1) set(MSVC_SOFT_ERROR 19.1)
# Map the above GCC versions to dates: https://gcc.gnu.org/develop.html#timeline
set(GCC_MIN_DATE 20130322)
set(GCC_SOFT_ERROR_DATE 20150422)
if(DEFINED LLVM_COMPILER_CHECKED) if(DEFINED LLVM_COMPILER_CHECKED)
return() return()
@ -22,21 +27,25 @@ if(LLVM_FORCE_USE_OLD_TOOLCHAIN)
return() return()
endif() endif()
function(check_compiler_version NAME NICE_NAME MINIMUM_VERSION WARN_VERSION) function(check_compiler_version NAME NICE_NAME MINIMUM_VERSION SOFT_ERROR_VERSION)
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL NAME) if(NOT CMAKE_CXX_COMPILER_ID STREQUAL NAME)
return() return()
endif() endif()
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS MINIMUM_VERSION) 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}.") 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) elseif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS SOFT_ERROR_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}.") if(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN)
message(WARNING "Host ${NICE_NAME} version should be at least ${SOFT_ERROR_VERSION} because LLVM will soon use new C++ features which your toolchain version doesn't support. Your version is ${CMAKE_CXX_COMPILER_VERSION}. Ignoring because you've set LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be supported.")
else()
message(FATAL_ERROR "Host ${NICE_NAME} version should be at least ${SOFT_ERROR_VERSION} because LLVM will soon use new C++ features which your toolchain version doesn't support. Your version is ${CMAKE_CXX_COMPILER_VERSION}. You can temporarily opt out using LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be supported.")
endif()
endif() endif()
endfunction(check_compiler_version) endfunction(check_compiler_version)
check_compiler_version("GNU" "GCC" ${GCC_MIN} ${GCC_WARN}) check_compiler_version("GNU" "GCC" ${GCC_MIN} ${GCC_SOFT_ERROR})
check_compiler_version("Clang" "Clang" ${CLANG_MIN} ${CLANG_WARN}) check_compiler_version("Clang" "Clang" ${CLANG_MIN} ${CLANG_SOFT_ERROR})
check_compiler_version("AppleClang" "Apple Clang" ${APPLECLANG_MIN} ${APPLECLANG_WARN}) check_compiler_version("AppleClang" "Apple Clang" ${APPLECLANG_MIN} ${APPLECLANG_SOFT_ERROR})
check_compiler_version("MSVC" "Visual Studio" ${MSVC_MIN} ${MSVC_WARN}) check_compiler_version("MSVC" "Visual Studio" ${MSVC_MIN} ${MSVC_SOFT_ERROR})
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if (CMAKE_CXX_SIMULATE_ID MATCHES "MSVC") if (CMAKE_CXX_SIMULATE_ID MATCHES "MSVC")
@ -45,20 +54,39 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
endif() endif()
set(CLANG_CL 1) set(CLANG_CL 1)
elseif(NOT LLVM_ENABLE_LIBCXX) elseif(NOT LLVM_ENABLE_LIBCXX)
# 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.
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++0x") set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++0x")
check_cxx_source_compiles(" check_cxx_source_compiles("
#include <atomic> #include <iosfwd>
std::atomic<float> x(0.0f); #if defined(__GLIBCXX__)
int main() { return (float)x; }" #if __GLIBCXX__ < ${GCC_MIN_DATE}
LLVM_NO_OLD_LIBSTDCXX) #error Unsupported libstdc++ version
if(NOT LLVM_NO_OLD_LIBSTDCXX) #endif
message(FATAL_ERROR "Host Clang must be able to find libstdc++4.8 or newer!") #endif
int main() { return 0; }
"
LLVM_LIBSTDCXX_MIN)
if(NOT LLVM_LIBSTDCXX_MIN)
message(FATAL_ERROR "libstdc++ version must be at least ${GCC_MIN}.")
endif()
check_cxx_source_compiles("
#include <iosfwd>
#if defined(__GLIBCXX__)
#if __GLIBCXX__ < ${GCC_SOFT_ERROR_DATE}
#error Unsupported libstdc++ version
#endif
#endif
int main() { return 0; }
"
LLVM_LIBSTDCXX_SOFT_ERROR)
if(NOT LLVM_LIBSTDCXX_SOFT_ERROR)
if(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN)
message(WARNING "libstdc++ version should be at least ${GCC_SOFT_ERROR} because LLVM will soon use new C++ features which your toolchain version doesn't support. Ignoring because you've set LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be supported.")
else()
message(FATAL_ERROR "libstdc++ version should be at least ${GCC_SOFT_ERROR} because LLVM will soon use new C++ features which your toolchain version doesn't support. You can temporarily opt out using LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be supported.")
endif()
endif() endif()
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES}) set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})

View File

@ -578,6 +578,10 @@ LLVM-specific variables
may not compile at all, or might fail at runtime due to known bugs in these may not compile at all, or might fail at runtime due to known bugs in these
toolchains. toolchains.
**LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN**:BOOL
If enabled, the compiler version check will only warn when using a toolchain
which is about to be deprecated, instead of emitting an error.
CMake Caches CMake Caches
============ ============

View File

@ -170,7 +170,7 @@ uses the package and provides other details.
Package Version Notes Package Version Notes
=========================================================== ============ ========================================== =========================================================== ============ ==========================================
`GNU Make <http://savannah.gnu.org/projects/make>`_ 3.79, 3.79.1 Makefile/build processor `GNU Make <http://savannah.gnu.org/projects/make>`_ 3.79, 3.79.1 Makefile/build processor
`GCC <http://gcc.gnu.org/>`_ >=4.8.0 C/C++ compiler\ :sup:`1` `GCC <http://gcc.gnu.org/>`_ >=5.1.0 C/C++ compiler\ :sup:`1`
`python <http://www.python.org/>`_ >=2.7 Automated test suite\ :sup:`2` `python <http://www.python.org/>`_ >=2.7 Automated test suite\ :sup:`2`
`zlib <http://zlib.net>`_ >=1.2.3.4 Compression library\ :sup:`3` `zlib <http://zlib.net>`_ >=1.2.3.4 Compression library\ :sup:`3`
=========================================================== ============ ========================================== =========================================================== ============ ==========================================
@ -228,6 +228,15 @@ LLVM is written using the subset of C++ documented in :doc:`coding
standards<CodingStandards>`. To enforce this language version, we check the most standards<CodingStandards>`. To enforce this language version, we check the most
popular host toolchains for specific minimum versions in our build systems: popular host toolchains for specific minimum versions in our build systems:
* Clang 3.5
* Apple Clang 6.0
* GCC 5.1
* Visual Studio 2017
The below versions currently soft-error as we transition to the new compiler
versions listed above. The LLVM codebase is currently known to compile correctly
with the following compilers, though this will change in the near future:
* Clang 3.1 * Clang 3.1
* Apple Clang 3.1 * Apple Clang 3.1
* GCC 4.8 * GCC 4.8
@ -283,33 +292,36 @@ The first step is to get a recent GCC toolchain installed. The most common
distribution on which users have struggled with the version requirements is distribution on which users have struggled with the version requirements is
Ubuntu Precise, 12.04 LTS. For this distribution, one easy option is to install Ubuntu Precise, 12.04 LTS. For this distribution, one easy option is to install
the `toolchain testing PPA`_ and use it to install a modern GCC. There is the `toolchain testing PPA`_ and use it to install a modern GCC. There is
a really nice discussions of this on the `ask ubuntu stack exchange`_. However, a really nice discussions of this on the `ask ubuntu stack exchange`_ and a
not all users can use PPAs and there are many other distributions, so it may be `github gist`_ with updated commands. However, not all users can use PPAs and
necessary (or just useful, if you're here you *are* doing compiler development there are many other distributions, so it may be necessary (or just useful, if
after all) to build and install GCC from source. It is also quite easy to do you're here you *are* doing compiler development after all) to build and install
these days. GCC from source. It is also quite easy to do these days.
.. _toolchain testing PPA: .. _toolchain testing PPA:
https://launchpad.net/~ubuntu-toolchain-r/+archive/test https://launchpad.net/~ubuntu-toolchain-r/+archive/test
.. _ask ubuntu stack exchange: .. _ask ubuntu stack exchange:
http://askubuntu.com/questions/271388/how-to-install-gcc-4-8-in-ubuntu-12-04-from-the-terminal https://askubuntu.com/questions/466651/how-do-i-use-the-latest-gcc-on-ubuntu/581497#58149
.. _github gist:
https://gist.github.com/application2000/73fd6f4bf1be6600a2cf9f56315a2d91
Easy steps for installing GCC 4.8.2: Easy steps for installing GCC 5.1.0:
.. code-block:: console .. code-block:: console
% wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2 % gcc_version=5.1.0
% wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2.sig % wget https://ftp.gnu.org/gnu/gcc/gcc-${gcc_version}/gcc-${gcc_version}.tar.bz2
% wget https://ftp.gnu.org/gnu/gcc/gcc-${gcc_version}/gcc-${gcc_version}.tar.bz2.sig
% wget https://ftp.gnu.org/gnu/gnu-keyring.gpg % wget https://ftp.gnu.org/gnu/gnu-keyring.gpg
% signature_invalid=`gpg --verify --no-default-keyring --keyring ./gnu-keyring.gpg gcc-4.8.2.tar.bz2.sig` % signature_invalid=`gpg --verify --no-default-keyring --keyring ./gnu-keyring.gpg gcc-${gcc_version}.tar.bz2.sig`
% if [ $signature_invalid ]; then echo "Invalid signature" ; exit 1 ; fi % if [ $signature_invalid ]; then echo "Invalid signature" ; exit 1 ; fi
% tar -xvjf gcc-4.8.2.tar.bz2 % tar -xvjf gcc-${gcc_version}.tar.bz2
% cd gcc-4.8.2 % cd gcc-${gcc_version}
% ./contrib/download_prerequisites % ./contrib/download_prerequisites
% cd .. % cd ..
% mkdir gcc-4.8.2-build % mkdir gcc-${gcc_version}-build
% cd gcc-4.8.2-build % cd gcc-${gcc_version}-build
% $PWD/../gcc-4.8.2/configure --prefix=$HOME/toolchains --enable-languages=c,c++ % $PWD/../gcc-${gcc_version}/configure --prefix=$HOME/toolchains --enable-languages=c,c++
% make -j$(nproc) % make -j$(nproc)
% make install % make install
@ -317,7 +329,7 @@ For more details, check out the excellent `GCC wiki entry`_, where I got most
of this information from. of this information from.
.. _GCC wiki entry: .. _GCC wiki entry:
http://gcc.gnu.org/wiki/InstallingGCC https://gcc.gnu.org/wiki/InstallingGCC
Once you have a GCC toolchain, configure your build of LLVM to use the new Once you have a GCC toolchain, configure your build of LLVM to use the new
toolchain for your host compiler and C++ standard library. Because the new toolchain for your host compiler and C++ standard library. Because the new