Enforce minimum supported versions of GCC and Clang

We already have a minimum required version of MSVC
This commit is contained in:
Scott Mansell 2022-08-10 14:50:29 +12:00
parent 3c4a21315d
commit f34a09b39f
3 changed files with 33 additions and 11 deletions

View File

@ -38,6 +38,31 @@ if (MSVC)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif() 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, # Name of the Dolphin distributor. If you redistribute Dolphin builds (forks,
# unofficial builds) please consider identifying your distribution with a # unofficial builds) please consider identifying your distribution with a
# unique name here. # unique name here.
@ -255,12 +280,6 @@ else()
" Enable generic build if you really want a JIT-less binary.") " Enable generic build if you really want a JIT-less binary.")
endif() 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") if(CMAKE_GENERATOR MATCHES "Ninja")
check_and_add_flag(DIAGNOSTICS_COLOR -fdiagnostics-color) check_and_add_flag(DIAGNOSTICS_COLOR -fdiagnostics-color)
elseif(CMAKE_GENERATOR MATCHES "Visual Studio") elseif(CMAKE_GENERATOR MATCHES "Visual Studio")

View File

@ -173,7 +173,8 @@ Summary:
- [Classes and Structs](#cpp-code-classes-and-structs) - [Classes and Structs](#cpp-code-classes-and-structs)
## <a name="cpp-code-general"></a>General ## <a name="cpp-code-general"></a>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`. - 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. - 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. - Obviously, try not to use `goto` unless you have a *really* good reason for it.

View File

@ -53,10 +53,12 @@ The "Debug" solution configuration is significantly slower, more verbose and les
## Building for Linux and macOS ## Building for Linux and macOS
Dolphin requires [CMake](https://cmake.org/) for systems other than Windows. Many libraries are Dolphin requires [CMake](https://cmake.org/) for systems other than Windows.
bundled with Dolphin and used if they're not installed on your system. CMake You need a recent version of GCC or Clang with decent c++20 support. CMake will
will inform you if a bundled library is used or if you need to install any inform you if your compiler is too old.
missing packages yourself. You may refer to the [wiki](https://github.com/dolphin-emu/dolphin/wiki/Building-for-Linux) for more information. 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: Make sure to pull submodules before building:
```sh ```sh