4个版本
0.1.3 | 2022年11月5日 |
---|---|
0.1.2 | 2022年10月22日 |
0.1.1 | 2022年10月17日 |
0.1.0 | 2022年10月7日 |
#5 in #flipper-zero
4KB
Flipper Zero的Rust API
🦀 ❤️🔥 🐬
项目结构
此项目由以下crate组成
-
flipper0-sys
: CFFI绑定。 -
flipper0
: 高级、类似std类型的绑定和包装器。 -
其他支持crate,请参阅内部文档
- flipper0-build-cfg: 构建系统的常量和配置
- flipper0-fam-build: Manifest生成器
- flipper0-fap-build: 应用程序包构建工具
- fam: Flipper应用程序包manifest格式
- flipper0-macro: 用于注册和rustify入口点函数的Proc-macro
#[main]
Flipper Zero绑定
为Flipper Zero Fw自动生成的绑定(或“externs”),作为上层抽象层的少量手动封装和添加。
状态
当前项目状态为WiP。 高度混乱的进行中。任何贡献都受欢迎,你知道的。
构建
有三个选项:使用预构建绑定、从现有的flipper-firmware仓库克隆并构建、克隆源代码并构建。
使用预构建绑定
所需
- Rust工具链(
nightly
通道) - 目标
thumbv7em-none-eabihf
libclang
for bindgen(因为bindgen作为构建依赖项不能是可选的)
示例
crate清单
[dependencies]
flipper0-sys = "*"
lib.rs
#![crate_type = "staticlib"] #![no_main] #![no_std]
extern crate flipper0_sys;
use flipper0_sys::ffi::*;
#[no_mangle]
pub unsafe extern "C" fn init(_: *mut u8) -> i32 {
static MESSAGE: &[u8] = b"Hello, World!";
furi_thread_stdout_write(MESSAGE.as_ptr() as _, MESSAGE.len());
0
}
使用 cargo +nightly build --target=thumbv7em-none-eabihf
构建。
从源代码构建绑定
所需
- Rust工具链(
nightly
通道) - 目标
thumbv7em-none-eabihf
libclang
用于 bindgen- 是 Flipper Zero 固件 的克隆
- 环境变量
FLIPPER_FW_SRC_PATH
指向 fw 仓库的根目录
- 环境变量
- ARM 工具链,运行
fbt
以轻松获取
crate清单
[dependencies.flipper0-sys]
version = "*"
default-features = false # disable prebuild
features = [
"allocator-global",
"oom-global",
"panic",
"use-local-sdk" # enable build from source
# ...
]
示例代码与上面相同。
使用以下命令构建:FLIPPER_FW_SRC_PATH=~/path/to/flipperzero-firmware/ cargo +nightly build --target=thumbv7em-none-eabihf
还可以查看 示例 的说明。
使用自动克隆远程仓库从源代码构建绑定
所需
- Rust工具链(
nightly
通道) - 目标
thumbv7em-none-eabihf
libclang
用于 bindgen- 环境变量
FLIPPER_REPO_BRANCH
包含固件仓库分支的名称(可选) - 环境变量
FLIPPER_REPO_REV
包含固件仓库的标签/修订版本名称(可选) - 环境变量
FLIPPER_REPO_CLONE_PATH
指向克隆应放置的目录(可选)
示例代码与上面相同,但使用 use-remote-sdk
而不是 use-local-sdk
。
crate清单
[dependencies.flipper0-sys]
version = "*"
default-features = false # disable prebuild
features = [
# same as above
"use-remote-sdk" # enable build from source
]
在指定位置构建
FLIPPER_REPO_CLONE_PATH=/abs/path/ \
cargo +nightly build --target=thumbv7em-none-eabihf
并且/或者指定分支
FLIPPER_REPO_BRANCH=release \
cargo +nightly build --target=thumbv7em-none-eabihf
并且/或者指定标签或修订版本
FLIPPER_REPO_REV="0.70.1" \
cargo +nightly build --target=thumbv7em-none-eabihf
注意
FLIPPER_REPO_CLONE_PATH
被用于代替FLIPPER_FW_SRC_PATH
- 默认情况下,
FLIPPER_REPO_CLONE_PATH
指向$OUT_DIR/sdk
- 如果没有指定分支或修订版本,将检出默认分支的头部。
构建配置
环境变量
特性 | 必需 | 描述 | 与特性一起使用 |
---|---|---|---|
FLIPPER_FW_SRC_PATH |
必需 | 在本地工作副本的 固件仓库 中构建源代码时需要,指向仓库的根目录。 | use-local-sdk |
ARM_TOOLCHAIN |
可选 | 如果省略,构建脚本将在 固件仓库 的工作副本中搜索它。通常应指向 "arm-none-eabi" 目录。 | use-local-sdk ,use-remote-sdk |
FLIPPER_REPO_REV |
可选 | 修订版本或标签。 | use-remote-sdk |
FLIPPER_REPO_BRANCH |
可选 | 分支名称。 | use-remote-sdk |
FLIPPER_REPO_CLONE_PATH |
可选 | 路径指向 SDK 仓库将被克隆的目录。默认为 OUT_DIR/flipperzero-firmware 。 |
use-remote-sdk |
特性
allocator
:包含分配器实现allocator-global
:默认,包含 全局分配器 实现oom-global
:默认,内存不足处理程序。禁用它以使用您自定义的处理程序或#![feature(default_alloc_error_handler)]
。panic
:默认,包含全局panic和OoM处理器宏
:包含用于FAP入口点的#[main]
宏。
绑定生成定制功能
可用于与use-local-sdk
或use-remote-sdk
功能一起使用。
derive-default
derive-eq
derive-copy
derive-hash
derive-ord
derive-partialeq
derive-partialord
derive-debug
- 派生Debug
,默认在调试配置中启用
所有这些derive-
功能都用于bindgen配置。
构建方法功能
特性 | 默认 | 描述 | 使用环境变量 |
---|---|---|---|
prebuild |
+ | 使用预生成的绑定 | |
use-local-sdk |
+ | 查看FLIPPER_FW_SRC_PATH ,从源代码构建 |
FLIPPER_FW_SRC_PATH (必需),ARM_TOOLCHAIN (可选) |
use-remote-sdk |
- | 克隆远程git仓库,使用fbt进行初始设置,然后从源代码构建。 | FLIPPER_REPO_REV ,FLIPPER_REPO_BRANCH ,FLIPPER_REPO_CLONE_PATH ,ARM_TOOLCHAIN (所有变量均为可选) |
prebuild
是默认功能,仅用于构建crate的能力。
其他对开发有用的文档