PyO3 / maturin

Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages
https://maturin.rs
Apache License 2.0
3.96k stars 275 forks source link

build_context: improve wheel reproducibility by sorting libs #2261

Closed ycongal-smile closed 1 month ago

ycongal-smile commented 1 month ago

While tracking a reproducibility issue from maturin's output, we found that the .so file in the output .whl were not ordered the same every time.

Order of the external libraries in the .whl comes down to the order soname_map is iterated. But, std::HashMap does not provide a stable order and that create an unstable order in the wheel.

Switch to std::BTreeMap which keeps keys sorted and is iterable in a stable order.

This can be tested by building current python3-cryptography :

SOURCE_DATE_EPOCH=1728915855 maturin build

Before this commit, the above give two possible outputs (~50% each), the difference is in the order of libssl and libcrypto.

After this commit, the output is reproducible.

ycongal-smile commented 1 month ago

ping @moto-timo