読者です 読者をやめる 読者になる 読者になる

IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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わすれてた。。。