build(win): make the mingw cross-compile link and find librustzcash

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) <noreply@anthropic.com>
This commit is contained in:
2026-08-27 03:56:23 -05:00
parent 02b4d03fc6
commit ac95106abe
3 changed files with 27 additions and 6 deletions

View File

@@ -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])

View File

@@ -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

View File

@@ -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 = \