前言
好久都没有作死了,最近手贱去网上下载了个v8的源码,打开文件夹的那一瞬间我就蒙圈了。。。换了7个鼠标都没有找到怎么去编译。去网上找了一圈文章和博客,完全就尼玛是三个文章各种copy,还各种都是两三年前的,真的是无力吐槽这种氛围。文章里大都是说要用gyp编译,但是最近谷歌已经在项目中声明了弃用gyp改用gn,不过如果大家不介意的话也可以使用gyp来编译。。。
如果跟我一样不作死就不会死的话,接下来我就用Win7 平台和google推荐的构建编译系统编译v8引擎。
(本人游戏前端搬砖无聊狗一枚,所以教程很平易近人,不用担心看不懂。如果有觉得侮辱智商的话,请移驾至:https://github.com/v8/v8/wiki)
必备工具
- FQ!!!用SS的话需要配置git,不会的话就老实点去花点钱架个VPN(我不会 - -!)。这一步无法保证的话请关掉这个页面然后忘掉这东西吧,去找找有没有直接可以拿来用的库。
- VS2015(推荐为2015,2013需要一些新的dll,2017的整个目录结构都不一样了。建议下载在线安装版的,一个是因为在线版的安装SDK比较容易成功,另一个是因为本来就用不了很多功能,下载离线包有点浪费。)
- Win10 SDK(VS2015自带的最好,如果不行可以在这里下载。https://go.microsoft.com/fwlink/p/?linkid=845298,下载的会有点问题,编译时会具体说。安装时注意CPU架构的选项,这次用的是amd x64的架构,保险的话全部都安装,说不定哪天就想编译arm的了。如果安装时提示已经有安装的版本的话就先不安装,如果到后面提示问题就把原先的sdk卸载掉再重新安装这个版本的。还有记得安装的时候回到我大天朝的怀抱,因为是在线安装的。)
- git(可有可无,主要用来下载depot_tools,可以直接去网上下载zip。网址:https://www.chromium.org/developers/how-tos/install-depot-tools)
获取项目
- 第一步,将下载好的depot_tools解压缩到任意文件夹,把根目录 x:\xxx\depot_tools 添加到环境变量path中。
- 第二步,随意位置打开cmd,输入gclient,然后默默等待。depot_tools会自动升级并下载需要的工具。没有GUI界面,也没有什么提示,总感觉是死机了(这让我想起来各种全家桶了)。但是可以通过网速监测来看当前的情况。(200+MB,必须FQ)
升级成功后会直接显示以下内容:
C:\Users\- gclient
Usage: gclient.py <command> [options]
Meta checkout dependency manager for Git.
Commands are:
config creates a .gclient file in the current directory
diff displays local diff for every dependencies
fetch fetches upstream commits for all modules
flatten flattens the solutions into a single DEPS file
grep greps through git repos managed by gclient
help prints list of commands or help for a specific command
pack generates a patch which can be applied at the root of the tree
recurse operates [command args ...] on all the dependencies
revert reverts all modifications in every dependencies
revinfo outputs revision info mapping for the client and its dependencies
root outputs the solution root (or current dir if there isn't one)
runhooks runs hooks for files that have been modified in the local working copy
status shows modification status for every dependencies
sync checkout/update all modules
validate validates the .gclient and DEPS syntax
verify verifies the DEPS file deps are only from allowed_hosts
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-j JOBS, --jobs=JOBS Specify how many SCM commands can run in parallel;
defaults to 8 on this machine
-v, --verbose Produces additional output for diagnostics. Can be
used up to three times for more logging info.
--gclientfile=CONFIG_FILENAME
Specify an alternate .gclient file
--spec=SPEC create a gclient file containing the provided string.
Due to Cygwin/Python brokenness, it can't contain any
newlines.
--cache-dir=CACHE_DIR
(git only) Cache all git repos into this dir and do
shared clones from the cache, instead of cloning
directly from the remote. (experimental)
--no-nag-max Ignored for backwards compatibility.
可以输入 gclient --version测试一下。
C:\Users\- gclient --version
gclient.py 0.7
-
第三步,设置环境变量,这一步骤奇坑无比,官方的wiki上面居然完全没有,弄得我刚开始各种失败,最后在chrome编译教程里面找到了。
具体的设置如下:
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2015
set GYP_MSVS_OVERRIDE_PATH=//你的vs根目录
- 第四步,进入一个你想放置v8源码的文件夹,然后打开cmd并输入fetch v8(注意这一步必须提前设置环境变量,如果提示update失败或者environment相关失败那就是环境变量有问题),默默等待它从google服务器下载好将近1G的文件夹,依旧没有输出,没有提示,除非出错了。去喝个咖啡,玩会单机游戏再回来吧。
如果中途提示失败并退出的话,输入gclient sync回车来继续更新,工具会自动检测并升级v8引擎的状态与配置。网速如果过慢也可以关掉再重新sync。下载完成后进入v8目录,再次输入gclient sync,确认项目状态。
显示如下输出即为成功:
If you really want to run this, either run
`python gypfiles/gyp_v8` explicitly by hand
or set the environment variable GYP_CHROMIUM_NO_ACTION=0.
构建项目
进入v8/tools/dev文件夹中,打开cmd并输入v8gen.py x64.release。也可以输入v8gen.py list来列出所有支持的编译选项。执行此步骤之前需要确认已经安装好了Win10 SDK,否则会报错。
输入v8gen.py x64.release -vv可以看见报错信息中有下面一句:
Exception: dbghelp.dll not found in "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll"
You must install the "Debugging Tools for Windows" feature from the Windows 10 SDK.
意思是找不到Windows调试工具,有问题的再去检查一下自己的Win10 SDK,实在不行就卸了重新安装。
################################################################################
cd E:\Chrome_v8\v8
################################################################################
D:\Program Files\Python27\python.exe -u tools\mb\mb.py gen -f infra\mb\mb_config.pyl -m developer_default -b x64.release out.gn/x64.release
Writing """\
is_debug = false
target_cpu = "x64"
""" to E:\Chrome_v8\v8\out.gn\x64.release\args.gn.
E:\Chrome_v8\v8\buildtools\win\gn.exe gen out.gn/x64.release --check
Done. Made 91 targets from 55 files in 12568ms
OK,这样就没问题了。在v8目录下会多一个文件夹out.gn,进入out.gn/x64.release文件夹,里面有一个args.gn,这个文件就是编译的配置文件。现在里面只有两个设置:
is_debug = false
target_cpu = "x64"
在这时候直接开始编译的话,v8引擎会被直接编译为静态链接的exe文件,如果需要编译成dll的话则加上这句话:
is_component_build = true
需要编译成lib的话加上这句话(貌似不加也可以,我忘掉了。。。):
v8_static_library = true
如果想自己研究编译设置的话可以在v8目录下执行:gn args out.gn/x64.release --list。如果喜欢进一步作死的话可以去谷歌开发者平台获取gn的手册和源码。
这一步完成之后才正式算是完成了构建项目的步骤,后面才是真正的编译步骤,随着gyp被谷歌废掉,vs项目也别想用了,直接用google的工具ninja来编译。
编译项目
在v8目录下执行:ninja -C out.gn/x64.release,然后开始漫长的等待过程,编译系统会帮你把所有cpp源码编译成为obj然后链接成为动态/静态库或是程序。不过如果用的是本文中提供的Win10 SDK的话,在链接过程中就会出现问题,如下所示:
正在创建库 ./mksnapshot.lib 和对象 ./mksnapshot.exp
LINK : fatal error LNK1158: 无法运行“mt.exe”
ninja: build stopped: subcommand failed.--
这个原因是因为新版的win10 sdk改变了目录结构,使得编译软件无法找到必要的处理程序。解决办法如下:
- 进入C:\Program Files (x86)\Windows Kits\10\bin,将arm、armx64、x64、x86文件夹备份并删除,
- 将10.0.15063.0文件夹中的arm、armx64、x64、x86文件夹拖出。
- 再次运行ninja -C out.gn/x64.release
关于这个问题,微软的官网也说了,该版本的SDK只能被VS2017检测出来,无法被更早的版本找到。本来还以为是多么高端的办法。。。没想到竟是这个- -!
最后编译结束之后记得把SDK的目录还原,除非你不准备用它。
编译结束后得到了这些链接文件:
- v8_for_testing.dll.lib
- v8_for_testing.dll
- v8.dll.lib
- v8.dll
- icui18n.dll.lib
- icui18n.dll
- icuuc.dll.lib
- icuuc.dll
- v8_libplatform.dll.lib
- v8_libplatform.dll
- v8_libbase.dll.lib
- v8_libbase.dll
别告诉我你不知道怎么用,不知道的自己面壁思过去。头文件在v8/include中,据说v8支持wasm,啥也不说了,果断打开lua写去了(容我缓两天,这两天折磨得我看见v8就想吐。)
总结
v8这个坑真的是不小,以前用lua的时候,100%纯ANSI C,拿过来直接想怎么玩就怎么玩。现在下了个v8也是崩溃,不过最后还算是弄好了。刚开始一堆问题,每分每秒都想放弃。逛谷歌论坛的感觉真不咋地,感觉都在看天书。。。
最后附上一些资源以及最新(2017-9-8)的库给那些遵纪守法的好童鞋,v8引擎的教程可以在官方wiki里找到:https://github.com/v8/v8/wiki。
后面我会把整个项目上传到链接里面,用的时候需要先重新配置一下,因为里面会记载有很多路径信息,希望这种简单粗暴的方式管用吧。
链接:http://pan.baidu.com/s/1b7T2ay 密码:nuxj
如果有人还遇到了什么神奇的问题的欢迎留言,虽然我不一定能回答。→_→
最后祝大家学习愉快!
网友评论