Rust: Difference between revisions
imported>TenTypekMatus m Add some fixes, notably with devenv.sh |
Console4852 (talk | contribs) Remove Rust Nightlies section. This section had no information that wasn't found on the rest of the page (only having two bullet points referring to other sections of the page). Instead, modify the page to elaborate more in the respective sections. |
||
(3 intermediate revisions by 3 users not shown) | |||
Line 30: | Line 30: | ||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
{ pkgs ? import <nixpkgs> {} }: | { pkgs ? import <nixpkgs> {} }: | ||
let | |||
overrides = (builtins.fromTOML (builtins.readFile ./rust-toolchain.toml)); | |||
libPath = with pkgs; lib.makeLibraryPath [ | |||
# load external libraries that you need in your rust project here | |||
]; | |||
in | |||
pkgs.mkShell rec { | pkgs.mkShell rec { | ||
buildInputs = with pkgs; [ | buildInputs = with pkgs; [ | ||
Line 37: | Line 43: | ||
rustup | rustup | ||
]; | ]; | ||
RUSTC_VERSION = | RUSTC_VERSION = overrides.toolchain.channel; | ||
# https://github.com/rust-lang/rust-bindgen#environment-variables | # https://github.com/rust-lang/rust-bindgen#environment-variables | ||
LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ]; | LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ]; | ||
Line 48: | Line 54: | ||
# add libraries here (e.g. pkgs.libvmi) | # add libraries here (e.g. pkgs.libvmi) | ||
]); | ]); | ||
LD_LIBRARY_PATH = libPath; | |||
# Add glibc, clang, glib, and other headers to bindgen search path | # Add glibc, clang, glib, and other headers to bindgen search path | ||
BINDGEN_EXTRA_CLANG_ARGS = | BINDGEN_EXTRA_CLANG_ARGS = | ||
# Includes normal include path | # Includes normal include path | ||
(builtins.map (a: ''-I"${a}/include"'') [ | (builtins.map (a: ''-I"${a}/include"'') [ | ||
# add dev libraries here (e.g. pkgs.libvmi.dev) | # add dev libraries here (e.g. pkgs.libvmi.dev) | ||
pkgs.glibc.dev | pkgs.glibc.dev | ||
]) | ]) | ||
# Includes with special directory paths | # Includes with special directory paths | ||
Line 61: | Line 68: | ||
''-I${pkgs.glib.out}/lib/glib-2.0/include/'' | ''-I${pkgs.glib.out}/lib/glib-2.0/include/'' | ||
]; | ]; | ||
} | } | ||
</syntaxHighlight> | </syntaxHighlight> | ||
It's important to have a file named <code>rust-toolchain</code> lying in the same directory as the shell.nix. | It's important to have a file named <code>rust-toolchain.toml</code> lying in the same directory as the shell.nix. | ||
Rust already has a standardized way of pinning a toolchain version for a workspace or a project. | |||
< | See [https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file the Rustup book] for its syntax. | ||
nightly- | A minimal example of the <code>rust-toolchain.toml</code>: | ||
</ | <syntaxhighlight lang="toml"> | ||
[toolchain] | |||
channel = "stable" # This can also be "nightly" if you want a nightly rust | |||
# or nightly-20XX-XX-XX for a specific nightly. | |||
</syntaxhighlight> | |||
The important part is that this also works with complex setups using bindgen and precompiled C libraries. To add a new C library in the search path of bindgen and rustc edit the variables <code>BINDGEN_EXTRA_CLANG_ARGS</code> and <code>RUSTFLAGS</code> | The important part is that this also works with complex setups using bindgen and precompiled C libraries. To add a new C library in the search path of bindgen and rustc edit the variables <code>BINDGEN_EXTRA_CLANG_ARGS</code> and <code>RUSTFLAGS</code> | ||
Line 90: | Line 100: | ||
# https://github.com/cachix/devenv/blob/main/examples/rust/devenv.nix and <code>devenv shell</code> | # https://github.com/cachix/devenv/blob/main/examples/rust/devenv.nix and <code>devenv shell</code> | ||
== Developing Rust projects using Nix == | == Developing Rust projects using Nix == | ||
Line 241: | Line 246: | ||
You can use the [https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector arrterian.nix-env-selector] extension to enable your nix-shell inside VSCode and have these settings picked up by other extensions. | You can use the [https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector arrterian.nix-env-selector] extension to enable your nix-shell inside VSCode and have these settings picked up by other extensions. | ||
== FAQ == | == FAQ == | ||
Line 291: | Line 270: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
Note that you need to use a <code>nix-shell</code> environment. Installing the Nix packages <code>openssl</code> or <code>sqlite</code> globally under <code>systemPackages</code> in NixOS or in <code>nix-env</code> [ | Note that you need to use a <code>nix-shell</code> environment. Installing the Nix packages <code>openssl</code> or <code>sqlite</code> globally under <code>systemPackages</code> in NixOS or in <code>nix-env</code> [[FAQ/I installed a library but my compiler is not finding it. Why? | is discouraged]] and doesn't always work (<code>pkg-config</code> may not be able to locate the libraries). | ||
=== Building with a different Rust version than the one in Nixpkgs === | === Building with a different Rust version than the one in Nixpkgs === | ||
The following uses the [https://github.com/nix-community/fenix fenix] overlay and <code>makeRustPlatform</code> to build a crate with Rust | The following uses the [https://github.com/nix-community/fenix fenix] overlay and <code>makeRustPlatform</code> to build a crate with Rust Nightly: | ||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> |