Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
src/clientversion.cpp export-subst
src/CMakeLists.txt export-subst
9 changes: 1 addition & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,6 @@ 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)
Expand Down Expand Up @@ -153,11 +150,7 @@ 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.
# Check required C++ toolchain features early.
include(CheckCXXFeatures)
check_cxx_features()

Expand Down
8 changes: 3 additions & 5 deletions cmake/module/CheckCXXFeatures.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

include_guard(GLOBAL)

#Checks for C++ features required to compile Bitcoin Core.
# Checks for C++ features required to compile Bitcoin Core.

include(CheckCXXSourceCompiles)

Expand Down Expand Up @@ -33,10 +33,8 @@ function(check_cxx_features)
"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"
"The recommended compiler versions can be checked in\n"
"doc/dependencies.md#compiler.\n"
)
endif()

Expand Down
105 changes: 51 additions & 54 deletions cmake/script/GenerateBuildInfo.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
macro(fatal_error)
message(FATAL_ERROR "\n"
"Usage:\n"
" cmake -D BUILD_INFO_HEADER_PATH=<path> [-D SOURCE_DIR=<path>] -P ${CMAKE_CURRENT_LIST_FILE}\n"
" cmake -D BUILD_INFO_HEADER_PATH=<path> -D GIT_EXECUTABLE=<path> [-D SOURCE_DIR=<path>] -P ${CMAKE_CURRENT_LIST_FILE}\n"
"All specified paths must be absolute ones.\n"
)
endmacro()
Expand All @@ -28,72 +28,69 @@ else()
set(WORKING_DIR ${CMAKE_CURRENT_SOURCE_DIR})
endif()

set(GIT_TAG)
set(GIT_COMMIT)
if(NOT "$ENV{BITCOIN_GENBUILD_NO_GIT}" STREQUAL "1")
find_package(Git QUIET)
if(Git_FOUND)
set(GIT_TAG "")
set(GIT_COMMIT "")
if(GIT_EXECUTABLE)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --is-inside-work-tree
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE IS_INSIDE_WORK_TREE
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(IS_INSIDE_WORK_TREE)
# Clean 'dirty' status of touched files that haven't been modified.
execute_process(
COMMAND ${GIT_EXECUTABLE} diff
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_QUIET
ERROR_QUIET
)

execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --is-inside-work-tree
COMMAND ${GIT_EXECUTABLE} describe --abbrev=0
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE IS_INSIDE_WORK_TREE
OUTPUT_VARIABLE MOST_RECENT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(IS_INSIDE_WORK_TREE)
# Clean 'dirty' status of touched files that haven't been modified.
execute_process(
COMMAND ${GIT_EXECUTABLE} diff
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_QUIET
ERROR_QUIET
)

execute_process(
COMMAND ${GIT_EXECUTABLE} describe --abbrev=0
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE MOST_RECENT_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list -1 ${MOST_RECENT_TAG}
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE MOST_RECENT_TAG_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)

execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list -1 ${MOST_RECENT_TAG}
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE MOST_RECENT_TAG_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE HEAD_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)

execute_process(
COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD --
WORKING_DIRECTORY ${WORKING_DIR}
RESULT_VARIABLE IS_DIRTY
)

if(HEAD_COMMIT STREQUAL MOST_RECENT_TAG_COMMIT AND NOT IS_DIRTY)
# If latest commit is tagged and not dirty, then use the tag name.
set(GIT_TAG ${MOST_RECENT_TAG})
else()
# Otherwise, generate suffix from git, i.e. string like "0e0a5173fae3-dirty".
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
COMMAND ${GIT_EXECUTABLE} rev-parse --short=12 HEAD
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE HEAD_COMMIT
OUTPUT_VARIABLE GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)

execute_process(
COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD --
WORKING_DIRECTORY ${WORKING_DIR}
RESULT_VARIABLE IS_DIRTY
)

if(HEAD_COMMIT STREQUAL MOST_RECENT_TAG_COMMIT AND NOT IS_DIRTY)
# If latest commit is tagged and not dirty, then use the tag name.
set(GIT_TAG ${MOST_RECENT_TAG})
else()
# Otherwise, generate suffix from git, i.e. string like "0e0a5173fae3-dirty".
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short=12 HEAD
WORKING_DIRECTORY ${WORKING_DIR}
OUTPUT_VARIABLE GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(IS_DIRTY)
string(APPEND GIT_COMMIT "-dirty")
endif()
if(IS_DIRTY)
string(APPEND GIT_COMMIT "-dirty")
endif()
endif()
endif()
Expand Down
4 changes: 3 additions & 1 deletion doc/build-osx.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ macOS comes with a built-in Terminal located in:
### 1. Xcode Command Line Tools

