Rust: Difference between revisions
imported>Mic92 add ways of building rust packages. |
imported>Luis-Hebendanz No edit summary |
||
Line 51: | Line 51: | ||
== Installation via rustup == | == Installation via rustup == | ||
The rustup tool is maintained by the rust community and offers and interface to install and switch between rust toolchains. In this scenario, rustup handles the "package management" of rust toolchains and places them in <code>$PATH</code>. Nixpkgs offers rustup via the <code>rustup</code> derivation. More info on using rustup can be found on their official website: https://rustup.rs/. | The rustup tool is maintained by the rust community and offers and interface to install and switch between rust toolchains. In this scenario, rustup handles the "package management" of rust toolchains and places them in <code>$PATH</code>. Nixpkgs offers rustup via the <code>rustup</code> derivation. More info on using rustup can be found on their official website: https://rustup.rs/. | ||
If you want to have the most "normal" rust experience I recommend using rustup with the following example shell.nix: | |||
<syntaxHighlight lang="nix"> | |||
{ pkgs ? import <nixpkgs> {} }: | |||
pkgs.mkShell rec { | |||
buildInputs = with pkgs; [ | |||
llvmPackages_latest.llvm | |||
llvmPackages_latest.bintools | |||
zlib.out | |||
rustup | |||
xorriso | |||
grub2 | |||
qemu | |||
llvmPackages_latest.lld | |||
python3 | |||
]; | |||
RUSTC_VERSION = pkgs.lib.readFile ./rust-toolchain; | |||
# https://github.com/rust-lang/rust-bindgen#environment-variables | |||
LIBCLANG_PATH= pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ]; | |||
HISTFILE=toString ./.history; | |||
shellHook = '' | |||
export PATH=$PATH:~/.cargo/bin | |||
export PATH=$PATH:~/.rustup/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/ | |||
''; | |||
# Add libvmi precompiled library to rustc search path | |||
RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [ | |||
pkgs.libvmi | |||
]); | |||
# Add libvmi, glibc, clang, glib headers to bindgen search path | |||
BINDGEN_EXTRA_CLANG_ARGS = | |||
# Includes with normal include path | |||
(builtins.map (a: ''-I"${a}/include"'') [ | |||
pkgs.libvmi | |||
pkgs.glibc.dev | |||
]) | |||
# Includes with special directory paths | |||
++ [ | |||
''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${pkgs.llvmPackages_latest.libclang.version}/include"'' | |||
''-I"${pkgs.glib.dev}/include/glib-2.0"'' | |||
''-I${pkgs.glib.out}/lib/glib-2.0/include/'' | |||
]; | |||
} | |||
</syntaxHighlight> | |||
It's important to have a file named `rust-toolchain` lying in the same directory as the shell.nix. | |||
It's purpose is to pin the version of the used rust compiler. | |||
<syntaxHighlight lang="bash"> | |||
$ cat rust-toolchain | |||
nightly-2021-09-19 | |||
</syntaxHighlight> | |||
The imporant 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 `BINDGEN_EXTRA_CLANG_ARGS` and `RUSTFLAGS` | |||
== Unofficial overlays == | == Unofficial overlays == |