From f34a09b39ffba84e737e036e606b839ad9be4c01 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Wed, 10 Aug 2022 14:50:29 +1200 Subject: [PATCH] Enforce minimum supported versions of GCC and Clang We already have a minimum required version of MSVC --- CMakeLists.txt | 31 +++++++++++++++++++++++++------ Contributing.md | 3 ++- Readme.md | 10 ++++++---- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2530c1a0ef..ccb05cc3c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,31 @@ if (MSVC) set(CMAKE_CXX_STANDARD_REQUIRED ON) endif() +set(COMPILER ${CMAKE_CXX_COMPILER_ID}) +if (COMPILER STREQUAL "GNU") + set(COMPILER "GCC") # perfer printing GCC instead of GNU +endif() + +# Enforce minimium compiler versions that support the c++20 features we use +set (GCC_min_version 10) +set (Clang_min_version 11) +set (AppleClang_min_version 12.0.5) +set (min_xcode_version "12.5.1") # corrosponding xcode version for AppleClang_min_version +set (MSVC_min_version 14.32) +set (min_vs_version "2022 17.2.3") # corrosponding Visual Studio version for MSVC_min_version + +message(STATUS "Using ${COMPILER} ${CMAKE_CXX_COMPILER_VERSION}") + +if ("-" STREQUAL "${${COMPILER}_min_version}-") + message(WARNING "Unknown compiler ${COMPILER}, assuming it is new enough") +else() + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${${COMPILER}_min_version}) + message(FATAL_ERROR "Requires GCC ${GCC_min_version}, Clang ${Clang_min_version}," + " AppleClang ${AppleClang_min_version} (Xcode ${min_xcode_version})," + " or MSVC ${MSVC_min_version} (Visual Studio ${min_vs_version}) or higher") + endif() +endif() + # Name of the Dolphin distributor. If you redistribute Dolphin builds (forks, # unofficial builds) please consider identifying your distribution with a # unique name here. @@ -255,12 +280,6 @@ else() " Enable generic build if you really want a JIT-less binary.") endif() - -# Enforce minimum GCC version -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) - message(FATAL_ERROR "Dolphin requires at least GCC 7.0 (found ${CMAKE_CXX_COMPILER_VERSION})") -endif() - if(CMAKE_GENERATOR MATCHES "Ninja") check_and_add_flag(DIAGNOSTICS_COLOR -fdiagnostics-color) elseif(CMAKE_GENERATOR MATCHES "Visual Studio") diff --git a/Contributing.md b/Contributing.md index a78436d5df..21c6a96888 100644 --- a/Contributing.md +++ b/Contributing.md @@ -173,7 +173,8 @@ Summary: - [Classes and Structs](#cpp-code-classes-and-structs) ## General -- The codebase currently uses C++17. +- The codebase currently uses C++20, though not all compilers support all C++20 features. + - See CMakeLists.txt "Enforce minimium compiler versions" for the currently supported compilers. - Use the [nullptr](https://en.cppreference.com/w/cpp/language/nullptr) type over the macro `NULL`. - If a [range-based for loop](https://en.cppreference.com/w/cpp/language/range-for) can be used instead of container iterators, use it. - Obviously, try not to use `goto` unless you have a *really* good reason for it. diff --git a/Readme.md b/Readme.md index 7723fc1fc0..7262e6173f 100644 --- a/Readme.md +++ b/Readme.md @@ -53,10 +53,12 @@ The "Debug" solution configuration is significantly slower, more verbose and les ## Building for Linux and macOS -Dolphin requires [CMake](https://cmake.org/) for systems other than Windows. Many libraries are -bundled with Dolphin and used if they're not installed on your system. CMake -will inform you if a bundled library is used or if you need to install any -missing packages yourself. You may refer to the [wiki](https://github.com/dolphin-emu/dolphin/wiki/Building-for-Linux) for more information. +Dolphin requires [CMake](https://cmake.org/) for systems other than Windows. +You need a recent version of GCC or Clang with decent c++20 support. CMake will +inform you if your compiler is too old. +Many libraries are bundled with Dolphin and used if they're not installed on +your system. CMake will inform you if a bundled library is used or if you need +to install any missing packages yourself. You may refer to the [wiki](https://github.com/dolphin-emu/dolphin/wiki/Building-for-Linux) for more information. Make sure to pull submodules before building: ```sh