在Mac上使用XCode来编绎v8

Mac上最简单安装v8的方法就是直接使用HomeBrew即可(不知道brew的去面壁半小时,再去Google)

brew install v8

安装完成后,到HomeBrew工作目录/usr/local/Cellar/v8/一看,版本还是3.25.30…
作为我这等有强迫症程序猿,怎能不用最新的呢,再说你看前段时间node.js分裂出来的io.js,里面不就有人说怎么还没更新到最新的v8呢,所以你看就有了io.js了吧,当然这没有太大关系,哈哈,所以我们今天的主题就是如何在Mac上使用XCode来编绎最新的v8,基于4.x.x以上的版本

https://code.google.com/p/v8-wiki/wiki/BuildingWithGYP
相信很多人都看过这个向导了,按道理是应该非常简单就可以编绎通过的,但还是蛋疼了一番,基本上都是按向导来做,但还是通不过(不知道官方测试过没有),最后整理了一下编绎过程

第一步

先准备个VPN吧,我想作为有思想的程序猿应该人手一个了吧,如果没有就去买吧,我就不推荐了(此处广告位招租,限VPN广告),至于为什么需要VPN,我就不解释了,谁叫我们生活在大天朝呢

第二步

安装 GYP(Chromium 团队开发的跨平台自动化项目构建工具,类似CMake)

svn checkout http://gyp.googlecode.com/svn/trunk/

进入build目录,安装gyp

sudo python setup.py install

第三步

安装 gtools(Chromium 团队开发的多源代码管理工具)

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

gtools只需要下载即可以使用了,将gtools工作目录添加到系统环境变量中吧

vim ~/.bash_profile
export PATH=/Users/Kevin/Desktop/depot_tools:"$PATH"

PS…怎么全是Google自家的工具…这么NB的v8,Google肯定要借此机会好好宣传自家工具

记得请把上面Kevin换成你的用户名,除非你的名字跟我一样,那恭喜你,你可以少敲5次键盘,键盘寿命又可以延长了 顺便设置一下使用Clang编绎需要用到的一些参数吧

export CXX=/usr/to/clang++
export CC=/usr/tp/clang
export CPP="/urs/to/clang -E"
export LINK=/usr/to/clang++
export CXX_host=/usr/to/clang++
export CC_host=/usr/tp/clang
export CPP_host="/usr/to/clang -E"
export LINK_host=/usr/to/clang++
export GYP_DEFINES="clang=1"

最后让bash生效

source ~/.bash_profile

第四步

完成上面三步后,到v8根目录,通过gtools下载项目依赖库

gclient config https://chromium.googlesource.com/v8/v8.git
gclient sync

Sync这个过程会比较慢,取决于你刚刚购买的VPN速度了,反正Sync完后,源代码目录有872MB了,我是搞了一上午的…

第五步

下载完成完后,我看向导配置一下就好像可以编绎了,很开心啊

build/gyp_v8 -Dtarget_arch=ia32
build/gyp_v8 -Dtarget_arch=x64

WTF…还出错…

./gyp_v8 -Dtarget_arch=ia32
Updating projects from gyp files...
gyp: /Users/Kevin/Desktop/v8/v8 copy/third_party/icu/icu.gyp not found (cwd: /Users/Kevin/Desktop/v8/v8 copy/build)

压根没有third_party这个目录啊,找了一会儿,原来现在的third_party目录跑到v8/v8目录下去,直接把third_party目录移动到v8根目录吧(我以前编绎过3.x的一个版本,之前用gclient sync是会直接下载相关依赖库至v8根目录,但现在下到v8/v8目录去了,而现在gyp他又没使用这个目录,尝试找gpy编绎设置,没找到…主要是不会这玩意…)

好了,基本所有准备工作就绪了,准备编绎吧(当然我不保证你前面的工作能顺利的走下来…)

xcodebuild -project build/all.xcodeproj -configuration Release

WTF…编绎了半天,就差电脑风扇转坏了,竟然出错

clang: error: no such file or directory: '/Users/Kevin/Desktop/v8/v8/testing/gmock/src/gmock-internal-utils.cc'
clang: error: no input files
Command /usr/bin/clang failed with exit code 1

打开all.xcodeproj,找到gmock工程,发现竟然有些源代码文件引用失效,而且还有gtest工程也有些源代码文件引用失效

gmock-miss_src gtest_miss_src

我修复后,再通过上面的命令终于编绎成功了,生成的静态库在v8/xcodebuild目录下面。

后面我发现其实不用编绎整个工程,那样太慢,直接编绎v8 target就可以了,基本上都能成功的,把编绎好的静态库和头文件Copy到你工作目录就可以使用了

写个简单的例子,网上很多教程都是这个例子但在新版里面,需要加上这两行初始化代码,才能正常执行

v8::V8::InitializeICU();
v8::V8::Initialize();
int main(int argc, const char * argv[])
{
    v8::V8::InitializeICU();
    v8::V8::Initialize(); 
     
    v8::Isolate *isolate = v8::Isolate::New();
    v8::HandleScope handle_scope(isolate);
    v8::Handle<Context> context = v8::Context::New(isolate);
    v8::Context::Scope context_scope(context);
    v8::Local<String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', World!'");
    v8::Script::Handle<Script> script = v8::Script::Compile(source);
    v8::Handle<Value> result = script->Run();
    v8::String::Utf8Value utf8(result);
    printf("%s\n", *utf8);
    return 0;
}

编绎上面代码前,先修改一下XCode编绎参数,LLVM 6.0默认使用的LLVM C++ Standard Library,而v8依赖的是GNU C++标准库,所以最后把libc++改成libstdc++吧。

过两天会写一篇v8基础入门的文章。