Greetings, Rustaceans!
I'm here to announce Xargo 0.3.0.
If you didn't know, Xargo is a drop-in Cargo replacement (same CLI as Cargo) that builds and manages a "sysroot" for each compilation target. In practice, people use it build the core
crate "on the fly" when working with targets that don't have binary releases of the standard crates, like the thumbv*m-none-eabi*
targets.
$ xargo build --target thumbv6m-none-eabi
Compiling core v0.0.0 (file://$SYSROOT/lib/rustlib/src/rust/src/libcore)
Finished release [optimized] target(s) in 11.61 secs
Compiling lib v0.1.0 (file://$PWD)
Finished debug [unoptimized + debuginfo] target(s) in 0.5 secs
Version 0.3.0 gives Xargo a new feature: the Xargo.toml file, which can be used to specify which crates of the std
facade to build and "how" to build them (i.e. which of their Cargo features to enable).
This version also lifts an artificial restriction xargo
used to have: it now works with any built-in target.
In practice, the combination of these changes lets you build a custom version of the std
crate and link your programs against that custom std
.
The main use case I see right now is building programs that abort on panic (-C panic=abort
) but with zero landing pads (the std
that rustup
installs contains landing pads as it was compiled with -C panic=unwind
) which would result in smaller (and probably faster) binaries.
$ cat Xargo.toml
[target.i686-unknown-linux-gnu.dependencies.std]
features = ["jemalloc"]
$ tail -n3 Cargo.toml
[profile.release]
lto = true
panic = "abort"
# 2.3% smaller binary
$ xargo build --target i686-unknown-linux-gnu --release
Other potential applications could be re-building std
to include MIR (for miri consumption) or re-building std
to enable sanitizer support.
I'll leave it up to you, folks, to figure out novel applications for this tool.