The Xcode Command Line Tools are a collection of build tools for macOS.
These tools must be installed in order to build Bitcoin Core from source.
Version 16.2 (or higher) of these tools must be
[installed](https://developer.apple.com/documentation/xcode/installing-the-command-line-tools)
in order to build Bitcoin Core from source.

To install, run the following command from your terminal:

Expand Down
4 changes: 3 additions & 1 deletion doc/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ them using [depends](/depends/README.md).

Bitcoin Core requires one of the following compilers.

| Dependency | Minimum required |
| Toolchain | Minimum required |
| --- | --- |
| [Clang](https://clang.llvm.org) | [17.0](https://github.com/bitcoin/bitcoin/pull/33555) |
| [GCC](https://gcc.gnu.org) | [12.1](https://github.com/bitcoin/bitcoin/pull/33842) |
| [Xcode CLT](/doc/build-osx.md) | [16.2](https://github.com/bitcoin/bitcoin/pull/33932) |
| [MSVC](/doc/build-windows-msvc.md) | [18.3](https://github.com/bitcoin/bitcoin/pull/33861) |

## Required

Expand Down
9 changes: 9 additions & 0 deletions doc/release-notes-32220.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
### Build System

- The undocumented `BITCOIN_GENBUILD_NO_GIT` environment variable is no longer
required and has been removed. The build system now automatically detects
when it is being built from a source archive or as a subproject of a git-aware
parent project and skips git metadata fetching.

Users who need to disable git execution explicitly can still do so by
configuring with `-DCMAKE_DISABLE_FIND_PACKAGE_Git=ON`.
8 changes: 7 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,15 @@ if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
endif()

set(IS_SOURCE_TARBALL FALSE)
# git will expand the next line to "set(IS_SOURCE_TARBALL TRUE)" inside archives:
#$Format:%nset(IS_SOURCE_TARBALL TRUE)$
if(NOT IS_SOURCE_TARBALL AND PROJECT_IS_TOP_LEVEL)
find_package(Git QUIET)
endif()
add_custom_target(generate_build_info
BYPRODUCTS ${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h
COMMAND ${CMAKE_COMMAND} -DBUILD_INFO_HEADER_PATH=${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateBuildInfo.cmake
COMMAND ${CMAKE_COMMAND} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DBUILD_INFO_HEADER_PATH=${PROJECT_BINARY_DIR}/src/bitcoin-build-info.h -DSOURCE_DIR=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateBuildInfo.cmake
COMMENT "Generating bitcoin-build-info.h"
VERBATIM
)
Expand Down
28 changes: 14 additions & 14 deletions src/crypto/sha256_arm_shani.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ alignas(uint32x4_t) static constexpr std::array<uint32_t, 64> K =
namespace sha256_arm_shani {
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
{
uint32x4_t STATE0, STATE1, ABEF_SAVE, CDGH_SAVE;
uint32x4_t STATE0, STATE1, ABCD_SAVE, EFGH_SAVE;
uint32x4_t MSG0, MSG1, MSG2, MSG3;
uint32x4_t TMP0, TMP2;

Expand All @@ -51,8 +51,8 @@ void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
while (blocks--)
{
// Save state
ABEF_SAVE = STATE0;
CDGH_SAVE = STATE1;
ABCD_SAVE = STATE0;
EFGH_SAVE = STATE1;

// Load and convert input chunk to Big Endian
MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 0)));
Expand Down Expand Up @@ -186,8 +186,8 @@ void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);

// Update state
STATE0 = vaddq_u32(STATE0, ABEF_SAVE);
STATE1 = vaddq_u32(STATE1, CDGH_SAVE);
STATE0 = vaddq_u32(STATE0, ABCD_SAVE);
STATE1 = vaddq_u32(STATE1, EFGH_SAVE);
}

// Save final state
Expand Down Expand Up @@ -235,7 +235,7 @@ void Transform_2way(unsigned char* output, const unsigned char* input)
/* Padding processed in the 3rd transform (byteswapped). */
alignas(uint32x4_t) static constexpr std::array<uint32_t, 8> FINAL = {0x80000000, 0, 0, 0, 0, 0, 0, 0x100};

uint32x4_t STATE0A, STATE0B, STATE1A, STATE1B, ABEF_SAVEA, ABEF_SAVEB, CDGH_SAVEA, CDGH_SAVEB;
uint32x4_t STATE0A, STATE0B, STATE1A, STATE1B, ABCD_SAVEA, ABCD_SAVEB, EFGH_SAVEA, EFGH_SAVEB;
uint32x4_t MSG0A, MSG0B, MSG1A, MSG1B, MSG2A, MSG2B, MSG3A, MSG3B;
uint32x4_t TMP0A, TMP0B, TMP2A, TMP2B, TMP;

Expand Down Expand Up @@ -488,10 +488,10 @@ void Transform_2way(unsigned char* output, const unsigned char* input)
STATE1B = vaddq_u32(STATE1B, TMP);

// Transform 2: Save state
ABEF_SAVEA = STATE0A;
ABEF_SAVEB = STATE0B;
CDGH_SAVEA = STATE1A;
CDGH_SAVEB = STATE1B;
ABCD_SAVEA = STATE0A;
ABCD_SAVEB = STATE0B;
EFGH_SAVEA = STATE1A;
EFGH_SAVEB = STATE1B;

// Transform 2: Rounds 1-4
TMP = vld1q_u32(&MIDS[0]);
Expand Down Expand Up @@ -638,10 +638,10 @@ void Transform_2way(unsigned char* output, const unsigned char* input)
STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);

// Transform 2: Update state
STATE0A = vaddq_u32(STATE0A, ABEF_SAVEA);
STATE0B = vaddq_u32(STATE0B, ABEF_SAVEB);
STATE1A = vaddq_u32(STATE1A, CDGH_SAVEA);
STATE1B = vaddq_u32(STATE1B, CDGH_SAVEB);
STATE0A = vaddq_u32(STATE0A, ABCD_SAVEA);
STATE0B = vaddq_u32(STATE0B, ABCD_SAVEB);
STATE1A = vaddq_u32(STATE1A, EFGH_SAVEA);
STATE1B = vaddq_u32(STATE1B, EFGH_SAVEB);

// Transform 3: Pad previous output
MSG0A = STATE0A;
Expand Down
14 changes: 10 additions & 4 deletions src/dbwrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ static leveldb::Options GetOptions(size_t nCacheSize)
// on corruption in later versions.
options.paranoid_checks = true;
}
options.max_file_size = std::max(options.max_file_size, DBWRAPPER_MAX_FILE_SIZE);
SetMaxOpenFiles(&options);
return options;
}
Expand Down Expand Up @@ -229,16 +228,23 @@ CDBWrapper::CDBWrapper(const DBParams& params)
DBContext().syncoptions.sync = true;
DBContext().options = GetOptions(params.cache_bytes);
DBContext().options.create_if_missing = true;
if (params.memory_only) {
DBContext().options.max_file_size = params.max_file_size;
assert(!(params.testing_env && params.memory_only));
if (params.testing_env) {
DBContext().options.env = params.testing_env;
} else if (params.memory_only) {
DBContext().penv = leveldb::NewMemEnv(leveldb::Env::Default());
DBContext().options.env = DBContext().penv;
} else {
}
if (!params.memory_only) {
if (params.wipe_data) {
LogInfo("Wiping LevelDB in %s", fs::PathToString(params.path));
leveldb::Status result = leveldb::DestroyDB(fs::PathToString(params.path), DBContext().options);
HandleError(result);
}
TryCreateDirectories(params.path);
if (!params.testing_env) {
TryCreateDirectories(params.path);
}
LogInfo("Opening LevelDB in %s", fs::PathToString(params.path));
}
// PathToString() return value is safe to pass to leveldb open function,
Expand Down
10 changes: 10 additions & 0 deletions src/dbwrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
#include <stdexcept>
#include <string>

namespace leveldb {
class Env;
} // namespace leveldb

static const size_t DBWRAPPER_PREALLOC_KEY_SIZE = 64;
static const size_t DBWRAPPER_PREALLOC_VALUE_SIZE = 1024;
static const size_t DBWRAPPER_MAX_FILE_SIZE{32_MiB};
Expand All @@ -45,6 +49,12 @@ struct DBParams {
bool obfuscate = false;
//! Passed-through options.
DBOptions options{};
//! If non-null, use this as the leveldb::Env instead of the default.
//! Caller retains ownership.
leveldb::Env* testing_env = nullptr;
//! Maximum LevelDB SST file size. Larger values reduce the frequency
//! of compactions but increase their duration.
size_t max_file_size = DBWRAPPER_MAX_FILE_SIZE;
};

class dbwrapper_error : public std::runtime_error
Expand Down
13 changes: 7 additions & 6 deletions src/kernel/bitcoinkernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1338,19 +1338,20 @@ int btck_chainstate_manager_process_block(
return result ? 0 : -1;
}

int btck_chainstate_manager_process_block_header(
btck_BlockValidationState* btck_chainstate_manager_process_block_header(
btck_ChainstateManager* chainstate_manager,
const btck_BlockHeader* header,
btck_BlockValidationState* state)
const btck_BlockHeader* header)
{
try {
auto& chainman = btck_ChainstateManager::get(chainstate_manager).m_chainman;
auto result = chainman->ProcessNewBlockHeaders({&btck_BlockHeader::get(header), 1}, /*min_pow_checked=*/true, btck_BlockValidationState::get(state), /*ppindex=*/nullptr);

return result ? 0 : -1;
auto state = btck_BlockValidationState::create();
bool result{chainman->ProcessNewBlockHeaders({&btck_BlockHeader::get(header), 1}, /*min_pow_checked=*/true, btck_BlockValidationState::get(state))};
assert(result == btck_BlockValidationState::get(state).IsValid());
return state;
} catch (const std::exception& e) {
LogError("Failed to process block header: %s", e.what());
return -1;
return nullptr;
}
}

Expand Down
Loading
Loading