关于谷歌V8 JS编译器官方的参考网站:https://developers.google.com/v8/
由于在 Linux i386 环境下安装费了不少功夫,因此决定将整个过程记录下来。
1、获取源代码
可以通过git方式也可以通过svn方式,由于没有安装git,因此使用svn方式来获取代码(前提是需要先安装svn)
执行如下命令,将最新的源代码checkout到本地的v8目录(该过程较久)
svn checkout http://v8.googlecode.com/svn/branches/bleeding_edge/ v8
2、编译源代码
进入v8目录,执行 make dependencies,提示:
svn checkout --force http://gyp.googlecode.com/svn/trunk build/gyp \
--revision 1282
Subcommand 'checkout' doesn't accept option '--force'
可见当前的linux svn版本不支持 --force 选项,那么修改 Makefile 文件,找到 dependencies ,将其中的 --force 删除,重新执行 make dependencies
该命令将从网络上下载很多文件(该过程较久)。
3、准备工作
1)安装gyp,下载网址:
http://pkgs.org/centos-5-rhel-5/epel-i386/gyp-0.1-0.6.1010svn.el5.noarch.rpm.html#download
下载后执行rpm命令安装:sudo rpm -Uvh gyp-0.1-0.6.1010svn.el5.noarch.rpm
2)安装Python 2.7 Linux系统默认安装的是2.4,可能后由于该版本问题在make的时候失败
然后执行 ./configure & make & sudo make install 三部曲
3)Ok,准备工作完成,开始编译
4、准备过程以及完成,开始make
由于v8支持32、64位的编译,并且使用了不同的目录,因此可以使用
make native 命令自动根据当前系统配置编译32或者64位类库
执行后编译很快出现错误了,如下:
../src/heap.h: In member function ‘v8::internal::byte** v8::internal::Heap::store_buffer_top_address()’:
../src/heap.h:1225: warning: dereferencing type-punned pointer will break strict-aliasing rules
查询谷歌,发现是由于g++版本较新,strict-aliasing 检查导致所有的指针强制转换 reinterpret_cast 产生的告警变成了编译异常(参考:http://blog.youkuaiyun.com/huipengzhao/article/details/6726416)
继续查询解决方法:将编译时的 Werror 选项注释掉(参考:http://hi.baidu.com/zhangfeezju/blog/item/033098eda975d9f12f2e2190.html)
make clean --清空中间文件
grep -n Werror `find . -type f` --查找出所有有 Werror 的地方,把结果中包含 svn以及test的删除则还有四处需要修改
./build/standalone.gypi:66: 'werror%': '-Werror',
./build/standalone.gypi:191: 'GCC_TREAT_WARNINGS_AS_ERRORS': 'YES', # -Werror
./build/common.gypi:89: 'werror%': '-Werror',
./build/gyp/pylib/gyp/xcode_emulation.py:297: cflags.append('-Werror')
./SConstruct:305: '-Werror',
./SConstruct:408: 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
把YES修改成NO,把-Werror 修改成空即可,然后继续编译,有告警但是编译通过。
5、测试,HelloWorld
参见官网:https://developers.google.com/v8/get_started
其中要注意的是,g++ -Iinclude hello_world.cc -o hello_world out/x64.release/obj.target/tools/gyp/libv8_{base,snapshot}.a -lpthread
由于使用 make native 因此目标类库是在 native 之中,只要将其中的红色部分修改成 native 即可。
编译之后,正确的输出 Hello, World!
5、大功告成