0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-20 12:12:41 -05:00
bitcoin-bitcoin-core/cmake/module
merge-script ede388d03d
Merge bitcoin/bitcoin#30911: build: simplify by flattening the dependency graph
12fa9511b5 build: simplify dependency graph (Cory Fields)
c4e498300c build: avoid unnecessary dependencies on generated headers (Cory Fields)

Pull request description:

  These changes speed up my build (default config/options/targets) by roughly 10%. I suspect the difference may be more significant in other build configs.

  Before:
  > $ time cmake --build build -j24
  > real3m26.932s

  After:
  > $ time cmake --build build -j24
  > real3m7.556s

  Generally they allow for jobservers (either `make -jX` or `ninja`) to be better utilized. This can be verified using `top` while building and looking at the number of compiles running at any given time before/after these changes. Before, it's easy to observe periods of stalling when only one or two compiles are happening. After these changes, the compiler process count should mostly match the number of jobs given (`-jX`) until it falls off at the end.

  ---

  The first commit sets [DEPENDS_EXPLICIT_ONLY](https://cmake.org/cmake/help/latest/command/add_custom_command.html#command:add_custom_command) for commands which generate our test header files. Without this option, `test_bitcoin`'s generated headers won't be built until all of its other dependencies have been built. This introduces a significant stall in the build, though currently only Ninja benefits from this being set, and only CMake >= 3.27 understands it.

  Example from a generated `build.ninja`:

  Before:

  > \# Custom command for src/test/data/base58_encode_decode.json.h
  >
  > build src/test/data/base58_encode_decode.json.h | ${cmake_ninja_workdir}src/test/data/base58_encode_decode.json.h: CUSTOM_COMMAND /home/cory/dev/bitcoin/src/test/data/base58_encode_decode.json /home/cory/dev/bitcoin/cmake/script/GenerateHeaderFromJson.cmake || libcrc32c.a libcrc32c_sse42.a libleveldb.a libminisketch.a minisketch_clmul src/bitcoin_clientversion src/crypto/libbitcoin_crypto.a src/crypto/libbitcoin_crypto_avx2.a src/crypto/libbitcoin_crypto_sse41.a src/crypto/libbitcoin_crypto_x86_shani.a src/generate_build_info src/libbitcoin_cli.a src/libbitcoin_common.a src/libbitcoin_consensus.a src/libbitcoin_node.a src/secp256k1/src/libsecp256k1.a src/secp256k1/src/secp256k1_precomputed src/test/util/libtest_util.a src/univalue/libunivalue.a src/util/libbitcoin_util.a src/wallet/libbitcoin_wallet.a src/zmq/libbitcoin_zmq.a

  After:

  > \# Custom command for src/test/data/base58_encode_decode.json.h
  >
  > build src/test/data/base58_encode_decode.json.h | ${cmake_ninja_workdir}src/test/data/base58_encode_decode.json.h: CUSTOM_COMMAND /home/cory/dev/bitcoin/src/test/data/base58_encode_decode.json /home/cory/dev/bitcoin/cmake/script/GenerateHeaderFromJson.cmake

  ---

  The second commit is more significant. It sets [CMAKE_OPTIMIZE_DEPENDENCIES](https://cmake.org/cmake/help/latest/prop_tgt/OPTIMIZE_DEPENDENCIES.html) globally, which allows the objects of static libs to be built in parallel when one lib depends on the other. This can be set as a per-lib property, ~but I don't see any need for that as we don't currently have any edge-cases where this wouldn't be ok. If those should arise, we could always disable on a per-lib basis~.

  Edit: turns out this triggers an [upstream bug](https://gitlab.kitware.com/cmake/cmake/-/issues/24058), which I guess can be considered an edge-case until fixed in CMake. I've added 2 per-lib opt-outs as a result.

  Example:

  Before:

  > \# Link the static library src/libbitcoin_cli.a
  >
  > build src/libbitcoin_cli.a: CXX_STATIC_LIBRARY_LINKER__bitcoin_cli_RelWithDebInfo src/CMakeFiles/bitcoin_cli.dir/compat/stdin.cpp.o src/CMakeFiles/bitcoin_cli.dir/rpc/client.cpp.o || src/univalue/libunivalue.a

  After:

  > \# Link the static library src/libbitcoin_cli.a
  >
  > build src/libbitcoin_cli.a: CXX_STATIC_LIBRARY_LINKER__bitcoin_cli_RelWithDebInfo src/CMakeFiles/bitcoin_cli.dir/compat/stdin.cpp.o src/CMakeFiles/bitcoin_cli.dir/rpc/client.cpp.o
  >

ACKs for top commit:
  l0rinc:
    utACK 12fa9511b5
  hebasto:
    ACK 12fa9511b5.

Tree-SHA512: f85f507e70cdc06acd07542161d9f9b8edf9ba866f08c8ef17aaaed770fa11530a27521c4413456d863463a6e77d4d6983fa623a64e17bbd602c2bc70aacc112
2025-02-12 16:02:57 +01:00
..
AddBoostIfNeeded.cmake cmake: scope Boost Test check to vcpkg 2024-09-05 16:15:27 +01:00
AddWindowsResources.cmake cmake: Add AddWindowsResources module 2024-08-16 21:19:11 +01:00
CheckSourceCompilesAndLinks.cmake cmake: Add introspection module 2024-08-16 19:27:36 +01:00
FindBerkeleyDB.cmake cmake: Add wallet functionality 2024-08-16 19:27:40 +01:00
FindLibevent.cmake cmake, refactor: Move HAVE_EVHTTP_... to libevent interface 2024-11-06 15:40:42 +00:00
FindQRencode.cmake cmake: Add FindQRencode module 2024-11-05 16:38:19 +00:00
FindQt.cmake cmake: Avoid hardcoding Qt's major version in Find module 2024-10-01 13:43:30 +01:00
FindUSDT.cmake tracing: dedup TRACE macros & rename to TRACEPOINT 2024-10-28 14:23:47 +01:00
FindZeroMQ.cmake cmake: Add FindZeroMQ module 2024-10-25 18:09:36 +01:00
FlagsSummary.cmake build: Print CMAKE_CXX_COMPILER_ARG1 in summary 2024-09-06 21:59:52 +01:00
GenerateHeaders.cmake build: avoid unnecessary dependencies on generated headers 2025-01-31 15:07:23 +00:00
GenerateSetupNsi.cmake build: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:35:55 +00:00
GetTargetInterface.cmake cmake: Print compiler and linker flags in summary 2024-08-16 19:27:36 +01:00
Maintenance.cmake guix: remove test-security/symbol-check scripts 2025-02-10 11:12:33 +01:00
ProcessConfigurations.cmake build: set build type and per-build-type flags as early as possible 2025-02-10 21:51:22 +00:00
TestAppendRequiredLibraries.cmake cmake: Add introspection module 2024-08-16 19:27:36 +01:00
TryAppendCXXFlags.cmake cmake: Fix IF_CHECK_PASSED option handling 2024-11-06 08:59:15 +00:00
TryAppendLinkerFlag.cmake cmake: Fix IF_CHECK_PASSED option handling 2024-11-06 08:59:15 +00:00
WarnAboutGlobalProperties.cmake cmake: Introduce interface libraries to encapsulate common flags 2024-08-16 19:27:34 +01:00