cargo-multivers
Cargo subcommand to build multiple versions of the same binary, each with a different CPU features set, merged into a single portable optimized binary.
cargo-multivers
builds multiple versions of the binary of a Rust package.
Each version is built with a set of CPU features (e.g., +cmpxchg16b,+fxsr,+sse,+sse2,+sse3
) from a CPU (e.g., ivybridge
) supported by the target (e.g., x86_64-pc-windows-msvc
).
By default, it lists the CPUs known to rustc
for a given target, then it fetches each set of CPU features and filters out
the duplicates.
You can also add a section to your Cargo.toml
to set the allowed list of CPUs for your package.
For example, for x86_64
you could add:
toml
[package.metadata.multivers.x86_64]
cpus = ["generic", "alderlake", "skylake", "sandybridge", "ivybridge"]
After building the different versions, it computes a hash of each version and it filters out the duplicates.
Finally, it builds a runner that embeds one version compressed (the source) and the others as compressed binary patches to the source.
For instance, when building for the target x86_64-pc-windows-msvc
, by default 37 different versions
will be built, filtered, compressed, and merged into a single portable binary.
When executed, the runner uncompresses and executes the version that matches the CPU features of the host.
While cargo-multivers
could be used to build any kind of binary from a Rust package,
it is mostly intended for the following use cases:
This project is tested on Windows and Linux (due to the use of memfd_create
, only Linux >= v3.17 is supported).
bash
cargo install --locked cargo-multivers
bash
cargo +nightly multivers
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.