V8引擎编译

♀尐吖头ヾ 提交于 2020-08-16 19:01:37

在v8引擎的6.5版本以上,google采用了GN+Ninja的编译组合,因此本文主要是基于GN+Ninjia的编译方式进行说明。

获取源码

在官方文档中,还特别提示了避免HFS环境下的unicode问题,需要额外配置一下:

$ git config --global core.precomposeUnicode true

现在v8在github上面有源码镜像,你只需要git clone下来即可。

$ git clone git@github.com:v8/v8.git

 

获取依赖

Depot_tools

首先git clone如下的仓库:

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

Note: 国内用户可以clonegithub上面的镜像代码:
git clone git@github.com:cybertk/depot_tools.git

然后将depot_tools加入你的PATH环境变量中(通常会加到.bashrc或者.zshrc中):

export PATH="$PATH:/path/to/depot_tools"

Gclient

取得depot_tools之后,需要取得大量编译依赖,google提供了一个比较方便的工具gclient来获取依赖。

gclient sync

尴尬的一点在于,由于众所周知的原因,依赖下载十分缓慢。现在我给出一些解决方案:

方案A: 设置代码镜像
在获取到的v8代码中,第一级目录下有一个DEPS文件,通过修改其中的代码源实现加速:

$ vim DEPS

内容如下

vars = {
  'build_for_node': False,
  'checkout_instrumented_libraries': False,
  'chromium_url': 'https://chromium.googlesource.com',
  'download_gcmole': False,
  'download_jsfunfuzz': False,
  'download_mips_toolchain': False,
}

chromium_url的值修改为:https://source.codeaurora.org/quic/lc

Note: 请注意,这个chromium源码镜像并不全,没有python相关的库,但是大部分库都有,可以先把大部分代码下载下来,再使用代理把剩下的下载下来。

方案B: 设置代理

这是根治的方法,至于代理是如何设置本文不涉及。

 export http_proxy=127.0.0.1:1080 
 export https_proxy=127.0.0.1:1080

Note:请注意http_proxy一定要小写。

编译初始化

v8使用Ninja作为编译工具,同时使用GN来生成.ninja文件。

使用GN可以生成不同平台的编译配置文件:

gn gen out.gn/x64.release

当然你也可以在生成编译配置的时候传入一些参数:

gn gen out.gn/foo --args='is_debug=false target_cpu="x64" v8_target_cpu="arm64" use_goma=true'

使用如下参数加速编译:

  1. is_debug = false 编译成release版本
  2. is_component_build = true 编译成动态链接库而不是很大的可执行文件
     symbol_level = 0 将所有的debug符号放在一起,可以加速二次编译,并加速链接过程
  3. 可以使用ccache加速编译过程,安装ccache, 可以传入参数cc_wrapper="ccache",参考这里
  4. 使用jumbo

编译选项参考chromium编译方式

例如我的编译生成命令是:

gn gen out.gn/x64.release --args='is_debug=false is_component_build=true symbol_level=0 cc_wrapper="ccache" target_cpu="x64" '

或者你可以使用 gn args out/x64.yourdir 这样的方式配置编译选项文件,如果你想编译一个简单的静态库,你可以用如下参数:

is_component_build = false
is_debug = false
libcpp_is_static = false
symbol_level = 1
treat_warnings_as_errors = false
use_custom_libcxx = false
use_sysroot = false
v8_deprecation_warnings = false
v8_embedder_string = "-v8_Your_Define_String"
v8_enable_gdbjit = false
v8_enable_i18n_support = false
v8_enable_test_features = false
v8_experimental_extra_library_files = []
v8_extra_library_files = []
v8_imminent_deprecation_warnings = false
v8_monolithic = true
v8_static_library = false
v8_target_cpu = "x64"
v8_untrusted_code_mitigations = false
v8_use_external_startup_data = false
v8_use_snapshot = true

请注意,官方wiki文档中使用的tools/dev/v8gen.py x64.release一直由于缺少什么文件导致无法运行,如果你也遇到本问题,请参考本文。

编译

编译完整的V8代码(假设是x64.relrease)

ninja -C out.gn/x64.release

如果想编译特定目标,比如d8

ninja -C out.gn/x64.release d8

生成开发项目

如果想使用xcode进行开发,你可以这样做:

gn gen out/gn --ide=xcode

然后用xcode打开即可

open out/gn/ninja/all.xcworkspace

#EOF

 

 

GN build configuration

