In IntelliJ IDEA on Gentoo, how do I attach the rust stdlib sources since gentoo does not use rustup?
Asked Answered
P

5

11

I am using IntelliJ's rust plugin (version 0.2.0.2114-182) with IDEA (2018.2.3).

There is a yellow bar at the top of my editor window that says "cannot attach stdlib sources automatically without rustup". This is not surprising since gentoo does not use rustup. It compiles rust from source.

There is an option to "attach manually", but I have no idea what directory it wants me to pick; or even what I should look for to figure out what the proper directory is; and I'm not even sure the gentoo ebuild created a directory with the necessary stdlib sources.

How can I provide the stdlib sources to the rust plugin in a way that is compatible with gentoo's package management system? It seems like answers to How to provide standard library sources for IntelliJ IDEA's Rust project? bypass gentoo's ebuilds and might cause the accumulation of cruft over time.

Plowshare answered 5/9, 2019 at 14:21 Comment(0)
B
7

The dev-lang/rust Gentoo package has an rls use-flag (standing for Rust Language Server), which has a side-effect of installing Rust sources to /usr/lib/rustlib/src:

$ equery files dev-lang/rust | grep lib.rs
/usr/lib/rustlib/src/rust/src/libcore/lib.rs
/usr/lib/rustlib/src/rust/src/libstd/lib.rs
(...)

The solution is therefore to enable the rls use-flag and then point Intellij IDEA to /usr/lib/rustlib/src/rust/src:

Pointing Intellij IDEA Rust Standard library to /usr/lib/rustlib/src/rust/src

I believe this is a more idiomatic solution on Gentoo than to bypass portage and/or use rustup.

Note that dev-lang/rust-bin package currently does not have the rls use-flag and I haven't found a way to install Rust lib sources with it.

Contributions regarding dev-lang/rust use-flags (and their docs) in Gentoo would be probably appreciated.

Burned answered 7/3, 2020 at 10:39 Comment(1)
In version 1.47.0, the path appeared to be /usr/lib/rustlib/src/rust/library.Flight
P
4

I have an experimental technique that has different warts from the solution Sven found:

I installed rustup in addition to having the gentoo-managed rust ebuild.

$ wget -O sh.rustup.rs https://sh.rustup.rs
--2019-09-24 10:28:49--  https://sh.rustup.rs/
Resolving sh.rustup.rs... 13.249.122.62, 13.249.122.9, 13.249.122.96, ...
Connecting to sh.rustup.rs|13.249.122.62|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10782 (11K) [text/x-sh]
Saving to: 'sh.rustup.rs'

sh.rustup.rs        100%[===================>]  10.53K  --.-KB/s    in 0.001s  

2019-09-24 10:28:49 (10.4 MB/s) - 'sh.rustup.rs' saved [10782/10782]

However, rustup is sad that I already have rust installed in /usr/bin

 $ sh sh.rustup.rs
