编译v8引擎
引言
我们都知道谷歌浏览器chrome
采用的javascript引擎是v8
,node.js
这样的runtime能够火遍全球,很大一部分功劳得归于v8
。半年前就想自己编译v8
引擎玩玩,无奈***阻挠了大部分下载,实在是体验太差,于是放弃。今天重新编译v8
,先把代码从墙外的vps下载下来,再用tar
打个包下载到本地,就可以在本地编译了。
实验环境
- 操作系统:Archlinux
- GCC-7.1.1
v8
源码的版本是6.1.99
步骤记录
本文参考的资料主要是编译 V8 源码以及Getting Started with Embedding。
0x01
先 clone depot_tools 文件
1
|
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
将 depot_tools 添加到当前shell的环境变量 PATH:
1
|
export PATH=`pwd`/depot_tools:"$PATH"
|
注意,depot_tools包含的是谷歌自己的一套工具链,里面包含了构建系统Ninja(类似Makefile),以及生成Ninja文件的GN工具。
这一套工具都是用python2
编写的,所以我们确保系统的python
是python2
版本。在Archlinux下面,默认的python
版本是python3
,所以我强制创建了软链接,sudo ln -sf /bin/python2 /bin/python
,记得编译完v8
之后再把版本改回去。
0x02
安装 depot_tools 构建系统的所有依赖,运行:
1
|
gclient sync
|
这样会下载v8
最新的源代码以及第三方依赖(比如llvm,clang-format)。
我们并不需要所有的分支,所以fetch v8
可以不执行。
如果这步完成,就可以将depot_tools
和v8
用tar
打包,下载回本地进行编译了。
目录结构:
1
2
3
4
5
|
# user1 @ nek-amd in /home/chen [10:08:51]
$ tree -L 1 v8
v8
├── depot_tools
└── v8
|
0x03
先安装一些不常用的依赖。v8
依赖libtinfo5
,在archlinux下面可以从aur里面装ncurses5-compat-libs
这个包。其他发行版按实际情况。
进入v8目录,v8gen
生成 ninja
构建文件:
1
|
cd v8 && tools/dev/v8gen.py x64.debug
|
这样就会在out.gn
目录下生成x64.debug
目录,包含了最重要的build.ninja
文件。
编译源码,生成可执行文件,目标系统 x64:
1
|
ninja -C out.gn/x64.debug
|
生成debug版本比release版本要快一些。
如果编译过程中出错,要仔细查看报错信息以及翻阅相关文档,相信最后一定都可以解决。
编译完后,可以看到out.gn/x64.debug
目录下多出许多动态链接库文件一个叫d8
的可执行文件。
1
2
3
4
|
# user1 @ nek-amd in /home/chen/v8/v8 on git:e81af43045 x [10:57:34]
$ ls out.gn/x64.debug/*.so
out.gn/x64.debug/libicui18n.so out.gn/x64.debug/libv8_for_testing.so out.gn/x64.debug/libv8_libplatform.so
out.gn/x64.debug/libicuuc.so out.gn/x64.debug/libv8_libbase.so out.gn/x64.debug/libv8.so
|
0x04
最后一步就是编译hello-world.cc。
先执行cp out.gn/x64.release/*.bin .
,拷贝快照文件到v8根目录。
如果按照官网教程,肯定是不能通过的,因为教程使用的是v5.8的代码。动态链接库的名字已经变掉了。
如功能弄清楚编译的基本原理,就可以按照自己的需求修改编译命令。我修改了官网给的编译命令如下:
1
2
3
4
|
g++ -I. -Iinclude samples/hello-world.cc -o hello-world -Lout.gn/x64.debug -Wl,-rpath=out.gn/x64.debug -Wl,--start-group \
-lv8_libbase -lv8_libplatform -lv8 \
-licuuc -licui18n \
-Wl,--end-group -lrt -ldl -pthread -std=c++0x
|
就可以成功编译hello-world.cc
了。
执行效果:
1
2
3
|
# user1 @ nek-amd in /home/chen/v8/v8 on git:e81af43045 x [11:07:35]
$ ./hello-world
Hello, World!
|