armv6k-nintendo-3ds
层级: 3
任天堂 3DS 平台,它拥有 Armv6k 处理器及其相关操作系统 (horizon
)。
对此目标平台的 Rust 支持与任天堂无关,也不是来自或使用任何官方任天堂 SDK。
目标维护者
此目标由 @rust3ds 组织的成员维护
要求
此目标是交叉编译的。不支持动态链接。
可以使用 build-std
构建 #![no_std]
的 crate,以构建 core
和可选的 alloc
,以及 panic_abort
或 panic_unwind
。
部分支持 std
,但大部分功能正常。某些 API 未实现,只会返回错误,例如 std::process
。默认情况下会提供一个分配器。
为了支持某些 API,二进制文件必须链接到为该目标编写的 libc
,并使用该目标的链接器。这些由 devkitARM 工具链提供。有关更多详细信息,请参阅 交叉编译工具链和 C 代码。
此外,一些辅助 crate 提供了 std
使用的一些 libc
函数的实现,这些函数可能缺失。要使用 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 的通用实用程序 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
工具支持将 3dslink
与 cargo 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-3ds
和 linker-fix-3ds
实现。