Files
ddidderr da0e2c8380 fix(build): restore complete mixed Rust build matrix
`make all` exercises substantially more than the default zstd binary. It also
builds compression-only and decompression-only archives, older contrib tools
that compile program C shims directly, and the single-file amalgamations. The
Rust migration had changed symbol ownership without updating every one of
those feature and link boundaries.

The first failure came from `fileio_asyncio`: it is always compiled, but its
codec bindings unconditionally referenced both `zstd_compress` and
`zstd_decompress`. A compression-only archive therefore required disabled
decoder modules, and the decompression-only configuration had the symmetric
problem. Gate the concrete codec imports, callback types, helpers, and exports
with their Cargo features. Keep the format probe compilable without the
legacy decoder predicate when decompression is disabled.

Once that boundary compiled, the remaining `make all` paths exposed related
integration gaps. Move the C decompression projection declarations out of the
compression preprocessor block, while leaving destination callback types
shared. Link the Rust CLI helpers archive into zlibWrapper, pzstd, and
largeNbDicts, whose util/time/data-generator C files are now declaration shims
rather than implementations.

The generated single-file C sources also call Rust-owned symbols now. Build
and link an appropriately featured Rust archive in their native smoke tests,
and include the pool configuration shim in the decoder case. The full
amalgamation combines `zstd_lazy.c` and `zstd_opt.c` into one translation unit,
so guard their otherwise translation-unit-local dictionary mode enum against
duplicate definition.

A Rust-backed amalgamation is no longer a standalone Emscripten input. Remove
the obsolete emcc/Docker path and report that limitation explicitly; restoring
the WebAssembly smoke test requires a Rust WebAssembly archive and a defined
cross-language amalgamation contract.

Test Plan:
- `cargo check --manifest-path rust/Cargo.toml --no-default-features --features compression` -- passed
- `cargo check --manifest-path rust/Cargo.toml --no-default-features --features decompression` -- passed
- `sh -n build/single_file_libs/build_decoder_test.sh build/single_file_libs/build_library_test.sh` -- passed
- `make all` -- passed, including native single-file and seekable-format tests
- `git diff --cached --check` -- passed
2026-07-22 06:56:06 +02:00
..
2022-03-12 08:58:04 +01:00
2022-01-19 11:32:53 +01:00
2022-01-19 11:32:53 +01:00
2022-01-19 15:57:33 +01:00
2024-10-23 11:50:56 -07:00

Single File Zstandard Libraries

The script combine.sh creates an amalgamated source file that can be used with or without zstd.h. This isn't a header-only file but it does offer a similar level of simplicity when integrating into a project.

All it now takes to support Zstd in your own projects is the addition of a single file, two if using the header, with no configuration or further build steps.

Decompressor

This is the most common use case. The decompression library is small, adding, for example, 26kB to an Emscripten compiled WebAssembly project. Native implementations add a little more, 40-70kB depending on the compiler and platform.

Create zstddeclib.c from the Zstd source using:

cd zstd/build/single_file_libs
python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c

Then add the resulting file to your project (see the example files).

create_single_file_decoder.sh will run the above script, creating the file zstddeclib.c (build_decoder_test.sh will also create zstddeclib.c, then compile and test the result).

Full Library

The same tool can amalgamate the entire Zstd library for ease of adding both compression and decompression to a project. The roundtrip example uses the original zstd.h with the remaining source files combined into zstd.c (currently just over 1.2MB) created from zstd-in.c. As with the standalone decoder the most useful compile flags have already been rolled-in and the resulting file can be added to a project as-is.

Create zstd.c from the Zstd source using:

cd zstd/build/single_file_libs
python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -k zstd.h -o zstd.c zstd-in.c

It's possible to create a compressor-only library but since the decompressor is so small in comparison this doesn't bring much of a gain (but for the curious, simply remove the files in the decompress section at the end of zstd-in.c).

create_single_file_library.sh will run the script to create zstd.c (build_library_test.sh will also create zstd.c, then compile and test the result).