编译v8引擎

引言

我们都知道谷歌浏览器chrome采用的javascript引擎是v8node.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编写的,所以我们确保系统的pythonpython2版本。在Archlinux下面,默认的python版本是python3,所以我强制创建了软链接,sudo ln -sf /bin/python2 /bin/python,记得编译完v8之后再把版本改回去。

0x02

安装 depot_tools 构建系统的所有依赖,运行:

1
gclient sync

 

这样会下载v8最新的源代码以及第三方依赖(比如llvm,clang-format)。

我们并不需要所有的分支,所以fetch v8可以不执行。

如果这步完成,就可以将depot_toolsv8tar打包,下载回本地进行编译了。

目录结构:

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!
posted @ 2020-06-22 20:27  jiangcheng_15  阅读(1497)  评论(0编辑  收藏  举报