04月09, 2017

编译 Chrome V8 引擎

我们知道 V8 是驱动 chrome 和 nodejs 的强力引擎。想自己编译一个 V8 的理由是想在本地搭建一个 js 的命令行 runtime,方便我在 codeforce 上用 js 做题,并且也为未来能在 OJ 上支持 js 做一些准备。

早在半年前,我就尝试在 macOS 上编译 V8,但是没有成功。原因很复杂,关键在于彼时 V8 团队正在采用 GN 替代 GYP,网上现有的资料大多为 GYP 的。由于对工具链的陌生,我在配置 proxy 的时候产生了很多问题,也找不到相同的案例和解决方案。

由于不希望再在网络环境上浪费时间,这次我是在我韩国的 ubuntu 服务器上进行下载和编译的。韩国的网络可以称霸全球,尤其是在我进行 gclient sync 操作的时候,命令行界面一度进入了无反应阶段,等待了一两分钟,在我的耐心还没有失去的时候,界面跳出成功的指示。此时我才惊讶地发现,在这一两分钟里,它居然已经下好了 1G 多了 V8 源码。

于是我们着手开始编译。大体上,我们可以以 google 的官方教程为指导,这篇知乎专栏也讲解了流程。

关键步骤如下

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=`pwd`/depot_tools:"$PATH"
gclient sync
fetch v8
cd v8
tools/dev/v8gen.py x64.release
ninja -C out.gn/x64.release

在流程中,我们要注意每一条命令的输出是否有误。我在tools/dev/v8gen.py x64.release 这一步时出现了错误,用 -vv 参数输出详细的报告,并在网上搜索相似的案例,发现在 github 一个 issue 中有人提及这个错误可能是系统上没有安装 pkg-config 导致的,安装后解决。

遇到罕见的问题要耐心查文档,梳理逻辑。比如关于 GN,在这里有详细的相关文档。如果能读懂代码,也可以直接去看相关的出错代码。

V8 编译成功后,我们就可以使用其命令行工具 d8 编译 JS 代码了。

本文链接:https://sxing.xyz/post/v8-build.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。