3个版本
0.4.6 |
|
---|---|
0.4.5 |
|
1370 在 数据结构 中
31MB
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
安装(目前为LLVM v8.0+或Apple clang v11.0+)的$CLANG_BASE_PATH
环境变量来跳过clang的下载。还可以通过设置$GN_ARGS
环境变量来向gn
传递额外的参数。
在从源代码构建时使用的环境变量:SCCACHE
、GN
、NINJA
、CLANG_BASE_PATH
、GN_ARGS
常见问题解答
构建V8需要超过30分钟,这对我来说太慢了。我应该怎么办?
安装sccache。我们的构建脚本将检测并使用sccache。如果sccache不在您的路径中,请设置$SCCACHE
环境变量。
这些随机目录,如build
和buildtools
,真的是必要的吗?
为了从源代码构建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"
。