5 个版本 (稳定版)
3.10.4 | 2020年4月10日 |
---|---|
3.10.3 | 2020年4月6日 |
3.10.1 | 2020年4月4日 |
0.3.10 | 2020年4月4日 |
#5 in #ninja
在 rusty_v8_helper 中使用
30MB
666K SLoC
包含 (ELF 可执行文件/库, 115KB) eu-strip
Rusty V8 绑定
V8 版本: 8.2.308, 2020-03-12
目标
-
提供与 V8 的 C++ API 高质量绑定的 Rust。API 应尽可能与原始 API 相匹配
-
不引入额外的调用开销。(例如,之前尝试 Rust V8 绑定的尝试强制使用持久句柄。)
-
不依赖于在 cargo 外部构建的二进制
libv8.a
。V8 是一个非常大的项目(超过 600,000 行 C++ 代码),通常需要 30 分钟才能编译。此外,V8 依赖于 Chromium 的专用构建系统(gn + ninja),这在外部使用并不容易。因此,许多尝试绑定到 V8 的尝试都依赖于与绑定本身分开构建的预构建的二进制文件。虽然这很简单,但它使得升级 V8 很困难,它使得 CI 很困难,它使得产生不同配置的构建很困难,并且由于二进制块可以隐藏恶意代码,它是一个安全问题。因此,我们认为在 "cargo build" 期间从源代码构建 V8 是至关重要的。 -
在 crates.io 上发布 crate 并允许 docs.rs 生成文档。由于 V8 的构建复杂性和大小,这不是一个简单的过程。例如,crate 的大小必须保持在 10 MiB 以下才能发布。
二进制构建
V8 非常大,编译时间很长。许多用户将更喜欢使用 V8 的预构建版本。我们在 Github 上为 rusty v8 的每个版本发布静态库。
默认启用二进制构建:使用 cargo build
将从 Github 下载静态库。要禁用此构建,请使用 V8_FROM_SOURCE
环境变量。
在修改 rusty_v8 本身时,应通过从源代码构建进行测试。CI 总是从源代码构建。
从源代码构建 V8
使用 V8_FROM_SOURCE=1 cargo build -vv
从源代码完全构建 crate。
Python 2.7 的构建脚本,而不是 Python 3。 请不要向我们提出关于 Python 3 的问题;这是一个在 Chromium 中必须解决的复杂问题。。
对于 Linux 构建:需要安装 glib-2.0 开发文件,以便 pkg-config 能够找到它们。在 Ubuntu 上,运行 sudo apt install libglib2.0-dev
来安装它们。
对于 Windows 构建:需要使用 64 位工具链。不支持 32 位目标。
构建依赖于几个二进制工具: gn
、ninja
以及一个较新的 clang
版本(V8 依赖于前沿特性)。因为这些工具通常不可用,它们默认会在构建过程中自动下载。可以通过指定 $GN
和 $NINJA
环境变量来选择不下载 gn 和 ninja。可以通过提供指向一个最新的 llvm
/clang
安装的 $CLANG_BASE_PATH
环境变量来跳过 clang 的下载(目前为 LLVM v8.0+ 或 Apple clang v11.0+)。您还可以通过设置 $GN_ARGS
环境变量来向 gn
传递额外的参数。
从源代码构建时使用的环境变量:SCCACHE
、GN
、NINJA
、CLANG_BASE_PATH
、GN_ARGS
常见问题解答
构建 V8 超过 30 分钟,这对使用此 crate 来说太慢了。我该怎么办?
安装 sccache。我们的构建脚本将检测并使用 sccache。如果它不在您的路径中,请设置 $SCCACHE
环境变量。
所有这些随机的目录,比如 build
和 buildtools
,这些都是必需的吗?
为了从源代码构建 V8,我们必须提供一定的目录结构,其中包括来自 Chromium 的一些 git 子模块。我们欢迎对代码库进行任何简化,但我们已经找到了这个结构,这是在多次失败尝试后,在 cargo crate 和 GN/Ninja 的需求之间谨慎平衡的结果。
V8 有一个非常大的 API,有数百个方法。为什么你们不自动生成这个绑定代码?
在极限情况下,我们希望自动生成绑定。我们实际上已经多次开始走这条路,但由于 V8 API 的许多怪异特性,这并没有成功。因此,我们现在正在采取 brute-force 方法,首先专注于解决我们的目标。我们希望将来能自动生成绑定。
你们为什么要构建这个?
本文件旨在支持Deno项目。我们之前使用了一个简单的Rust绑定来调用V8,称为libdeno。但随着Deno的成熟,我们发现自己在Rust中不断需要访问越来越多的V8 API。
构建时出现未知参数:'-gno-inline-line-tables'
请在构建过程中使用以下命令:export GN_ARGS="no_inline_line_tables=false"