Files
bitcoin/cmake
Ava Chow 10ca73c02c Merge bitcoin/bitcoin#34580: build: Add a compiler minimum feature check
ac1ccc5bd9 build: Add CTAD feature check (Pol Espinasa)
9f273f1c1c build: Add path to doc recommended versions for CLANG, GCC and MSVC (Pol Espinasa)

Pull request description:

  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:
  ```
  $ cmake -B build
  -- The CXX compiler identification is GNU 13.3.0
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/c++ - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  ...
  -- Checking for required C++ features
  -- Checking for required C++ features - done
  ....
  ```
  Compiler feature requirement not satisfied:
  ```
  $ cmake -B build -DCMAKE_C_COMPILER=/usr/bin/gcc-10 -DCMAKE_CXX_COMPILER=/usr/bin/g++-10
  -- The CXX compiler identification is GNU 10.5.0
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/g++-10 - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  -- Setting build type to "RelWithDebInfo" as none was specified
  -- Performing Test CXX_SUPPORTS__WERROR
  -- Performing Test CXX_SUPPORTS__WERROR - Success
  -- Found SQLite3: /usr/include (found suitable version "3.45.1", minimum required is "3.7.17")
  -- Checking for required C++ features
  CMake Error at cmake/module/CheckCXXFeatures.cmake:32 (message):
    Compiler lacks Class Template Argument Deduction (CTAD) for aggregates.

    This C++ feature is required for src/util/overloaded.h.

    You are probably using an old compiler version

    The recommended compiler versions can be checked in:

      - GCC -> doc/dependencies.md#compiler
      - Clang -> doc/dependencies.md#compiler
      - MSVC -> doc/build-windows-msvc.md

  Call Stack (most recent call first):
    CMakeLists.txt:198 (check_cxx_features)

  -- Configuring incomplete, errors occurred!

  ```

  Example of the output for Clang:
  Compiler feature requirement satisfied:
  ```
  $ cmake -B build -DCMAKE_C_COMPILER=clang-20 -DCMAKE_CXX_COMPILER=clang++-20
  -- The CXX compiler identification is Clang 20.1.2
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/clang++-20 - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  ...
  -- Checking for required C++ features
  -- Checking for required C++ features - done
  ...
  ```

  Compiler feature requirement not satisfied:
  ```
  $ cmake -B build -DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16
  -- The CXX compiler identification is Clang 16.0.6
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/clang++-16 - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  -- Setting build type to "RelWithDebInfo" as none was specified
  -- Performing Test CXX_SUPPORTS__WERROR
  -- Performing Test CXX_SUPPORTS__WERROR - Success
  -- Performing Test CXX_SUPPORTS__G3
  -- Performing Test CXX_SUPPORTS__G3 - Success
  -- Performing Test LINKER_SUPPORTS__G3
  -- Performing Test LINKER_SUPPORTS__G3 - Success
  -- Performing Test CXX_SUPPORTS__FTRAPV
  -- Performing Test CXX_SUPPORTS__FTRAPV - Success
  -- Performing Test LINKER_SUPPORTS__FTRAPV
  -- Performing Test LINKER_SUPPORTS__FTRAPV - Success
  -- Found SQLite3: /usr/include (found suitable version "3.45.1", minimum required is "3.7.17")
  -- Checking for required C++ features
  CMake Error at cmake/module/CheckCXXFeatures.cmake:32 (message):
    Compiler lacks Class Template Argument Deduction (CTAD) for aggregates.

    This C++ feature is required for src/util/overloaded.h.

    You are probably using an old compiler version

    The recommended compiler versions can be checked in:

      - GCC -> doc/dependencies.md#compiler
      - Clang -> doc/dependencies.md#compiler
      - MSVC -> doc/build-windows-msvc.md

  Call Stack (most recent call first):
    CMakeLists.txt:198 (check_cxx_features)

  -- Configuring incomplete, errors occurred!
  ```

  Edit: The first version of the PR was to check hardcoded compiler versions. See previous PR description for context here.
  <details>

  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:
  ```
  sliv3r@sliv3r-tuxedo:~/Documentos/Projectes/BitcoinCore/bitcoin$ cmake -B BUILD
  -- The CXX compiler identification is GNU 13.3.0
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  ....
  ```
  Version requirement not satisfied:
  ```
  $ cmake -B build -S .   -DCMAKE_C_COMPILER=/usr/bin/gcc-11   -DCMAKE_CXX_COMPILER=/usr/bin/g++-11
  -- The CXX compiler identification is GNU 11.5.0
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/g++-11 - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  CMake Error at CMakeLists.txt:91 (message):
    GCC >= 12.1 required.

  -- Configuring incomplete, errors occurred!

  ```

  Example of the output for Clang:
  Version requirement satisfied:
  ```
  sliv3r@sliv3r-tuxedo:~/Documentos/Projectes/BitcoinCore/bitcoin$ cmake -B build
  -- The CXX compiler identification is Clang 18.1.3
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  ...
  ```

  Version requirement not satisfied:
  ```
  $ cmake -B build -DCMAKE_C_COMPILER=clang-16       -DCMAKE_CXX_COMPILER=clang++-16
  -- The CXX compiler identification is Clang 16.0.6
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/clang++-16 - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  CMake Error at CMakeLists.txt:86 (message):
    Clang >= 17.0 required.

  -- Configuring incomplete, errors occurred!
  ```
  <\detail>

ACKs for top commit:
  davidgumberg:
    crACK ac1ccc5bd9
  achow101:
    ACK ac1ccc5bd9
  vasild:
    ACK ac1ccc5bd9
  w0xlt:
    ACK ac1ccc5bd9
  ryanofsky:
    Code review ACK ac1ccc5bd9. Very much agree with all the previous comments to not check specific compiler versions, and glad this PR is in better shape now.

Tree-SHA512: 15a12f56016846427ed8273406c3e9a52a6435bf7033c8fef82bb0e6c9fd75d40a62c79d33f9dd6da8717500f21a629da07620f160b3d43368dd7579f773b4bc
2026-05-11 15:29:35 -07:00
..
2025-03-04 14:53:06 +00:00