74个版本 (破坏性更新)
0.75.0 | 2024年6月2日 |
---|---|
0.72.0 | 2024年3月13日 |
0.69.0 | 2023年12月4日 |
0.68.0 | 2023年10月28日 |
0.19.0 | 2019年11月11日 |
在图像类别中排名196
每月下载量55,770
在52个crate中使用(直接使用2个)
2MB
56K SLoC
Skia Bindings
这是一个skia-safe的支持包,它提供了对Skia图形库的安全Rust绑定的支持。
组织结构
该包包含三个组件。
- 首先,在
build.rs
和build_support/
中为Skia提供了完整的配置和构建支持。 - 额外的C语言绑定,以帮助bindgen处理它遇到的问题或解决链接器错误。这些是
src/bindings.cpp
和src/shaper.cpp
。 - 以及一些用于下载预构建二进制文件的功能。
Skia构建支持
构建Skia相当特别,需要在目标平台上有许多先决条件,并且配置正确。
要配置和构建Skia,build_support/skia.rs
执行了所有艰苦的工作:它从谷歌的仓库中拉取 depot_tools/
和 skia/
,并通过执行 skia/tools/git-sync-deps
使用Python来获取许多额外的依赖项。之后,它使用谷歌的 GN 工具配置Skia,并最终通过将控制权交给 ninja
可执行文件(来自 depot_tools/
包)来构建它。
绑定生成
文件 src/*.cpp
包含Rust需要与Skia代码库交互的C++代码。这些文件由 Rust的绑定生成器 处理,该生成器使用libclang进行布局计算,并也由 clang 编译。
如果两个步骤都进行得很顺利,生成的Rust绑定代码将写入 OUT_DIR/skia/bindings.rs
,并且 skia-bindings
库将在输出目录中找到。
调试构建
默认情况下,出于性能原因,即使cargo创建调试输出,Skia也以发布模式构建。只有通过明确设置环境变量 SKIA_DEBUG=1
,才能启用Skia的调试构建。
预构建的二进制文件
由于构建Skia和创建绑定很慢,并且依赖于许多位于Rust生态系统之外组件,我们决定尝试使用预构建的二进制文件。
每当从我们的CI服务器上的 release
分支构建新的 rust-skia
版本时,生成的Skia库、skia-bindings
库和 bindings.rs
都会被压缩并上传到 skia-binaries 仓库 的发布标签页。
当构建脚本检测到 skia-bindings
是在crate内部构建的,并且有一个与仓库的哈希值、平台和功能匹配的预构建存档可用时,它会下载该包,解压缩它,并跳过Skia和绑定的完整构建步骤。
离线环境中的预构建二进制文件
一些用户可能没有稳定的互联网连接,或者是在离线环境中构建 skia-bindings
。您可以在有互联网连接的环境中,从 skia-binaries 仓库 手动下载二进制文件。
要在离线构建中使用这些二进制文件,必须设置环境变量 SKIA_BINARIES_URL
。此环境变量必须指向包含二进制的 tar.gz
文件,前面加上 file://
。
export SKIA_BINARIES_URL='file://path/to/skia-binaries.tar.gz'
更改用作 ninja
和 gn
的可执行文件
在某些系统上,捆绑的 ninja
和 gn
可执行文件可能不起作用(如NixOS上那样)。为了解决这个问题,可以使用以下环境变量设置使用的可执行文件
变量 | 描述 | 默认值 |
---|---|---|
SKIA_NINJA_COMMAND |
要运行的 ninja 命令。它可以是命令名或绝对路径。 |
ninja 默认,Windows上的 ninja.exe |
SKIA_GN_COMMAND |
要运行的 gn 命令。它可以是命令名或以Skia源目录为起点的路径。 |
bin/gn |
更改Skia源目录
在某些情况下,可能需要提供替代的Skia源目录。这可以通过设置SKIA_SOURCE_DIR
来实现,它必须是包含所有依赖项的Skia源目录的绝对路径。
使用系统库
默认情况下,Skia自身之外还构建了众多依赖库。如果不想这样做(比如,如果包正在作为构建过程的构建部分构建),可以通过设置环境变量SKIA_USE_SYSTEM_LIBRARIES
来禁用此行为。
此外,这里有一个例外。默认情况下,FreeType只嵌入在Android平台上。FreeType。如果您的平台不支持更新的FreeType版本,则必须使用特性embed-freetype
构建skia-bindings。
构建自定义
除了可以在将包作为cargo依赖项添加时直接指定的gl
、vulkan
、metal
和textlayout
功能之外,Skia的构建还可以通过在build.rs
中调整在build_support/skia.rs
中定义的两个结构体之一来进一步自定义。
构建配置
此结构体表示skia-bindings
的最高级构建配置,并包含多个单个功能标志。
最终构建配置
FinalBuildConfiguration
是从BuildConfiguration
创建的,它包含GN用于参数化Skia构建和用于创建src/bindings.rs
文件和skia-bindings
库的预处理定义所用的键值对。
为Linux交叉编译
在Linux上为不同的架构交叉编译Skia和Rust绑定是可能的。设置以下环境变量,然后使用所需的--target triple调用cargo
CLANGCC
:调用clang交叉编译所需目标架构C代码的命令行。此命令行可能包括--target=<triple>
选项。CLANGCXX
:调用clang交叉编译所需目标架构C++代码的命令行。此命令行可能包括--target=<triple>
选项。SDKTARGETSYSROOT
:目标sysroot的路径。- 或者
CC
/CXX
提供交叉编译的命令行(clang不是必需的)和HOST_CC
提供为宿主机构建的命令行。CC_<target>
/CXX_<target>
提供交叉编译的命令行(clang不是必需的)。
在使用Yocto SDK进行交叉编译时,通过源environment-setup-*
脚本进入Yocto SDK环境时,将设置所有上述环境变量,并将CC
/CXX
设置为交叉编译。这意味着还需要设置HOST_CC
,通常将其设置为仅gcc
即可。
为了将您的Rust应用程序链接,您可能还需要指导cargo使用正确的链接器,并在sysroot中查找本地库依赖项(例如Skia的FreeType依赖项)。这可以通过一个.cargo/config
文件或通过环境变量来完成。例如,如果您的Rust目标平台是aarch64-unknown-linux-gnu
,并且您的Yocto SDK目标为aarch64-poky-linux
。
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-poky-linux-g++
RUSTFLAGS="-Clink-args=--sysroot=$SDKTARGETSYSROOT"
依赖项
~0–4MB
~72K SLoC