Already installed Rust?

Other package managers also ship Rust, and you may wish to use the packaged toolchain, such as for distribution package development. You may also wish to use a rustup-managed toolchain such as nightly or beta. Normally, rustup will complain that you already have Rust installed in /usr and refuse to install. However, you can install Rust via rustup and have it coexist with your packaged Rust toolchain.

Set up rustup with an existing Rust toolchain

When you initially install Rust with rustup, pass the -y option to make it ignore the packaged Rust toolchain and install a rustup-managed toolchain into ~/.cargo/bin. Add that directory to your $PATH (or let rustup do it for you by not passing --no-modify-path). Then, to tell rustup about your system toolchain, run:

rustup toolchain link system /usr

You can then use “system” as a rustup toolchain, just like “nightly”. For example, using the toolchain override shorthand, you can run cargo +system build to build with the system toolchain, or cargo +nightly build to build with nightly.

If you wish to develop with the system toolchain (e.g. for distribution packages), you may want to make it your default toolchain:

rustup default system

Ensure the correct $PATH configuration

There are times when the above steps don’t work, and you may see strange error messages when running commands that should have been proxied by rustup. For example, when running cargo +stable --version, you may encounter the following error:

error: no such command: `+stable`

        Cargo does not handle `+toolchain` directives.
        Did you mean to invoke `cargo` through `rustup` instead?

This means cargo is currently not a rustup proxy, and your $PATH needs to be fixed.

In fact, on any machine with rustup installed, you would like to have rustup proxies showing up first in $PATH, shadowing any other Rust installations. Don’t worry: these shadowed installations can then be adopted by rustup with the rustup toolchain link command as mentioned above.

The exact steps to be taken to make rustup proxies come first may vary according to your system environment, but usually it is about changing the evaluation order of certain lines in your shell configuration file(s).

To make it clearer, let’s look at the example of a Mac with both regular rustup fetched from rustup.rs and homebrew-installed rust. The right way to configure .profile in this environment would be:

eval $(/opt/homebrew/bin/brew shellenv)
. $HOME/.cargo/env

In this example, both of these lines all prepend to $PATH, so the last one takes over, letting the rustup proxies shadow the homebrew-installed rust. On the other hand, putting these lines the other way around will cause the aforementioned error.

When in doubt, you can always debug your shell configuration by printing the status of your current $PATH with echo $PATH | xargs -n1 and paying attention to the order of $CARGO_HOME/bin (which defaults to $HOME/.cargo/bin) compared to your package manager’s bin directory.

After the fix, the output of cargo +stable --version should be similar to one of the following, depending on whether you have had the stable toolchain installed:

  • cargo 1.85.1 (d73d2caf9 2024-12-31)
    
  • error: toolchain 'stable' is not installed