JavaScript実装のV8のインストール
JavaScriptの勉強のためインストールしてみました。
コードのダウンロード
[ec2-user]# mkdir V8 [ec2-user]# cd V8/ # svnが入ってなかったのでインストール [V8]# yum install svn # レポジトリからチェックアウト [V8]# svn checkout http://v8.googlecode.com/svn/trunk/ v8
ビルドしてみる。
SentOSにはsconsなるものがあるらしいですが、Redhateなのでないといわれる。
[ec2-user@ip-172-31-24-107 v8]$ which scons /usr/bin/which: no scons in (/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ec2-user/bin) [ec2-user@ip-172-31-24-107 v8]$ scons arch=x64 -bash: scons: コマンドが見つかりません
とりあえずmakeしてみる。
[v8]# make PYTHONPATH="/home/ec2-user/V8/v8/tools/generate_shim_headers:" \ PYTHONPATH="/home/ec2-user/V8/v8/build/gyp/pylib:" \ GYP_GENERATORS=make \ build/gyp/gyp --generator-output="out" build/all.gyp \ -Ibuild/standalone.gypi --depth=. \ -Dv8_target_arch=ia32 \ \ -S.ia32.release -Dv8_enable_backtrace=1 -Darm_fpu=default -Darm_float_abi=default /bin/sh: build/gyp/gyp: そのようなファイルやディレクトリはありません make: *** [out/Makefile.ia32.release] エラー 127
gypをsvnで取得
よくわからないが、存在しないといわれたから、取得してみる。
[v8]# svn co http://gyp.googlecode.com/svn/trunk build/gyp A build/gyp/pylib A build/gyp/pylib/gyp A build/gyp/pylib/gyp/common.py A build/gyp/pylib/gyp/win_tool.py A build/gyp/pylib/gyp/flock_tool.py 途中省略 A build/gyp/data A build/gyp/data/win A build/gyp/data/win/large-pdb-shim.cc A build/gyp/OWNERS リビジョン 1945 をチェックアウトしました。
依存関係の確認する。
依存性を確認したら、違いリビジョンがチェックアウトされた。多分先にやったのは無駄だった。
[v8]# make dependencies svn checkout --force http://gyp.googlecode.com/svn/trunk build/gyp \ --revision 1831 D build/gyp/pylib/gyp/xcode_ninja.py D build/gyp/pylib/gyp/simple_copy.py U build/gyp/pylib/gyp/common.py 途中省略 A third_party/icu/mac/icudt46l_dat.S リビジョン 258359 をチェックアウトしました。 ( test -d buildtools || \ git clone https://chromium.googlesource.com/chromium/buildtools.git; \ cd buildtools; \ git fetch origin; \ git checkout 5d89977ce55240995d1596fe420b818468f5ec37 ) /bin/sh: line 1: git: コマンドが見つかりません /bin/sh: line 2: cd: buildtools: そのようなファイルやディレクトリはありません /bin/sh: line 3: git: コマンドが見つかりません /bin/sh: line 4: git: コマンドが見つかりません make: *** [dependencies] エラー 127
gitのインストール
gitがないと行けないみたいなので、gitをインストール
[v8]# yum install git
もう一度依存性の解決。
今度は、よきようにしてくれたらしい。
[v8]# make dependencies svn checkout --force http://gyp.googlecode.com/svn/trunk build/gyp \ --revision 1831 リビジョン 1831 をチェックアウトしました。 svn checkout --force \ https://src.chromium.org/chrome/trunk/deps/third_party/icu46 \ third_party/icu --revision 258359 リビジョン 258359 をチェックアウトしました。 ( test -d buildtools || \ git clone https://chromium.googlesource.com/chromium/buildtools.git; \ cd buildtools; \ git fetch origin; \ git checkout 5d89977ce55240995d1596fe420b818468f5ec37 ) Initialized empty Git repository in /home/ec2-user/V8/v8/buildtools/.git/ remote: Total 83 (delta 22), reused 83 (delta 22) Unpacking objects: 100% (83/83), done. Note: checking out '5d89977ce55240995d1596fe420b818468f5ec37'.
makeをする
[v8]# make PYTHONPATH="/home/ec2-user/V8/v8/tools/generate_shim_headers:" \ PYTHONPATH="/home/ec2-user/V8/v8/build/gyp/pylib:" \ GYP_GENERATORS=make \ build/gyp/gyp --generator-output="out" build/all.gyp \ -Ibuild/standalone.gypi --depth=. \ -Dv8_target_arch=ia32 \ \ -S.ia32.release -Dv8_enable_backtrace=1 -Darm_fpu=default -Darm_float_abi=default make[1]: ディレクトリ `/home/ec2-user/V8/v8/out' に入ります CXX(target) /home/ec2-user/V8/v8/out/ia32.release/obj.target/v8_base/src/accessors.o CXX(target) /home/ec2-user/V8/v8/out/ia32.release/obj.target/v8_base/src/allocation.o 途中省略 CXX(target) /home/ec2-user/V8/v8/out/ia32.release/obj.target/v8_base/src/types.o CXX(target) /home/ec2-user/V8/v8/out/ia32.release/obj.target/v8_base/src/typing.o cc1plus: warnings being treated as errors .././src/splay-tree-inl.h: In member function ‘virtual void v8::internal::AstTyper::VisitVariableProxy(v8::internal::VariableProxy*)’: .././src/splay-tree-inl.h:213: error: ‘dummy_node’ may be used uninitialized in this function .././src/splay-tree-inl.h:213: note: ‘dummy_node’ was declared here make[1]: *** [/home/ec2-user/V8/v8/out/ia32.release/obj.target/v8_base/src/typing.o] エラー 1 make[1]: ディレクトリ `/home/ec2-user/V8/v8/out' から出ます make: *** [ia32.release] エラー 2
ここで暫し検索タイム。コンパイラのバグではないかとの情報があった。
gccの確認
[v8]# gcc -version gcc: unrecognized option '-version' gcc: no input files [v8]# gcc -dumpversion 4.4.7
回避コード
Issue 2731: make fails with dereferencing type-punned pointer heap.h
https://code.google.com/p/v8/issues/detail?id=2731
pragmaをつけます。
[v8]# vim ./src/typing.cc
377 // simulated build generates warning (fails compile) without pragma 378 // when built using gcc 4.4.6 on intel linux 379 #pragma GCC diagnostic ignored "-Wuninitialized" 380 void AstTyper::VisitVariableProxy(VariableProxy* expr) { 381 Variable* var = expr->var(); 382 if (var->IsStackAllocated()) { 383 NarrowType(expr, store_.LookupBounds(variable_index(var))); 384 } 385 }
再度makeします。
nativeオプションを明示的につけてみました。
[v8]# make native make[1]: ディレクトリ `/home/ec2-user/V8/v8/out' に入ります CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-infer-representation.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-infer-types.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-load-elimination.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-mark-deoptimize.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-mark-unreachable.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-osr.o CXX(target) /home/ec2-user/V8/v8/out/native/obj.target/v8_base/src/hydrogen-range-analysis.o
インストールの確認
[V8]# ls v8/out/ Makefile.ia32.release Makefile.native build environment ia32.release native samples src test third_party tools [V8]# ls v8/out/native/ d8 lineprocessor mksnapshot obj obj.target process shell [V8]# ls v8/out/native/d8 v8/out/native/d8 [V8]# v8/out/native/d8 V8 version 3.27.34 [console: dumb] d8> console.out("aa"); (d8):1: ReferenceError: console is not defined console.out("aa"); ^ ReferenceError: console is not defined at (d8):1:1 d8> a=1; 1 d8> print a; (d8):1: SyntaxError: Unexpected identifier print a; ^ SyntaxError: Unexpected identifier d8> print function print() { [native code] } d8> print(a); 1 undefined d8>
make installわすれてた。。。