From ac95106abece72dd4f47689974cbfaffa6c773bb Mon Sep 17 00:00:00 2001 From: DanS Date: Thu, 27 Aug 2026 03:56:23 -0500 Subject: [PATCH] build(win): make the mingw cross-compile link and find librustzcash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three things broke the x86_64-w64-mingw32 build; two are real and fixed here (the third was a stale-object contamination from building Linux and Windows in the same tree, resolved by a clean rebuild — not a code fix). 1. Single-pass mingw ld could not resolve the cross-references DragonX added between the internal static archives (libbitcoin_util/common objects pulling in UniValue; util<->common mutual deps). GNU ld on Linux re-scans archives so it never surfaced; ld64 on macOS rejects the grouping flag outright. Bracket each binary's _LDADD in -Wl,--start-group/--end-group, delivered via AC_SUBST(LINK_GROUP_*) so automake does not reject the linker flag inside _LDADD, and left empty on every non-Windows target. 2. The Rust build emits the mingw archive as rustzcash.lib, but the link line asks for -lrustzcash, i.e. librustzcash.a. Normalize the staged filename to librustzcash.a for every host (a no-op on Linux/macOS, where the basename was already librustzcash.a). Co-Authored-By: Claude Opus 4.8 (1M context) --- configure.ac | 16 ++++++++++++++++ depends/packages/librustzcash.mk | 2 +- src/Makefile.am | 15 ++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index edff57081..3c4e5dbc8 100644 --- a/configure.ac +++ b/configure.ac @@ -833,6 +833,22 @@ AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin]) AM_CONDITIONAL([TARGET_LINUX], [test x$TARGET_OS = xlinux]) AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) + +dnl mingw ld is single-pass: bracket the internal static archives in a link group +dnl so it re-scans and resolves the cross-references DragonX added between them +dnl (libbitcoin_util/common objects using UniValue; util<->common mutual deps). +dnl Delivered via AC_SUBST (not an automake conditional) so automake does not +dnl reject the linker flags inside _LDADD. Empty elsewhere (macOS ld64 rejects the +dnl flag; GNU ld on Linux re-scans archives already). +if test "x$TARGET_OS" = "xwindows"; then + LINK_GROUP_START="-Wl,--start-group" + LINK_GROUP_END="-Wl,--end-group" +else + LINK_GROUP_START="" + LINK_GROUP_END="" +fi +AC_SUBST(LINK_GROUP_START) +AC_SUBST(LINK_GROUP_END) AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes]) AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes]) AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes]) diff --git a/depends/packages/librustzcash.mk b/depends/packages/librustzcash.mk index 864536d5b..f7cfd1a4d 100644 --- a/depends/packages/librustzcash.mk +++ b/depends/packages/librustzcash.mk @@ -53,6 +53,6 @@ endif define $(package)_stage_cmds mkdir $($(package)_staging_dir)$(host_prefix)/lib/ && \ mkdir $($(package)_staging_dir)$(host_prefix)/include/ && \ - cp $($(package)_library_file) $($(package)_staging_dir)$(host_prefix)/lib/ && \ + cp $($(package)_library_file) $($(package)_staging_dir)$(host_prefix)/lib/librustzcash.a && \ cp librustzcash/include/librustzcash.h $($(package)_staging_dir)$(host_prefix)/include/ endef diff --git a/src/Makefile.am b/src/Makefile.am index 1ba627e21..96b509435 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -489,7 +489,7 @@ if TARGET_WINDOWS dragonxd_SOURCES += bitcoind-res.rc endif -dragonxd_LDADD = \ +dragonxd_LDADD = $(LINK_GROUP_START) \ $(LIBBITCOIN_SERVER) \ $(LIBCURL) \ $(LIBBITCOIN_COMMON) \ @@ -527,6 +527,8 @@ if TARGET_LINUX dragonxd_LDADD += libcc.so $(LIBSECP256K1) endif +dragonxd_LDADD += $(LINK_GROUP_END) + # [+] Decker: use static linking for libstdc++.6.dylib, libgomp.1.dylib, libgcc_s.1.dylib if TARGET_DARWIN dragonxd_LDFLAGS += -static-libgcc @@ -553,7 +555,7 @@ if TARGET_WINDOWS dragonx_cli_SOURCES += bitcoin-cli-res.rc endif -dragonx_cli_LDADD = \ +dragonx_cli_LDADD = $(LINK_GROUP_START) \ $(LIBBITCOIN_CLI) \ $(LIBUNIVALUE) \ $(LIBBITCOIN_UTIL) \ @@ -566,8 +568,10 @@ dragonx_cli_LDADD = \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) +dragonx_cli_LDADD += $(LINK_GROUP_END) + if ENABLE_WALLET -wallet_utility_LDADD = \ +wallet_utility_LDADD = $(LINK_GROUP_START) \ libbitcoin_wallet.a \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_CRYPTO) \ @@ -579,6 +583,7 @@ wallet_utility_LDADD = \ $(LIBZCASH) \ $(LIBZCASH_LIBS)\ $(LIBRANDOMX) +wallet_utility_LDADD += $(LINK_GROUP_END) endif # hush-tx binary # @@ -591,7 +596,7 @@ if TARGET_WINDOWS dragonx_tx_SOURCES += bitcoin-tx-res.rc endif -dragonx_tx_LDADD = \ +dragonx_tx_LDADD = $(LINK_GROUP_START) \ $(LIBUNIVALUE) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ @@ -602,7 +607,7 @@ dragonx_tx_LDADD = \ $(LIBZCASH_LIBS) \ $(LIBRANDOMX) -dragonx_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) +dragonx_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) $(LINK_GROUP_END) # Zcash Protocol Primitives libzcash_a_SOURCES = \