Table of Contents
Rust install from tar.gz
- Unpack rust-1.XX.X-<arch>-unknown-linux-gnu.tar.gz (after checking gpg signature)
- Run install.sh –prefix=/usr/local/rust –disable-ldconfig (for minimal install –components=rustc,rust-std-armv7-unknown-linux-gnueabihf,cargo)
- Make symlinks in /usr/local/bin (if not done previously - maybe avoid rls as emacs defaults to that instead of rust-analyzer)
- Create /etc/ld.so.conf.d/rust.conf contents: /usr/local/rust/lib
- Run ldconfig
- Unpack rustc-1.XX.X-src.tar.gz (after checking gpg signature)
- mkdir -p /usr/local/rust/lib/rustlib/src/rust
- cp -dR –preserve=timestamps rustc-1.XX.X-src/library/ /usr/local/rust/lib/rustlib/src/rust/
Script to update after verifying GPG signatures
#!/bin/sh # Update to rust release by downloading and verifying GPG keys set -u if [ $# -ne 1 ]; then echo "Usage: $0 <version>" echo "Example: $0 1.67.1" exit 1 fi TMPDIR_BASE=/tmp RUST_VERSION=$1 TARGET="x86_64-unknown-linux-gnu" RUST_REPO="https://static.rust-lang.org/dist" RUST_FILE="rust-${RUST_VERSION}-${TARGET}.tar.xz" RUSTC_FILE="rustc-${RUST_VERSION}-src.tar.xz" ARMV7HF_EXT="armv7-unknown-linux-gnueabihf" MUSL_EXT="x86_64-unknown-linux-musl" WASM_EXT="wasm32-unknown-unknown" WINX64_EXT="x86_64-pc-windows-gnu" #EXTENSIONS="$ARMV7HF_EXT $MUSL_EXT $WASM_EXT $WINX64_EXT" EXTENSIONS="" create_rust_pgp_key_file() { echo | base64 -d > rust.key <<EOF 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 EOF } download_if_missing () { local filename=$1 local dest=$2 if [ -f $TMPDIR_BASE/$filename ]; then mv $TMPDIR_BASE/$filename $dest else wget -c $RUST_REPO/$filename fi } tmpdir=$( mktemp -d $TMPDIR_BASE/rust-update-tmp.XXXXXXXXXX ) cd $tmpdir download_if_missing $RUST_FILE $tmpdir download_if_missing $RUST_FILE.asc $tmpdir download_if_missing $RUSTC_FILE $tmpdir download_if_missing $RUSTC_FILE.asc $tmpdir for ext in $EXTENSIONS; do tarfile="rust-std-${RUST_VERSION}-$ext.tar.xz" download_if_missing $tarfile $tmpdir download_if_missing $tarfile.asc $tmpdir done create_rust_pgp_key_file gpgv --keyring ./rust.key $RUST_FILE.asc $RUST_FILE || exit 2 gpgv --keyring ./rust.key $RUSTC_FILE.asc $RUSTC_FILE || exit 3 exitcode=10 for ext in $EXTENSIONS; do tarfile="rust-std-${RUST_VERSION}-$ext.tar.xz" gpgv --keyring ./rust.key $tarfile.asc $tarfile || exit $exitcode exitcode=$((exitcode + 1)) done # Remove previously installed rustlibs find /usr/local/rust/lib/rustlib -depth -mindepth 1 -maxdepth 1 -type d \! -name $TARGET \! -name 'etc' \! -name 'src' | xargs --no-run-if-empty rm -r tar xaf $RUST_FILE cd rust-${RUST_VERSION}-${TARGET} ./install.sh --prefix=/usr/local/rust cd .. rm -rf rust-${RUST_VERSION}-${TARGET} tar xaf $RUSTC_FILE cd rustc-${RUST_VERSION}-src rm -rf /usr/local/rust/lib/rustlib/src/rust/library mkdir -p /usr/local/rust/lib/rustlib/src/rust cp -dR --preserve=timestamps library /usr/local/rust/lib/rustlib/src/rust/ cd .. for ext in $EXTENSIONS; do tarfile="rust-std-${RUST_VERSION}-$ext.tar.xz" tar xaf $tarfile cd rust-std-${RUST_VERSION}-$ext rm -rf "/usr/local/rust/lib/rustlib/$ext" cp -dR --preserve=timestamps "rust-std-$ext/lib/rustlib/$ext" /usr/local/rust/lib/rustlib/ cd .. done read -p "Keep the downloaded archives? (y/N) " keep_archives if [ ${keep_archives}X = "yX" -o ${keep_archives}X = "YX" ]; then mv $tmpdir/$RUST_FILE $TMPDIR_BASE mv $tmpdir/$RUST_FILE.asc $TMPDIR_BASE mv $tmpdir/$RUSTC_FILE $TMPDIR_BASE mv $tmpdir/$RUSTC_FILE.asc $TMPDIR_BASE for ext in $EXTENSIONS; do tarfile="rust-std-${RUST_VERSION}-$ext.tar.xz" mv $tmpdir/$tarfile $TMPDIR_BASE mv $tmpdir/$tarfile.asc $TMPDIR_BASE done fi rm -rf $tmpdir
Add WASM support
Found good info here Non-rustup setups
$ wget https://static.rust-lang.org/dist/rust-std-1.66.0-wasm32-unknown-unknown.tar.xz $ wget https://static.rust-lang.org/dist/rust-std-1.66.0-wasm32-unknown-unknown.tar.xz.asc $ gpg --verify rust-std-1.66.0-wasm32-unknown-unknown.tar.xz.asc $ tar xvaf rust-std-1.66.0-wasm32-unknown-unknown.tar.xz $ rustc --print sysroot /usr/local/rust # cd rust-std-1.66.0-wasm32-unknown-unknown/ # cp --preserve=timestamps -R rust-std-wasm32-unknown-unknown/lib/rustlib/wasm32-unknown-unknown/ /usr/local/rust/lib/rustlib/
Compiling Rust code with MSVC
- Start Rust 1.63 (MSVC) Shell for 32-bit or 64-bit
- Run the following command to setup the MSVC environment
32-bit
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars32.bat"
64-bit
"C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
Cross compiling for ARMv7
Make sure to have the necessary external libraries available if needed. Example with librrd (and its dependencies)
# Needs librrd-dev:armhf for the last linking step #Desired=Unknown/Install/Remove/Purge/Hold #| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend #|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) #||/ Name Version Architecture Description #+++-================-============-============-========================================================= #ii librrd-dev:armhf 1.7.2-3+b7 armhf time-series data storage and display system (development)
Then to compile for armv7-unknown-linux-gnueabihf
cargo build -r --target armv7-unknown-linux-gnueabihf --config target.armv7-unknown-linux-gnueabihf.linker=\"arm-linux-gnueabihf-gcc\"
Rust error handling
Use #[non_exhaustive] for error enums to avoid API breaks when just adding a new type of error.
Using C libraries
Wrapping Unsafe C Libraries in Rust (1/2)
Wrapping Unsafe C Libraries in Rust (2/2)
Tutorial: Generating bzip2 bindings with bindgen at cargo build time in build.rs
Rust guides
Rust memory
Perf and Rust
From Guide to Rustc Development The basic perf command is this:
perf record -F99 --call-graph dwarf XXX
The -F99 tells perf to sample at 99 Hz, which avoids generating too much data for longer runs (why 99 Hz you ask? It is often chosen because it is unlikely to be in lockstep with other periodic activity). The –call-graph dwarf tells perf to get call-graph information from debuginfo, which is accurate. The XXX is the command you want to profile.
Find unused source files
rustc --emit=dep-info src/main.rs 2> /dev/null; for file in $(find src/ -name '*.rs'); do grep -q -E "^${file}:$" main.d || echo "$file"; done; rm main.d
User cargo config
~/.cargo/config.toml
[registries.crates-io] protocol = "sparse" [target.x86_64-unknown-linux-gnu] # linker = "clang" # rustflags = ["-C", "link-arg=-fuse-ld=/usr/bin/mold"] rustflags = ["-C", "link-arg=-fuse-ld=mold"] [profile.profiling] inherits = "release" debug = true
To build release with debug info: cargo build –profile profiling