本文档提供一些常用的GN编译步骤。假设你已经got a Chromium checkout
另请参阅

常用编译变量

Release编译

默认GN编译的是debug版本,通过以下参数改成release编译:

is_debug = false

release编译下启用DCHECK宏,来发现潜在的bugs。

dcheck_always_on = true

分散链接编译(Component build)

Component build是将最后一步本来很长的链接操作,改为链接成很多个分离的共享库的操作。它是默认的debug版的编译方式(除iOS编译),并且大多数开发者使用这种模式用于每天的编译及调试。这种模式启动会很慢,而且一些链接优化会被禁用,所以这不是测试的标准。有些人喜欢在release编译启用这种模式,来获取更快的链接速度和合理的运行性能。

is_component_build = true

不生成符号文件的快速编译

不生成符号文件将使调试几乎成为不可能,但编译确实会更快。当你想尽快编译的时候会很有用。

symbol_level = 0

禁用 Native Client

大多数开发者不需要测试 Native Client的功能,可以禁用它来提高编译速度

enable_nacl = false

移除WebCore(内核)符号

WebCore有很多模版,导致会生成大量的符号文件。如果你不需要调试WebCore,可以不生成这些符号文件使编译更小更快。

remove_webcore_debug_symbols = true

Warning: 在Windows上,这将会导致许多blink的dll每次都会重新链接,因为丢失pdb文件,所以重新编译时可能会更慢

重新指定CPU系列(Overriding the CPU architecture)

默认情况下,GN会使用和当前系统和CPU结构匹配的设置。重新设置:

target_cpu = "x86"

target_cpu可能的值:

  • Windows支持“x86”和“x64”。自从Chromium只支持在64位机器上编译时,默认的值总是“x64”。
  • Mac和桌面Linux只支持“x64”。在桌面Linux上你理论上可以使用ARM或MIPS结构的格式化字符串,但现在还不支持和验证。
  • Chrome OS支持“x86”和“x64”,但是在64位机器上编译32位文件需要是sysroot(管理员账户)。
  • 如果你编译Android包(下面介绍),默认的CPU结构是“arm”。你可以尝试将它重置为”arm64”, “x86”, “mipsel”, or “mips64el”,but the GN builds for these aren’t regularly tested.

Goma(一种分布式编译器)

Googlers可以使用它来分布式编译。 goma_dir仅当你将Goma工具放在非标准的路径时才需要指定(默认的路径为:~/goma or C:\goma\goma-win)。

use_goma = true
goma_dir = "/home/me/somewhere/goma"  # Optional

Chrome官方编译(Official Chrome build)

当你是Google员工且有内容的src源码检出时使用此类编译。在Linux上,运行gn args之前,先运行命令:

$ export GYP_DEFINES='buildtype=Official branding=Chrome'
$ gclient runhooks

The GYP_DEFINES and gclient runhooks steps are required on Linux because the hook that fetches the Linux sysroot still looks at GYP_DEFINES, even though the GYP tool is not actually used.非Linux平台,你可以跳过这步。

正式编译使用下面的参数:

is_official_build = true
is_chrome_branded = true
is_debug = false

编译32位正式版时,使用:

$ export GYP_DEFINES='buildtype=Official branding=Chrome target_arch=ia32'

替换第一步中Linux下的命令,并且将下面的参数添加到上面的参数设置中:

target_cpu = "x86"

Windows

有一个“gn gen”参数(–ide)用来生成Visual Studio项目和解决方案。

$ gn gen out\mybuild --ide=vs

Xcode

gn gen out/gn --ide="xcode"

默认生成的是VS 2015的工程文件。

编译Android版本(在Linux上)

假设你已经跟着Android build instructions的步骤检出了源码。

target_os = "android"

在Linux上使用相同的检出源码编译Android和Linux版本的Chrome是很容易的。你的.gclient文件中必须指出是Android,但必须有对应的SDK。如果你是按照Android文档的指示来检出代码的话,这些都会自动完成。如果已经存在的源码是Linux版本的检出,将下面的内容添加到.gclient文件中(在src上层目录中),并且运行gclient runhooks

solutions = [
  ...existing stuff in here...
]
target_os = [ 'android' ]  # Add this to get Android stuff checked out.

编译Chrome OS版本(在Linux上)

This will build the Chrome OS variant of the browser that is distributed with the operating system. You can run it on your Linux desktop for feature development.

target_os = "chromeos"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!