Installing latest rust nightly complains about missing rls component - rust

Trying to compile: https://github.com/SergioBenitez/Rocket/tree/master/examples/hello
Cargo.toml
[dependencies]
rocket = "0.4.10"
Complains that I need rust nightly
$ cargo build
...
Error: Rocket (core) requires a more recent version of rustc.
Installed version: 1.54.0 (2021-05-17)
Minimum required: 1.54.0-nightly (2021-05-18)
I have done a local directory override
$ rustup override set nightly
I am running nightly 2021-05-17 but I need 2021-05-18
$ rustup show
...
active toolchain
----------------
nightly-x86_64-unknown-linux-gnu (directory override for '/<redacted>')
rustc 1.54.0-nightly (3e99439f4 2021-05-17)
I've tried all sorts of commands to get a more recent nightly
$ rustup update
$ rustup update nightly
$ rustup toolchain install nightly-2021-05-18
There is some weird stuff when I do rustup update nightly
$ rustup update nightly
info: syncing channel updates for 'nightly-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-23, rust version 1.54.0-nightly (e4ca1662f 2021-05-22)
info: skipping nightly which is missing installed component 'rls'
info: syncing channel updates for 'nightly-2021-05-22-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-22, rust version 1.54.0-nightly (5dc8789e3 2021-05-21)
info: skipping nightly which is missing installed component 'rls'
info: syncing channel updates for 'nightly-2021-05-21-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-21, rust version 1.54.0-nightly (40d230204 2021-05-20)
info: skipping nightly which is missing installed component 'rls'
info: syncing channel updates for 'nightly-2021-05-20-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-20, rust version 1.54.0-nightly (f94942d84 2021-05-19)
info: skipping nightly which is missing installed component 'rls'
info: syncing channel updates for 'nightly-2021-05-19-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-19, rust version 1.54.0-nightly (4e3e6db01 2021-05-18)
info: skipping nightly which is missing installed component 'rls'
info: syncing channel updates for 'nightly-2021-05-18-x86_64-unknown-linux-gnu'
nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.54.0-nightly (3e99439f4 2021-05-17)
Complains about skipping nightly which is missing installed component 'rls' and I have no idea how to resolve this
Any help would be appreciated

Sorry for the wall of text, see The solution to your problem below if you only want a quick fix. You might also look at the rustup book, it contains information about this type of problem.
You are trying to install a nightly version of Rust. In nightly versions, the availability of non-essential components of Rust, such as the Rust Language Server (or short rls) is not guaranteed – if they fail to build, the nightly is shipped without them. You can see here that rls indeed was not part of the last few nightlies. The last day a nightly was shipped with rls was 2021-05-18, which is a build from the day before, so 2021-05-17 (a bit irritating, but this seems to be accepted behavior).
Your rustup installation seems to be configured to include rls. Therefore, when you tell rustup to update your nightly toolchain, rustup selects the newest nightly containing rls. There are no such nightlies newer than your currently installed nightly-2021-05-17, therefore, rustup does not update the toolchain.
The solution to your problem
If you don't need rls (it's only necessary for auto-completion in IDEs and stuff like that), there are multiple solutions to your problem:
You can remove the rls component from your nightly toolchain: rustup component remove --toolchain nightly rls
The rustup book also has some more solutions:
If [a previously installed component] is missing, rustup will automatically search for an older release that contains the required components. There are several ways to change this behavior:
Use the --force flag to rustup toolchain install to force it to install the most recent version even if there is a missing component.
Use the --profile flag to rustup toolchain install to use a different profile that does not contain the missing component. For example, --profile=minimal should always work, as the minimal set is required to exist. See the Profiles chapter for more detail.
Install a specific date that contains the components you need. For example, rustup toolchain install nightly-2020-07-27. You can then use overrides to pin to that specific release.
If you do need rls, you are in a bit of a tight spot. You might want to use a override for your project, in effect using different Rust builds for building your code and for running rls. However, this will probably not work – rls may need to build your project dependencies for autocompletion, and Rocket will not allow that with older nightlies. I don't really have a solution for this case – you may need to stay on an older version of Rocket or stop using rls for now, until there is a newer Rust nightly shipping with rls again.

Related

Why doesn't rustup update rustc as I expected?

