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 中使用

MIT 许可证

30MB
666K SLoC

C++ 617K SLoC // 0.1% comments Python 24K SLoC // 0.3% comments C 16K SLoC // 0.2% comments Rust 7K SLoC // 0.0% comments Shell 3K SLoC // 0.2% comments Bitbake 158 SLoC WebAssembly 109 SLoC Batch 34 SLoC // 0.3% comments GNU Style Assembly 22 SLoC // 0.3% comments Objective-C++ 6 SLoC // 0.6% comments

包含 (ELF 可执行文件/库, 115KB) eu-strip

Rusty V8 绑定

V8 版本: 8.2.308, 2020-03-12

ci crates docs

目标

  1. 提供与 V8 的 C++ API 高质量绑定的 Rust。API 应尽可能与原始 API 相匹配

  2. 不引入额外的调用开销。(例如,之前尝试 Rust V8 绑定的尝试强制使用持久句柄。)

  3. 不依赖于在 cargo 外部构建的二进制 libv8.a。V8 是一个非常大的项目(超过 600,000 行 C++ 代码),通常需要 30 分钟才能编译。此外,V8 依赖于 Chromium 的专用构建系统(gn + ninja),这在外部使用并不容易。因此,许多尝试绑定到 V8 的尝试都依赖于与绑定本身分开构建的预构建的二进制文件。虽然这很简单,但它使得升级 V8 很困难,它使得 CI 很困难,它使得产生不同配置的构建很困难,并且由于二进制块可以隐藏恶意代码,它是一个安全问题。因此,我们认为在 "cargo build" 期间从源代码构建 V8 是至关重要的。

  4. 在 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 位目标。

构建依赖于几个二进制工具: gnninja 以及一个较新的 clang 版本(V8 依赖于前沿特性)。因为这些工具通常不可用,它们默认会在构建过程中自动下载。可以通过指定 $GN$NINJA 环境变量来选择不下载 gn 和 ninja。可以通过提供指向一个最新的 llvm/clang 安装的 $CLANG_BASE_PATH 环境变量来跳过 clang 的下载(目前为 LLVM v8.0+ 或 Apple clang v11.0+)。您还可以通过设置 $GN_ARGS 环境变量来向 gn 传递额外的参数。

从源代码构建时使用的环境变量:SCCACHEGNNINJACLANG_BASE_PATHGN_ARGS

常见问题解答

构建 V8 超过 30 分钟,这对使用此 crate 来说太慢了。我该怎么办?

安装 sccache。我们的构建脚本将检测并使用 sccache。如果它不在您的路径中,请设置 $SCCACHE 环境变量。

所有这些随机的目录,比如 buildbuildtools,这些都是必需的吗?

为了从源代码构建 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"

依赖项