From c4e498300c7e6b23dc464eca75a2bc9f86270dab Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Mon, 16 Sep 2024 17:16:52 +0000 Subject: [PATCH 1/2] build: avoid unnecessary dependencies on generated headers This prevents the generation of these headers from also depending on the dependencies of the libs/binaries which consume them. Specifically, this prevents generated test headers (such as test/data/base58_encode_decode.json.h) from depending on the dependencies of test_bitcoin (libcrc32c.a libcrc32c_sse42.a libleveldb.a) Note that this is currently only relevant for Ninja. For more detail, see: https://cmake.org/cmake/help/latest/command/add_custom_command.html --- cmake/module/GenerateHeaders.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cmake/module/GenerateHeaders.cmake b/cmake/module/GenerateHeaders.cmake index c69007acb68..53b211f245c 100644 --- a/cmake/module/GenerateHeaders.cmake +++ b/cmake/module/GenerateHeaders.cmake @@ -2,12 +2,19 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or https://opensource.org/license/mit/. +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27) + set(DEPENDS_EXPLICIT_OPT DEPENDS_EXPLICIT_ONLY) +else() + set(DEPENDS_EXPLICIT_OPT) +endif() + function(generate_header_from_json json_source_relpath) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${json_source_relpath}.h COMMAND ${CMAKE_COMMAND} -DJSON_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${json_source_relpath} -DHEADER_PATH=${CMAKE_CURRENT_BINARY_DIR}/${json_source_relpath}.h -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${json_source_relpath} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake VERBATIM + ${DEPENDS_EXPLICIT_OPT} ) endfunction() @@ -17,5 +24,6 @@ function(generate_header_from_raw raw_source_relpath raw_namespace) COMMAND ${CMAKE_COMMAND} -DRAW_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${raw_source_relpath} -DHEADER_PATH=${CMAKE_CURRENT_BINARY_DIR}/${raw_source_relpath}.h -DRAW_NAMESPACE=${raw_namespace} -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${raw_source_relpath} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake VERBATIM + ${DEPENDS_EXPLICIT_OPT} ) endfunction() From 12fa9511b5fba18e83f88b7b831906595bcf2116 Mon Sep 17 00:00:00 2001 From: Cory Fields Date: Mon, 16 Sep 2024 17:43:49 +0000 Subject: [PATCH 2/2] build: simplify dependency graph Allow the objects of static libs to be built in parallel rather than serially based on their dependency ordering. For more detail, see: https://cmake.org/cmake/help/latest/prop_tgt/OPTIMIZE_DEPENDENCIES.html --- CMakeLists.txt | 7 +++++++ cmake/minisketch.cmake | 3 +++ src/util/CMakeLists.txt | 3 +++ 3 files changed, 13 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0026414154..edfb63926a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,13 @@ set(CMAKE_CXX_EXTENSIONS OFF) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module) +# Flatten static lib dependencies. +# Without this, if libfoo.a depends on libbar.a, libfoo's objects can't begin +# to be compiled until libbar.a has been created. +if (NOT DEFINED CMAKE_OPTIMIZE_DEPENDENCIES) + set(CMAKE_OPTIMIZE_DEPENDENCIES TRUE) +endif() + #============================= # Configurable options #============================= diff --git a/cmake/minisketch.cmake b/cmake/minisketch.cmake index bb93c804672..7407739ed94 100644 --- a/cmake/minisketch.cmake +++ b/cmake/minisketch.cmake @@ -74,6 +74,9 @@ add_library(minisketch STATIC EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_8bytes.cpp ) +# Workaround for https://gitlab.kitware.com/cmake/cmake/-/issues/24058 +set_target_properties(minisketch PROPERTIES OPTIMIZE_DEPENDENCIES OFF) + target_include_directories(minisketch PUBLIC $ diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 4999dbf13f0..9ca26a9e27b 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -36,6 +36,9 @@ add_library(bitcoin_util STATIC EXCLUDE_FROM_ALL ../sync.cpp ) +# Workaround for https://gitlab.kitware.com/cmake/cmake/-/issues/24058 +set_target_properties(bitcoin_util PROPERTIES OPTIMIZE_DEPENDENCIES OFF) + target_link_libraries(bitcoin_util PRIVATE core_interface