mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-27 22:34:18 +02:00
Merge bitcoin/bitcoin#34580: build: Add a compiler minimum feature check
ac1ccc5bd9build: Add CTAD feature check (Pol Espinasa)9f273f1c1cbuild: 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: crACKac1ccc5bd9achow101: ACKac1ccc5bd9vasild: ACKac1ccc5bd9w0xlt: ACKac1ccc5bd9ryanofsky: Code review ACKac1ccc5bd9. 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
This commit is contained in:
@@ -80,6 +80,10 @@ if(CMAKE_VERSION VERSION_LESS 4.2 AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NO
|
||||
set(CMAKE_INSTALL_NAME_TOOL "${CMAKE_COMMAND} -E true")
|
||||
endif()
|
||||
enable_language(CXX)
|
||||
set(MIN_CLANG_DOCS "doc/dependencies.md#compiler")
|
||||
set(MIN_GCC_DOCS "doc/dependencies.md#compiler")
|
||||
set(MIN_MSVC_DOCS "doc/build-windows-msvc.md")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
@@ -197,6 +201,14 @@ string(APPEND CMAKE_CXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}")
|
||||
string(APPEND CMAKE_CXX_CREATE_SHARED_LIBRARY " ${APPEND_LDFLAGS}")
|
||||
string(APPEND CMAKE_CXX_LINK_EXECUTABLE " ${APPEND_LDFLAGS}")
|
||||
|
||||
#=============================
|
||||
# C++ Feature Detection
|
||||
#=============================
|
||||
# In case the compiler is not GCC, Clang or MSVC this provides extra checks
|
||||
# which verify that some features are available in the standard library.
|
||||
include(CheckCXXFeatures)
|
||||
check_cxx_features()
|
||||
|
||||
set(configure_warnings)
|
||||
|
||||
include(CheckLinkerSupportsPIE)
|
||||
|
||||
45
cmake/module/CheckCXXFeatures.cmake
Normal file
45
cmake/module/CheckCXXFeatures.cmake
Normal file
@@ -0,0 +1,45 @@
|
||||
# Copyright (c) 2026-present The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or https://opensource.org/license/mit/.
|
||||
|
||||
include_guard(GLOBAL)
|
||||
|
||||
#Checks for C++ features required to compile Bitcoin Core.
|
||||
|
||||
include(CheckCXXSourceCompiles)
|
||||
|
||||
function(check_cxx_features)
|
||||
set(CMAKE_REQUIRED_QUIET TRUE)
|
||||
|
||||
message(STATUS "Checking for required C++ features")
|
||||
|
||||
# Checks for Class Template Argument Deduction for aggregate types - used in src/util/overloaded.h
|
||||
check_cxx_source_compiles("
|
||||
#include <variant>
|
||||
|
||||
template<class... Ts> struct Overloaded : Ts... { using Ts::operator()...; };
|
||||
|
||||
int main() {
|
||||
std::variant<int, double> v = 42;
|
||||
return std::visit(Overloaded{
|
||||
[](int) { return 0; },
|
||||
[](double) { return 1; }
|
||||
}, v);
|
||||
}
|
||||
" HAVE_CTAD_FOR_AGGREGATES)
|
||||
|
||||
if(NOT HAVE_CTAD_FOR_AGGREGATES)
|
||||
message(FATAL_ERROR
|
||||
"Compiler lacks Class Template Argument Deduction (CTAD) for aggregates.\n"
|
||||
"This C++ feature is required for src/util/overloaded.h.\n"
|
||||
"You are probably using an old compiler version\n"
|
||||
"The recommended compiler versions can be checked in:\n"
|
||||
" - GCC -> ${MIN_GCC_DOCS}\n"
|
||||
" - Clang -> ${MIN_CLANG_DOCS}\n"
|
||||
" - MSVC -> ${MIN_MSVC_DOCS}\n"
|
||||
)
|
||||
endif()
|
||||
|
||||
message(STATUS "Checking for required C++ features - done")
|
||||
|
||||
endfunction()
|
||||
Reference in New Issue
Block a user