build(rust): rebuild the archive for C test and CLI links

Make Rust sources normal prerequisites of native C test executables and CLI
builds. A changed Rust module now rebuilds libzstd_rs.a and relinks the target,
instead of relying on a manually prepared archive that can silently be stale.

The archive is linked after C objects, allowing migrated C shims to resolve
their Rust ABI symbols while remaining compatible with the existing makefile
flows. The migration guide now documents this behavior.

Test Plan:
- make -B -C tests fuzzer
- ./tests/fuzzer -i1 --no-big-tests
- make -B -C programs zstd
- ./programs/zstd --version

Refs: rust/README.md
This commit is contained in:
2026-07-10 20:11:42 +02:00
parent 57106c5c32
commit ebc43676b7
3 changed files with 44 additions and 10 deletions
+21 -1
View File
@@ -36,6 +36,18 @@ PRGDIR = ../programs
PYTHON ?= python3
TESTARTEFACT := versionsTest
# The Rust implementation is linked into C compatibility tests. Keep the
# archive a real prerequisite so a changed Rust source always relinks a test.
CARGO ?= cargo
RUST_DIR := ../rust
RUST_MANIFEST := $(RUST_DIR)/Cargo.toml
RUST_STATICLIB := $(RUST_DIR)/target/release/libzstd_rs.a
RUST_SOURCES := $(RUST_MANIFEST) $(RUST_DIR)/Cargo.lock \
$(shell find $(RUST_DIR)/src -type f -name '*.rs' -print)
$(RUST_STATICLIB): $(RUST_SOURCES)
$(CARGO) build --manifest-path $(RUST_MANIFEST) --release
DEBUGFLAGS += -g -Wno-c++-compat
CPPFLAGS += -I$(LIB_SRCDIR) -I$(LIB_SRCDIR)/common -I$(LIB_SRCDIR)/compress -I$(LIB_SRCDIR)/legacy \
-I$(LIB_SRCDIR)/dictBuilder -I$(LIB_SRCDIR)/deprecated -I$(PRGDIR) \
@@ -74,7 +86,6 @@ MULTITHREAD_CPP = -DZSTD_MULTITHREAD
MULTITHREAD_LD = -pthread
endif
MULTITHREAD = $(MULTITHREAD_CPP) $(MULTITHREAD_LD)
LDFLAGS += -Wl,--whole-archive ../rust/target/release/libzstd_rs.a -Wl,--no-whole-archive
VOID = /dev/null
ZSTREAM_TESTTIME ?= -T90s
@@ -245,6 +256,15 @@ CLEAN += poolTests
poolTests : $(PRGDIR)/util.c $(PRGDIR)/timefn.c poolTests.c $(LIB_SRCDIR)/common/pool.c $(LIB_SRCDIR)/common/threading.c $(LIB_SRCDIR)/common/zstd_common.c $(LIB_SRCDIR)/common/error_private.c
$(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT)
# These static C test executables exercise Rust replacements. The normal
# prerequisite is also an archive input, placed after C sources by `$^`, and
# rebuilding Rust therefore relinks rather than leaving a stale implementation.
RUST_LINK_TARGETS := $(FULLBENCHS) fuzzer fuzzer32 zstreamtest zstreamtest32 \
zstreamtest_asan zstreamtest_tsan zstreamtest_ubsan \
paramgrill roundTripCrash longmatch largeDictionary \
invalidDictionaries legacy decodecorpus poolTests
$(RUST_LINK_TARGETS): $(RUST_STATICLIB)
.PHONY: versionsTest
versionsTest: clean
$(PYTHON) test-zstd-versions.py