rustup tool is surprisingly nice and well behaved
I don't code in Rust (it's not my thing), but I do
periodically look into other people's Rust code, most recently
Julia Evans' dnspeep. When I had reason to poke into
dnspeep, I decided it was time I got a LSP-enabled GNU Emacs Rust
environment. Following Robert Krahn's guide, one part
of this rust-analyzer,
which you can either download a binary of or build it yourself,
which is the option I chose. On my Fedora 33 desktops, this was a
simple git clone and a '
cargo xtask install --server'. On work's Ubuntu 18.04 servers, it turned
out that the stock Ubuntu 18.04 version of Rust and Cargo were too
old to build rust-analyzer.
(Our login servers are still running Ubuntu 18.04 because of still ongoing world and local events.)
When I poked around in my work Ubuntu account I discovered that at
some point I'd gotten a copy of rustup, the
Rust toolchain installer (this is foreshadowing for another entry).
As a system administrator I have a reflexive aversion to black box
tools that promise to magically install something on my system,
partly because I don't want my system changed
(also), and this is
what the rustup website presents rustup as.
However, some more reading
told me that rustup was much better behaved than that, and this is
how it proved to be in practice. I had apparently never initialized
a rustup setup in my
$HOME and it took me some time to figure out
what to do, but once I did, rustup was straightforward and confined
itself (more or less) to $HOME/.cargo.
(As I found out later, the starting command I probably wanted was
rustup default stable'. I went through a more elaborate chain
of things like '
rustup toolchain stable' and then figuring out
how to make it the default.)
That rustup doesn't insist on mangling the system shouldn't surprise me by now, because this is relatively normal behavior for other modern language package managers like Python's pip, NPM, and Go. But it's still nice and appreciated. As a sysadmin and a Unix user, I appreciate things that will install and operate on a per-user basis, especially if they confine all of their activities to a single directory hierarchy in $HOME.
One thing about rustup is that all of the binaries it manages in ~/.cargo/bin are hardlinks to itself, and so their installation time never changes (presumably unless you update rustup itself). This was a bit disconcerting when I was playing around with toolchain settings and so on; I would change things in rustup, look in .cargo/bin, and nothing would seem to have changed. Behind the scenes rustup was changing stuff in $HOME/.rustup, but that was less visible to me.
I'm not sure how I got my
rustup binary in the first place. I
think I probably got it through the "other installation methods" chapter,
undoubtedly with at least
--no-modify-path. It's a pity there's no
straightforward bootstrap with
cargo that I can find mentioned,
because various Linuxes supply Cargo and Rust but not necessarily
(This elaborates on a tweet of mine and will hopefully get this pleasant side of rustup to stick in my mind for any future needs. Because Ubuntu 18.04 is so long in the tooth by now, I also had to shave some other yaks to get a modern Rust LSP environment set up in GNU Emacs.)