Codelet Keep code simple stupid

构建V8

V8 简介

Google V8是一款高性能的开源JavaScript解释器,就像现实中的大排量V8发动机一样,V8强力的驱动着 Web技术的方方面面,从最初的Google Chrome浏览器,到Node.js,再到MongoDB,V8已成为许多项目的 重要组成部分。

就像所有的开源C/C++工程一样,构建是第一步,下面就记录一下V8的构建方法

环境

我是在Ubuntu 16.04下编译的,V8默认会自动下载clang,这里就不列出了编译器版本了

安装 depot_tools

V8所用的构建系统是GN,用于生成Ninja的构建文件,它的功能类似于CMake,用于跨平台多目标构建,GN 默认包含在depot_tools工具集中,因此需要先下载depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

下载好了之后,需要先执行一次gclient命令,用于初始化工具集,这一步十分重要,如果执行不成功, 工具集将是不完整的,会导致后续步骤的失败

安装 cipd_client

最麻烦的就是这一步了,cipd是depot_tools的一部分,但必须要联网下载,在执行gclient命令时, 会提示Bootstrapping cipd client失败,curl: (35) gnutls_handshake() failed: The TLS connection was non-properly terminated,原因是curl不能通过代理成功连接主机 chrome-infra-packages.appspot.com,导致cipd下载失败

折腾了很久,直到发现depot_tools/cipd脚本中的一段话

echo Alternately, manually download:
echo   "$URL"
echo To $CLIENT, and then re-run this command.
rm "${CIPD_CLIENT_TMP}"
exit 1

按照脚本的步骤,手动下载cipd,再次执行gclient,直到不再报错,此时depot_tools目录里应该 会多出一个.cipd_bin子目录,里面就是联网下载的工具

下载源码

最好使用depot_tools提供的fetch脚本检出V8源码,执行fetch v8即可,中途可能会因网络原因导致 检出失败,只需要执行gclient sync即可继续,当Syncing projects: 100% (23/23), done. 之后,就可以开始编译了

如果sync操作失败,提示________ running 'download_from_google_storage ...',并报错 Failed to fetch file gs:// ...,说明程序无法连接http://storage.googleapis.com, 一些工程相关的工具下载失败了,解决方法和之前一样,根据提示手动下载安装

编译

首先生成Ninja构建文件,执行tools/dev/v8gen.py gen x64.release,如果之前的操作没问题, 命令执行结束后,会生成一个out.gn/x64.release目录,里面的build.ninja就是主要构建文件, 相当于Makefile

执行ninja -C out.gn/x64.release开始编译,等待一段时间之后,目录下会多出生成的可执行文件

测试

找到目录下的d8可执行文件,这是用于调试V8的repl程序,运行并输入print('hello world'),如果 可以正常输出,那么说明编译成功了

V8构建的流程大概就是这样,构建好了之后就可以进行调试了,以后再详细研究

参考资料:
[1] Chrome V8
[2] GitHub V8 - Building-from-Source