User Tools

Site Tools


general:rust

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.

https://www.youtube.com/watch?v=rAF8mLI0naQ&t=1355s

Using C libraries

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

general/rust.txt · Last modified: 2024/10/30 15:09 by sunkan

Donate Powered by PHP Valid HTML5 Valid CSS Run on Debian Driven by DokuWiki