如何用GN编译V8引擎
在v8引擎的6.5版本以上,google采用了GN+Ninja
的编译组合,因此本文主要是基于GN+Ninjia
的编译方式进行说明。
获取源码
在官方文档中,还特别提示了避免HFS环境下的unicode问题,需要额外配置一下:
|
|
现在v8在github上面有源码镜像,你只需要git clone
下来即可。
|
|
获取依赖
depot_tools
首先git clone
如下的仓库:
|
|
Note: 国内用户可以
clone
github上面的镜像代码:
git clone [email protected]:cybertk/depot_tools.git
然后将depot_tools
加入你的PATH
环境变量中(通常会加到.bashrc
或者.zshrc
中):
|
|
gclient
取得depot_tools
之后,需要取得大量编译依赖,google提供了一个比较方便的工具gclient
来获取依赖。
|
|
尴尬的一点在于,由于众所周知的原因,依赖下载十分缓慢。现在我给出一些解决方案:
方案A: 设置代码镜像
在获取到的v8代码中,第一级目录下有一个DEPS
文件,通过修改其中的代码源实现加速:
|
|
内容如下
|
|
将chromium_url
的值修改为:https://source.codeaurora.org/quic/lc
Note: 请注意,这个chromium源码镜像并不全,没有python相关的库,但是大部分库都有,可以先把大部分代码下载下来,再使用代理把剩下的下载下来。
方案B: 设置代理
这是根治的方法,至于代理是如何设置本文不涉及。
|
|
Note:请注意
http_proxy
一定要小写。
编译初始化
v8使用Ninja作为编译工具,同时使用GN来生成.ninja
文件。
使用GN可以生成不同平台的编译配置文件:
|
|
当然你也可以在生成编译配置的时候传入一些参数:
|
|
使用如下参数加速编译:
is_debug = false
编译成release
版本is_component_build = true
编译成动态链接库而不是很大的可执行文件symbol_level = 0
将所有的debug符号放在一起,可以加速二次编译,并加速链接过程- 可以使用
ccache
加速编译过程,安装ccache, 可以传入参数cc_wrapper="ccache"
,参考这里 - 使用jumbo
编译选项参考chromium编译方式
例如我的编译生成命令是:
|
|
或者你可以使用 gn args out/x64.yourdir
这样的方式配置编译选项文件,如果你想编译一个简单的静态库,你可以用如下参数:
|
|
请注意,官方wiki文档中使用的tools/dev/v8gen.py x64.release
一直由于缺少什么文件导致无法运行,如果你也遇到本问题,请参考本文。
编译
编译完整的V8代码(假设是x64.relrease)
|
|
如果想编译特定目标,比如d8
:
|
|
生成开发项目
如果想使用xcode进行开发,你可以这样做:
|
|
然后用xcode
打开即可
open out/gn/ninja/all.xcworkspace
有关 xcode 调试代码的说明
有朋友反馈上述编译得到的 xcode 项目调试时无法看到源码, 该朋友的解决方案是如下:
原因:
在 xcode 的设置里面, 断点的标记形式, 是以绝对路径的形式的, 而 v8/chrome 默认的配置 (配置文件: compiler.gni) 会删掉绝对路径的符号, 这样与 xcode 就无法找到对应符号, 所以看不到源码。
|
|
参考这个链接: https://groups.google.com/a/chromium.org/g/chromium-dev/c/kE1HeGL4mj0/m/TOKsRsyTEwAJ.
gn 编译时添加参数:
|
|
这样就可以让 xcode 调试的时候看到到项目的源代码了。