It looks like it has updated to 1.64.0, which is what I want, but then when I check the version, the update did not happen.
root#c1:~# rustup update
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: checking for self-updates
stable-x86_64-unknown-linux-gnu unchanged - rustc 1.64.0 (a55dd71d5 2022-09-19)
info: cleaning up downloads & tmp directories
root#c1:~# rustc --version
rustc 1.58.0-nightly (072799443 2021-11-06)
that is because rustup updated a different rust installation than the one you checked its version using rustc --version.
you can see that rustup has updated a stable version of rust while rustc is nightly, as the 1st comment said. run which rustc and rustup show to locate both installations and then fix your paths accordingly

Is it possible to run nightly cargo with stable rustc

In our project we need to use an unstable cargo option --out-dir, but we still want to use stable rustc to build our rust code. Is this possible?
You should be able to configure the nightly cargo executable to use the stable rustc compiler by modifying the build.rustc key. You could delegate this to the stable compiler if rustup is installed by setting the value to be rustup run stable rustc.
You can use the __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS environment variable to override the Cargo channel. As the name suggests, it's not really intended to be used. But you can! Keep in mind that with this approach you only get the unstable features included in the latest stable release (and important fixes for unstable features aren't going to get backported to the stable branch, because this shouldn't be used)
# Allow unstable options in Cargo, but use stable rustc
__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS=nightly cargo build -Z unstable-options

How can I update the stable toolchain when I get the error "some components unavailable for target i386-apple-ios/armv7s-apple-ios"?

I try to run
rustup update stable
and I get the following output.
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2020-05-07, rust version 1.43.1 (8d69840ab 2020-05-04)
error: some components unavailable for download for channel stable: 'rust-std' for target 'i386-apple-ios', 'rust-std' for target 'armv7s-apple-ios', 'rust-std' for target 'armv7-apple-ios'
If you require these components, please install and use the latest successful build version,
which you can find at <https://rust-lang.github.io/rustup-components-history>.
After determining the correct date, install it with a command such as:
rustup toolchain install nightly-2018-12-27
Then you can use the toolchain with commands such as:
cargo +nightly-2018-12-27 build
While I can install the latest stable toolchain using
rustup toolchain install stable-2020-05-07
That creates a separate toolchain.
rustup toolchain list
stable-2020-05-07-x86_64-unknown-linux-gnu (default)
stable-x86_64-unknown-linux-gnu
nightly-2020-05-07-x86_64-unknown-linux-gnu
I can use this new toolchain as the default (as I am now), but it's going to be a pain moving forward as I can't just use rustup update.
Running rustup toolchain install stable yields the same error.
How can I get the stable Rust toolchain to update via rustup update run?
The Rust team regrets to announce that Rust 1.41.0 (to be released on January 30th, 2020) will be the last release with the current level of support for 32-bit Apple targets. Starting from Rust 1.42.0, those targets will be demoted to Tier 3.
Reducing support for 32-bit Apple targets
You will need to remove those components using rustup component remove. I can't test the exact invocation, but something like:
rustup component remove --toolchain stable --target i386-apple-ios rust-std
rustup component remove --toolchain stable --target armv7s-apple-ios rust-std
rustup component remove --toolchain stable --target armv7-apple-ios rust-std
Once removed, you can update your compiler.

How to install old version of rust-src?

My machine have rust nightly-2020-03-24, I want to compile cross-compile crate core. But the command rustup component add rust-src install newest version of rust-src, which rustc-2020-03-24 can't build (due to new feature llvm-asm). How can I install old version of rust-src?
If not already installed, you can get a specific version of a component by specifying the toolchain when calling rustup (like +stable, +1.44, etc). In your case:
rustup +nightly-2020-03-24 component add rust-src
The source can then be found in ~/.rustup/toolchains/nightly-2020-03-24-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/.

How is it possible to use a nightly rustc compiler in buildroot

rustc and cargo are supported in buildroot. But even the latest buildroot master uses rust version 1.33.0 stable I think.
How can I use the a nightly version of rust in buildroot?
Update: This patch http://lists.busybox.net/pipermail/buildroot/2016-April/159523.html introduces rust in buildroot. And this buildroot repo https://github.com/elebihan/buildroot/tree/feature/rust-1.33.0 has some latest rustc version.
This is for a QEMU ARM Vexpress, but I think it will get you where you are going:
Using Rust with Buildroot (full build)
You can skip up to the pushd command to the downloaded nightly rust source. Instead of doing all that, just use the location of the code you got when you run rustup install nightly (or however else you're installing the nightly snapshot`).
I hope that helps.
If the build commands don't need to be changed, you can just download the source to some directory and add RUST_OVERRIDE_SRCDIR=<path to rust source> in your local.mk. See the Buildroot manual.

Resources