armv6k-nintendo-3ds
层级:3
Nintendo 3DS 平台,它拥有 ARMv6K 处理器,以及其关联的操作系统 (horizon
)。
此目标的 Rust 支持与任天堂无关,并且不源自也不与任何官方任天堂 SDK 一起使用。
目标维护者
此目标由 @rust3ds 组织的成员维护
要求
此目标是交叉编译的。不支持动态链接。
#![no_std]
箱子可以使用 build-std
来构建 core
和可选的 alloc
,以及 panic_abort
或 panic_unwind
。
std
部分支持,但大部分有效。一些 API 未实现,只会返回错误,例如 std::process
。默认情况下提供了一个分配器。
为了支持某些 API,二进制文件必须使用针对目标的链接器链接到为目标编写的 libc
。这些由 devkitARM 工具链提供。有关更多详细信息,请参阅 交叉编译工具链和 C 代码。
此外,一些辅助箱子提供了 libc
函数的一些实现,这些函数由 std
使用,否则可能缺失。这些,或相关函数的替代实现,是使用 std
所必需的。
pthread-3ds
为std::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 run
、cargo build
等的命令。cargo 3ds new
将自动设置一个新项目,其中包含构建简单二进制文件所需的依赖项。
您还可以构建启用了该目标的 Rust(请参阅上面的 构建目标)。
如 要求 中所述,使用 std
的程序必须链接到 devkitARM 工具链和提供 std
中使用的 libc
API 的库。有一个通用实用程序箱用于处理操作系统提供的非标准 API:ctru-rs
。将其添加到 Cargo.toml 以在您的程序中使用它
[dependencies]
ctru-rs = { git = "https://github.com/rust3ds/ctru-rs.git" }
依赖于 ctru-rs
可确保在链接时所有必要的符号都可用。
测试
为该目标构建的二进制文件可以在模拟器(最常见的是 Citra)中运行,或者使用 devkitARM 的 3dslink
等工具发送到设备。它们也可以简单地复制到 SD 卡中,然后插入设备。
构建 Rust 程序 中提到的 cargo-3ds
工具支持使用 cargo 3ds run
使用 3dslink
。默认的 Rust 测试运行器不受支持,但可以使用 自定义测试框架 与 cargo 3ds test
一起在设备上运行单元测试。
library/std
的 Rust 测试套件尚不支持。
交叉编译工具链和 C 代码
可以使用 devkitARM 工具链 为该目标构建 C 代码。此工具链提供 arm-none-eabi-gcc
作为链接器,用于链接 Rust 程序。
该工具链还提供了一个 libc
实现,std
的许多 API 都需要它,以及一个辅助库 libctru
,它被 要求 中列出的几个辅助箱子使用。但是,此工具链不包含 std
预期的所有 API,其余 API 由 pthread-3ds
和 linker-fix-3ds
实现。