终于下定决心要编译V8引擎,这里记录编译过程中的一些关键点

Arch Linux

  • 安装Python:要安装2.x版本,因为Arch Linux的默认版本是3.x,执行$ ln -sf /bin/python2 /bin/python

  • 翻墙:shadowsocks-libev + polipo
    开始时直接用shadowsocks,通过环境变量http_proxy=socks5://127.0.0.1:1080https_proxy=socks5://127.0.0.1:1080实现Terminal代理,后来发现在同步工程时,depot_tools里的gsutil报警告,Google之,最后换方案:
    • shadowsocks-libev提供socks代理,默认端口:1080
    • poliposocks代理转成http代理,默认端口:8123
    • 修改gitsocks代理配置
    • 通过环境变量NO_AUTH_BOTO_CONFIG,为gsutil指定代理参数
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      # ~/.poliporc的内容
      socksParentProxy = "127.0.0.1:1080"
      socksProxyType = socks5
      diskCacheRoot = "~/.polipo-cache/"
      
      # 启动HTTP代理
      $ polipo -c ~/.poliporc &
      
      # ~/.boto的内容
      [Boto]
      proxy = 127.0.0.1
      proxy_port = 8123
      
  • 安装depot_tools
    • $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    • $ export PATH=/path/to/depot_tools:$PATH
    • $ gclient,程序会自动更新所依赖的工具
  • 环境变量:
    1
    2
    
    # 为gsutil指定代理参数
    $ export NO_AUTH_BOTO_CONFIG=~/.boto
    
  • 下载源码fetch v8,只需要执行一次
  • 同步工程gclient sync

Windows 10

  • 安装Python:要安装2.x版本
  • 翻墙:直接用全局VPN

  • 安装depot_tools
    • 下载程序包并且解压,注意:要完整解压
    • 添加PATH路径,注意:要添加到最前面
    • 安装设置完毕后,打开CMD直接运行gclient,程序会自动更新所依赖的工具
  • 安装VS:
    • 安装VS2017,必须要安装Desktop development with C++MFC and ATL support
    • 安装Windows 10 SDK,一般在安装VS2017时会附带安装上,不过这时要手工去安装Debugging Tools For Windows,方法:控制面板->程序->程序和功能->找到Windows Software Development Kit->更改->选中更改,点下一步->勾选Debugging Tools For Windows,确认更改
  • 环境变量:
    1
    2
    3
    4
    5
    6
    
    rem 是否使用depot_tools自带的Windows编译工具链,请设置为0
    > set DEPOT_TOOLS_WIN_TOOLCHAIN=0
    rem 指定VS版本,默认值是2017,如果是旧版本,请设置
    > set GYP_MSVS_VERSION=2017
    rem 指定VS安装路径,如果是自定义安装路径,请设置
    > set GYP_MSVS_OVERRIDE_PATH=
    
  • 下载源码fetch v8,只需要执行一次
  • 同步工程gclient sync

安装时用到的几个命令

下面以Linux Terminal为例,Windows Command Line请自行作相应修改
首先进入V8的源码目录

./tools/dev/v8gen.py

此脚本其实只是gn命令的封装

  • ./tools/dev/v8gen.py list打印所有支持的编译模式,如:
    1
    2
    
    x64.debug
    x64.release
    
  • ./tools/dev/v8gen.py gen生成构建目录,gen是默认行为,可以省略,如:
    1
    2
    3
    4
    5
    
    # 默认在out.gn目录下生成构建目录x64.release
    $ ./tools/dev/v8gen.py gen x64.release
    $ ./tools/dev/v8gen.py     x64.release
    # 也可以自定义构建目录
    $ ./tools/dev/v8gen.py gen -b x64.release ~/some_path/my_build_dir
    

gn

  • gn args out.gn/x64.debug --list打印指定构建目录的所有构建参数的当前值与默认值

  • gn args out.gn/x64.debug编辑指定构建目录的构建参数

    当然你也可以直接编辑out.gn/x64.debug/args.gn文件

ninja

  • ninja -C out.gn/x64.debug完全编译,后面也可以指定构建目标,如:
    1
    
    $ ninja -C out.gn/x64.debug v8
    

args.gn文件的几个关键构建参数

  • Arch Linux
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    # 是否调试编译
    is_debug = false
    # x64是指64位,x86是32位
    target_cpu = "x64"
    # 是否编译动态库
    is_component_build = true
    # 
    use_sysroot = false
    # 是否使用libc++库
    use_custom_libcxx = false
    # 是否编译静态库
    v8_static_library = false
    # 是否使用快照模式
    v8_use_snapshot = false
    
  • Windows 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    # 是否调试编译
    is_debug = false
    # x64是指64位,x86是32位
    target_cpu = "x64"
    # 是否编译动态库
    is_component_build = true
    # 是否编译静态库
    v8_static_library = false
    # 是否使用快照模式
    v8_use_snapshot = false
    

后记

最后,也不知道是我没找到还怎么滴,官方文档真的太让人绝望了:太旧,太简。

开始,在Linux上编译,一路磕磕绊绊编译出so,结果链接自己的代码时提示找不到v8::platform::NewDefaultPlatform,Google之只找到只言片语:说目前不支持动态链接,好,我又去编译成a,还是不行,两天后终于有人发贴才搞定,作为一名没怎么用过C/C++的码农,我能看懂前面帖子里的解释,但是让我去找出原因,有点难度。

接着,在Windows上编译,先是在公司的Win7+VS2015上编译失败,下班回家把Win10上的VS2015卸了装VS2017,因为自定义安装路径折腾了下好歹成功,回到公司总结了前面遇到的坑,Win7+VS2015还是失败,无奈下VS2015卸了装VS2017居然失败???Google也没找到什么资料了,看来看去,回想起家里装VS2017时好像手动勾了个SDK版本,但在公司装VS2017时看到默认已经勾了个就没去动,难道是Win 10 SDK版本的坑?本着死马当活马医,打开安装程序,发现默认安装的SDK版本是10.0.16299,后面还有几个版本,我把其中的10.0.15063也装上,重新编译,成功了,我无喜无悲!!!