info: downloading installer
error: it looks like you have an existing installation of Rust at:
error: /usr/bin
error: rustup cannot be installed alongside Rust. Please uninstall first
error: if this is what you want, restart the installation with `-y'
error: cannot install while Rust is installed

Brute force "solves" this problem:

$ sh sh.rustup.rs -y
info: downloading installer
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2019-08-15, rust version 1.37.0 (eae3437df 2019-08-13)
info: downloading component 'rustc'
 85.3 MiB /  85.3 MiB (100 %)   9.6 MiB/s in  9s ETA:  0s
info: downloading component 'rust-std'
 61.2 MiB /  61.2 MiB (100 %)   8.2 MiB/s in  8s ETA:  0s
info: downloading component 'cargo'
info: downloading component 'rust-docs'
 11.3 MiB /  11.3 MiB (100 %)   8.4 MiB/s in  1s ETA:  0s
info: installing component 'rustc'
 85.3 MiB /  85.3 MiB (100 %)  18.4 MiB/s in  4s ETA:  0s
info: installing component 'rust-std'
 61.2 MiB /  61.2 MiB (100 %)  20.9 MiB/s in  5s ETA:  0s
info: installing component 'cargo'
info: installing component 'rust-docs'
 11.3 MiB /  11.3 MiB (100 %) 606.4 KiB/s in  9s ETA:  0s
info: default toolchain set to 'stable'

  stable installed - rustc 1.37.0 (eae3437df 2019-08-13)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH 
environment variable. Next time you log in this will be done automatically.

To configure your current shell run source $HOME/.cargo/env

After that you might want to rig rustup to use the same version the ebuild installed (or maybe you want to leave it tracking the latest stable, your choice)

$ equery list rust
 * Searching for rust ...
[IP-] [  ] dev-lang/rust-1.34.2:stable/1.34
$ rustup default 1.34.2
info: using existing install for '1.34.2-x86_64-unknown-linux-gnu'
info: default toolchain set to '1.34.2-x86_64-unknown-linux-gnu'
  1.34.2-x86_64-unknown-linux-gnu unchanged - rustc 1.34.2 (6c2484dc3 2019-05-13)

But you definitely want the rust-src component

$ rustup component add rust-src 
info: downloading component 'rust-src'
info: installing component 'rust-src'

After that, the rust stdlib sources should be in $HOME/.rustup/toolchains/$VERSION-$ARCH/lib/rustlib/src/rust/src and you should be able to enter that path into the settings for the rust plugin.

IDEA settings for rust toolchain

You may also use that settings dialog to choose your toolchain (/usr/bin, $HOME/.cargo/bin, or $HOME/.rustup/toolchains/$VERSION-$ARCH/bin; I'm just guessing that .cargo/bin points to whatever rustup default you have set at the moment).

The drawback to this solution is that you now have 2 (or more) installations of rust. The system ebuild, plus any versions you have installed into $HOME/.cargo and $HOME/.rustup using rustup. There may be more problems, considering that I've only been using this for an hour or so.

Plowshare answered 24/9, 2019 at 15:12 Comment(1)
Manually installing src through rustup component add rust-src worked for me, though I had to modify path from $HOME/.rustup/toolchains/$VERSION-$ARCH/lib/rustlib/src/rust/src to $HOME/.rustup/toolchains/$VERSION-$ARCH/lib/rustlib/src/rust/libChancery
T
1

Had the same problem. The solution I settled for is to use rustup and remove portage's rust from my system. You can then tell portage to assume rust is provided by using /etc/portage/package.provided to make emerges like firefox work with rustup's version.

Here is a short article describing the process: https://laumann.xyz/gentoo/2018/05/01/gentoo-package-provided.html

Iirc you don't need everything he puts in bash.profile at the end, but right now I can't tell you what exactly you can leave out

Trauma answered 11/9, 2019 at 11:4 Comment(1)
While I consider this technique to "bypass gentoo's ebuilds" at least partially and thus not qualify as "the answer", it does link to a good article addressing many speedbumps I had not even imagined. I suspect this answer will be quite useful to some folks who land on this page who are willing to work around gentoo's ebuild (and I may find myself among them shortly).Plowshare
C
1

The paths mentioned by the other posts are correct:

  • "/usr/bin" for the "toolchain location".
  • "/usr/lib/rustlib/src/rust/library" for the "standard library".

After having set them the plugin was able to work correctly but the "autocomplete" for methods/functions that belong to Rust's standard library was still not working (same problem on all my 3 Gentoo notebooks, reproduced with CLion 2021.2 & 2021.3 + Rust plugin 0.4.164 and some other older versions + Rust 1.58.1 & 1.56.1).

For example, when typing "String::" I didn't get the list that shows its functions/methods (e.g. "from()", "as_bytes()", etc...).
To be exact, I that functionality was working the very first time that I set the correct paths, but not anymore after an explicit restart of CLion (it took me a while to realize this, made me crazy).

The root cause of the problem seems to be that the rust-plugin wants to be able to write to the stdlib-directories (I didn't analyze what it writes nor I'm going to speculate).
Example of an error message:

error: failed to write /opt/rust-bin-1.58.1/lib/rustlib/src/rust/library/unwind/Cargo.lock

Until CLion changes this behaviour the workaround would obviously be to make the location of Rust's standard library writeable by the user which is running CLion.
Doing that directly would of course trigger a lot of problems (security + pkg management), thererfore I decided to look for alternatives.

I decided to use OverlayFS to be able to still use Gentoo's original installation of Rust and at the same time to reroute the changes written by CLion to a separate directory. In my case the details are:

1- Created the 3 custom dirs needed by OverlayFS:

mkdir /opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir
mkdir /opt/stecustom/clion/clion-rust_stdlib-overlay_workdir
mkdir /mnt/clion-rust_stdlib-overlay-result

2- Did an initial manual "mount":

mount -v -t overlay overlay -o noatime,lowerdir=/usr/lib/rustlib,upperdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir,workdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_workdir /mnt/clion-rust_stdlib-overlay-result

(the contents of "/usr/lib/rustlib" get on top the additional layer "/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir" to which all changes will be written - I don't know what "workdir" is supposed to host but it's a required parameter - and the merged layers are made available in " /mnt/clion-rust_stdlib-overlay-result":)

3- Changed in the overlay the ownership of all files:

cd /mnt/clion-rust_stdlib-overlay-result
chown -R MY_NON_ROOT_USER /mnt/clion-rust_stdlib-overlay-result/*

4- Made CLion's Rust plugin use the new overlayed dir:

  • "/usr/bin" for the "toolchain location" (same as before).
  • "/mnt/clion-rust_stdlib-overlay-result/src/rust/library" for the "standard library" (new!).

5- Restarted CLion and checked that everything worked

6- Made the overlayfs permanent in "/etc/fstab":

overlay /mnt/clion-rust_stdlib-overlay-result overlay noatime,lowerdir=/usr/lib/rustlib,upperdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir,workdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_workdir 0 2

7- Rebooted and checked again in CLion.

Crossway answered 27/2, 2022 at 20:25 Comment(1)
Thanks - you just saved me a lot of debugging time! There's an upstream issue: github.com/intellij-rust/intellij-rust/issues/7912Etom
R
1

It's year 2023 now, and Gentoo's Rust ebuilds (both dev-lang/rust and dev-lang/rust-bin) have the rust-src USE flag, which causes the sources of Rust standard library to be installed. For example, I have dev-lang/rust-1.71.1 installed with USE=rust-src, and I use the path /usr/lib/rust/1.71.1/lib/rustlib/src/rust/library for RustRover's "Standard Library" configuration field, and now it doesn't complain about invalid standard library anymore. (Even though it does complain that it can't write to that location.)

(Note: the question was about the Rust plug-in for Intellij IDEA. Recently this plug-in was deprecated; JetBrains now produces the stand-alone RustRover IDE instead, which is currently in EAP stage. My answer is for RustRover, but I'm fairly certain that it applies to the old plug-in, as well.)

Reverberatory answered 21/11, 2023 at 4:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.