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