armv6k-nintendo-3ds

层级: 3

任天堂 3DS 平台,它拥有 Armv6k 处理器及其相关操作系统 (horizon)。

对此目标平台的 Rust 支持与任天堂无关,也不是来自或使用任何官方任天堂 SDK。

目标维护者

此目标由 @rust3ds 组织的成员维护

要求

此目标是交叉编译的。不支持动态链接。

可以使用 build-std 构建 #![no_std] 的 crate,以构建 core 和可选的 alloc,以及 panic_abortpanic_unwind

部分支持 std,但大部分功能正常。某些 API 未实现,只会返回错误,例如 std::process。默认情况下会提供一个分配器。

为了支持某些 API,二进制文件必须链接到为该目标编写的 libc,并使用该目标的链接器。这些由 devkitARM 工具链提供。有关更多详细信息,请参阅 交叉编译工具链和 C 代码

此外,一些辅助 crate 提供了 std 使用的一些 libc 函数的实现,这些函数可能缺失。要使用 std,需要这些函数或相关函数的替代实现。

  • pthread-3dsstd::thread 提供 pthread API。
  • shim-3ds 补全了一些其他缺失的 libc API (例如 getrandom)。

为该目标构建的二进制文件应与 3DS(和 2DS)硬件和固件的所有变体兼容,但测试有限,某些版本可能无法正常工作。

此目标生成 ELF 格式的二进制文件。

构建目标

你可以通过将目标添加到 config.toml 中的 target 列表中并提供 devkitARM 工具链的路径来构建对该目标提供支持的 Rust。

[build]
build-stage = 1
target = ["armv6k-nintendo-3ds"]

[target.armv6k-nintendo-3ds]
cc = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"
cxx = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-g++"
ar = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ar"
ranlib = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ranlib"
linker = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"

此外,要为目标构建 compiler_builtins,请在构建 Rust 工具链之前导出这些标志

export CFLAGS_armv6k_nintendo_3ds="-mfloat-abi=hard -mtune=mpcore -mtp=soft -march=armv6k"

构建 Rust 程序

Rust 尚未为此目标发布预编译的工件。

构建二进制文件的推荐方法是使用 cargo-3ds 工具,该工具使用 build-std 并提供类似于常用 cargo runcargo build 等的命令。cargo 3ds new 将自动设置一个新项目,其中包含构建简单二进制文件所需的依赖项。

你还可以构建启用该目标的 Rust(请参阅上面的 构建目标)。

要求 中所述,使用 std 的程序必须链接到 devkitARM 工具链以及提供 std 中使用的 libc API 的库。有一个用于处理操作系统提供的非标准 API 的通用实用程序 crate:ctru-rs。将其添加到 Cargo.toml 以在你的程序中使用它

[dependencies]
ctru-rs = { git = "https://github.com/rust3ds/ctru-rs.git" }

依赖于 ctru-rs 可确保在链接时所有必要的符号都可用。

测试

为该目标构建的二进制文件可以在模拟器(最常见的是 Citra)中运行,或者通过使用 devkitARM 的 3dslink 之类的工具发送到设备。它们也可以简单地复制到 SD 卡中,以便插入设备。

构建 Rust 程序 中提到的 cargo-3ds 工具支持将 3dslinkcargo 3ds run 一起使用。不支持默认的 Rust 测试运行器,但 自定义测试框架 可以与 cargo 3ds test 一起使用,以便在设备上运行单元测试。

尚未支持 library/std 的 Rust 测试套件。

交叉编译工具链和 C 代码

可以使用 devkitARM 工具链为该目标构建 C 代码。此工具链提供 arm-none-eabi-gcc 作为用于链接 Rust 程序的链接器。

该工具链还提供了一个 libc 实现,std 的许多 API 都需要它,以及一个辅助库 libctru要求 中列出的几个辅助 crate 使用它。但是,此工具链不包括 std 期望的所有 API,其余 API 由 pthread-3dslinker-fix-3ds 实现。