本文档记录了在WSL Ubuntu 22.04上搭建Rust Nightly开发环境的完整过程,包括对RISC-V目标的支持。

1. 安装基础开发工具

首先,我们需要安装一系列基础开发工具:

sudo apt install -y build-essential autoconf automake gcc g++ libmpc-dev libmpfr-dev libgmp-dev libglib2.0-dev make cmake gawk bison flex texinfo libtool patchutils bc python3 cmake wget xz-utils curl vim

2. 安装Rust和Cargo

使用官方安装脚本安装Rust版本管理器rustup和Rust包管理器cargo

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装完成后,应用环境变量设置到当前终端:

source "$HOME/.cargo/env"

3. 安装Rust Nightly版本

检查当前Rust版本:

rustc --version

安装nightly版本并设置为默认:

rustup install nightly
rustup default nightly

再次检查版本,确认使用的是nightly版本:

rustc --version
# 输出应类似于:rustc 1.89.0-nightly (414482f6a 2025-05-13)

4. 安装RISC-V目标支持和相关组件

# 安装RISC-V目标支持
rustup target add riscv64gc-unknown-none-elf

# 安装cargo-binutils工具
cargo install cargo-binutils --vers=0.3.3

# 安装其他必要组件
rustup component add llvm-tools-preview
rustup component add rust-src

5. 验证Rust环境

5.1 创建和测试普通Rust项目

创建一个新的Rust项目并测试:

# 创建新项目
cargo new hello_rust
cd hello_rust

# 查看项目结构
ls -la

# 查看源代码
cat src/main.rs

# 编译并运行
cargo run
# 输出:Hello, world!

5.2 测试RISC-V目标支持

创建一个针对RISC-V目标的库项目:

# 回到上级目录
cd ..

# 创建库项目
cargo new --lib hello_riscv
cd hello_riscv

# 配置Cargo.toml
echo '[lib]
name = "hello_riscv"
crate-type = ["staticlib"]

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"' >> Cargo.toml

创建适用于裸机环境的源代码:

# 使用编辑器创建源文件
nano src/lib.rs

在编辑器中输入以下内容:

#![no_std]

// 需要添加panic处理器
#[panic_handler]
fn panic(_panic: &core::panic::PanicInfo<'_>) -> ! {
    loop {}
}

#[unsafe(no_mangle)]
pub extern "C" fn hello() -> i32 {
    42
}

编译为RISC-V目标:

cargo build --target riscv64gc-unknown-none-elf

如果编译成功,说明Rust环境已正确配置,且RISC-V目标支持正常工作。

6. 配置注意事项

  1. 如果您需要加速Cargo下载依赖的速度,可以配置Cargo镜像源:
mkdir -p ~/.cargo
echo '[source.crates-io]
replace-with = "tuna"

[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"' > ~/.cargo/config
  1. 如果您使用NAT网络或代理(如Clash),您可能不需要配置镜像源,因为官方源的访问速度已经足够快。

后续步骤

完成Rust环境搭建后,接下来需要安装QEMU模拟器,以支持运行RISC-V代码。QEMU的安装过程包括下载源码、编译和配置环境变量,这将在另一篇文档中详细说明。