3个版本

0.4.6 2020年5月27日
0.4.5 2020年5月27日

1370数据结构

MIT 许可证

31MB
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安装(目前为LLVM v8.0+或Apple clang v11.0+)的$CLANG_BASE_PATH环境变量来跳过clang的下载。还可以通过设置$GN_ARGS环境变量来向gn传递额外的参数。

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

常见问题解答

构建V8需要超过30分钟,这对我来说太慢了。我应该怎么办?

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

这些随机目录,如buildbuildtools,真的是必要的吗?

为了从源代码构建V8,我们必须提供一个具有一些来自Chromium的git子模块的特定目录结构。我们欢迎任何简化代码库的尝试,但我们已经找到了一个结构,经过多次失败尝试后,这个结构仔细平衡了cargo crates和GN/Ninja的要求。

V8有一个非常大的API,有数百个方法。为什么你们不自动生成这个绑定代码呢?

在极限情况下,我们希望自动生成绑定。实际上我们已经沿着这条路线开始了几次,但由于V8 API的许多异常特性,这并没有取得成功。因此,我们现在正在采取一种蛮力方法,首先专注于解决我们的既定目标。我们希望在未来能够自动生成绑定。

为什么你们要构建这个?

这是为了支持Deno项目。我们之前使用了一个简单的Rust高级绑定来V8,名为libdeno。但随着Deno的成熟,我们发现我们不断地需要通过Rust访问越来越多的V8 API。

在构建时,我得到一个未知参数:'-gno-inline-line-tables'。

在构建过程中使用 export GN_ARGS="no_inline_line_tables=false"

依赖关系