From 9a2cced23a6904fe03df92ca32c1ae98753440c7 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 14 May 2026 13:27:13 +0100 Subject: [PATCH 1/4] cmake, refactor: Move `find_package(Git)` to `src/CMakeLists.txt` This change allows the use of the `CMAKE_DISABLE_FIND_PACKAGE_Git` variable to explicitly disable git usage. --- cmake/script/GenerateBuildInfo.cmake | 5 ++--- src/CMakeLists.txt | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/script/GenerateBuildInfo.cmake b/cmake/script/GenerateBuildInfo.cmake index d3ee2eb0621..694961df0b5 100644 --- a/cmake/script/GenerateBuildInfo.cmake +++ b/cmake/script/GenerateBuildInfo.cmake @@ -5,7 +5,7 @@ macro(fatal_error) message(FATAL_ERROR "\n" "Usage:\n" - " cmake -D BUILD_INFO_HEADER_PATH= [-D SOURCE_DIR=] -P ${CMAKE_CURRENT_LIST_FILE}\n" + " cmake -D BUILD_INFO_HEADER_PATH= -D GIT_EXECUTABLE= [-D SOURCE_DIR=] -P ${CMAKE_CURRENT_LIST_FILE}\n" "All specified paths must be absolute ones.\n" ) endmacro() @@ -31,8 +31,7 @@ endif() set(GIT_TAG) set(GIT_COMMIT) if(NOT "$ENV{BITCOIN_GENBUILD_NO_GIT}" STREQUAL "1") - find_package(Git QUIET) - if(Git_FOUND) + if(GIT_EXECUTABLE) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --is-inside-work-tree WORKING_DIRECTORY ${WORKING_DIR} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b37f3c8ca5c..ddbf2d6dd83 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,9 +37,10 @@ if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) endif() +find_package(Git QUIET) 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 ) From fe941938e84ebacf9ece47dab2bd45d5a292b9f3 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 14 May 2026 13:29:04 +0100 Subject: [PATCH 2/4] cmake: Remove unnecessary `BITCOIN_GENBUILD_NO_GIT` environment variable This functionality is now covered by the `CMAKE_DISABLE_FIND_PACKAGE_Git` variable. Note for reviewers: consider reviewing with `git diff -w`. --- cmake/script/GenerateBuildInfo.cmake | 106 +++++++++++++-------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/cmake/script/GenerateBuildInfo.cmake b/cmake/script/GenerateBuildInfo.cmake index 694961df0b5..62773a3a543 100644 --- a/cmake/script/GenerateBuildInfo.cmake +++ b/cmake/script/GenerateBuildInfo.cmake @@ -28,71 +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") - if(GIT_EXECUTABLE) +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} rev-parse --is-inside-work-tree + COMMAND ${GIT_EXECUTABLE} diff WORKING_DIRECTORY ${WORKING_DIR} - OUTPUT_VARIABLE IS_INSIDE_WORK_TREE + 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 ) - 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-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} describe --abbrev=0 + COMMAND ${GIT_EXECUTABLE} rev-parse --short=12 HEAD WORKING_DIRECTORY ${WORKING_DIR} - OUTPUT_VARIABLE MOST_RECENT_TAG + OUTPUT_VARIABLE GIT_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 --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() From b71cd5c1622faf2b00507674c3c0a04522180d09 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 14 May 2026 13:32:27 +0100 Subject: [PATCH 3/4] cmake: Skip using git when building from source tarball or as subproject --- .gitattributes | 1 + src/CMakeLists.txt | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index c9cf4a7d9cd..25303e742a7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ src/clientversion.cpp export-subst +src/CMakeLists.txt export-subst diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ddbf2d6dd83..439239962ab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -37,7 +37,12 @@ if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) endif() -find_package(Git QUIET) +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} -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 From 3142e5f8cf41e3e7fe3eee963cc696765443368e Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Thu, 14 May 2026 14:36:11 +0100 Subject: [PATCH 4/4] doc: Add release notes for #32220 --- doc/release-notes-32220.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 doc/release-notes-32220.md diff --git a/doc/release-notes-32220.md b/doc/release-notes-32220.md new file mode 100644 index 00000000000..c2527157155 --- /dev/null +++ b/doc/release-notes-32220.md @@ -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`.