Adds a compiler features check. If failed, it returns a fatal error. This early stop at configure time will avoid contributors losing time trying to fix compilation errors because of not fitting the requirements.
Example of the output for GCC: Version requirement satisfied:
0$ cmake -B build
1-- The CXX compiler identification is GNU 13.3.0
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/c++ - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7...
8-- Checking for required C++ features
9-- Checking for required C++ features - done
10....
Version requirement not satisfied:
0$ cmake -B build -DCMAKE_C_COMPILER=/usr/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/bin/g++-10
1-- The CXX compiler identification is GNU 10.5.0
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/g++-10 - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7-- Setting build type to "RelWithDebInfo" as none was specified
8-- Performing Test CXX_SUPPORTS__WERROR
9-- Performing Test CXX_SUPPORTS__WERROR - Success
10-- Found SQLite3: /usr/include (found suitable version "3.45.1", minimum required is "3.7.17")
11-- Checking for required C++ features
12CMake Error at cmake/module/CheckCXXFeatures.cmake:32 (message):
13 Compiler lacks Class Template Argument Deduction (CTAD) for aggregates.
14
15 This C++ feature is required for src/util/overloaded.h.
16
17 Recommended compiler versions:
18
19 - GCC >= 12.1
20 - Clang >= 17.0
21 - MSVC >= 19.50
22Call Stack (most recent call first):
23 CMakeLists.txt:200 (check_cxx_features)
24
25
26-- Configuring incomplete, errors occurred!
Example of the output for Clang: Version requirement satisfied:
0$ cmake -B build -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20
1-- The CXX compiler identification is Clang 20.1.2
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/clang++-20 - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7...
8-- Checking for required C++ features
9-- Checking for required C++ features - done
10...
Version requirement not satisfied:
0$ cmake -B build -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16
1-- The CXX compiler identification is Clang 16.0.6
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/clang++-16 - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7-- Setting build type to "RelWithDebInfo" as none was specified
8-- Performing Test CXX_SUPPORTS__WERROR
9-- Performing Test CXX_SUPPORTS__WERROR - Success
10-- Performing Test CXX_SUPPORTS__G3
11-- Performing Test CXX_SUPPORTS__G3 - Success
12-- Performing Test LINKER_SUPPORTS__G3
13-- Performing Test LINKER_SUPPORTS__G3 - Success
14-- Performing Test CXX_SUPPORTS__FTRAPV
15-- Performing Test CXX_SUPPORTS__FTRAPV - Success
16-- Performing Test LINKER_SUPPORTS__FTRAPV
17-- Performing Test LINKER_SUPPORTS__FTRAPV - Success
18-- Found SQLite3: /usr/include (found suitable version "3.45.1", minimum required is "3.7.17")
19-- Checking for required C++ features
20CMake Error at cmake/module/CheckCXXFeatures.cmake:32 (message):
21 Compiler lacks Class Template Argument Deduction (CTAD) for aggregates.
22
23 This C++ feature is required for src/util/overloaded.h.
24
25 Recommended compiler versions:
26
27 - GCC >= 12.1
28 - Clang >= 17.0
29 - MSVC >= 19.50
30Call Stack (most recent call first):
31 CMakeLists.txt:200 (check_cxx_features)
32
33
34-- Configuring incomplete, errors occurred!
Edit: The first version of the PR was to check hardcoded compiler versions. See previous PR description for context here.
Adds a compiler minimum version check. If failed, it returns a fatal error. This early stop at configure time will avoid contributors losing time trying to fix compilation errors because of not fitting the requirements.
Example of the output for GCC: Version requirement satisfied:
0sliv3r@sliv3r-tuxedo:~/Documentos/Projectes/BitcoinCore/bitcoin$ cmake -B BUILD
1-- The CXX compiler identification is GNU 13.3.0
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4....
Version requirement not satisfied:
0$ cmake -B build -S . -DCMAKE_C_COMPILER=/usr/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/bin/g++-11
1-- The CXX compiler identification is GNU 11.5.0
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/g++-11 - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7CMake Error at CMakeLists.txt:91 (message):
8 GCC >= 12.1 required.
9
10
11-- Configuring incomplete, errors occurred!
Example of the output for Clang: Version requirement satisfied:
0sliv3r@sliv3r-tuxedo:~/Documentos/Projectes/BitcoinCore/bitcoin$ cmake -B build
1-- The CXX compiler identification is Clang 18.1.3
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4...
Version requirement not satisfied:
0$ cmake -B build -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16
1-- The CXX compiler identification is Clang 16.0.6
2-- Detecting CXX compiler ABI info
3-- Detecting CXX compiler ABI info - done
4-- Check for working CXX compiler: /usr/bin/clang++-16 - skipped
5-- Detecting CXX compile features
6-- Detecting CXX compile features - done
7CMake Error at CMakeLists.txt:86 (message):
8 Clang >= 17.0 required.
9
10
11-- Configuring incomplete, errors occurred!
<\detail>