さくらのレンサバにRails libv8とJava script runtimeの問題が解決できた


いつ再チャレンジしようかと思っていた企画ですが、最近RubyとRailsの事を勉強しだしたので、これはクリアしとかんといかん!と思うたので、数日かけてやっとクリアできました。

ではGOGO。

前提条件として、RubyとGemはレンサバに入っているものではなくて自前でインストールしたものでやります!ですが、今回はrbenvで新しいRubyにしたところも載せているのでその辺も見て頂けたらと思います。

rbenvを入れますか

ここは詰まらないと思うので、論よりコードってことで

ディレクトリ名はrubyになってますが、もうちっと考えた名前にした方が後々よろしいです。

mkdir ruby
cd ruby
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
echo 'export TMPDIR=HOME/tmp >> ~/.bashrc
exec $SHELL -l

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenv install --list
rbenv install 2.1.5
rbenv rehash
rbenv global 2.1.5

$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-freebsd9.1]

これでrubyは2.1.5となりました。

シェルはBashを使っています。

Gemupdateしておきます。だいぶと触ってなかったので色々動いてましたがちゃんと見てません。

gem update

とりあえずさくらのレンサバも仕様が変わっているかもしれないので、いったんはRailsをインストールして普通に進めてみようと思います。

 

とりあえず今の状況を把握

参考サイトは前回と同じです。

Ruby on Railsをはじめよう | Mitakalab:

Railsを入れます。

$ gem install rails --no-ri --no-rdoc
Successfully installed rails-4.1.8
8 gems installed

Sqliteは入れてないのでMysqlを指定します。

$ rails new mitakalab-twitter -d mysql

さて、ファイル生成してみてみますがどうなるか。

$ rails g controller users index show

Could not find a JavaScript runtime

 

仮にroot権限があったりLinuxだったらGemfileの

# gem 'therubyracer', platforms: ruby

をコメントアウトしてbundle install とすれば解決です。さようなら。

 

では本題に戻ります。
うむ、以前とどうやら変わっていないようですね。
rails s / rails g ともにダメです。

OSのバージョンは現在

$ uname -ro
FreeBSD 9.1-RELEASE-p15

さて、今の状態を説明しますと、ググるとすぐに出てきますがFreebsdでlibv8とtherubyraceのインストールでこけるという問題がまだ続いているので色々調べている状態です。

 

まずチャレンジしたこと

GCCをアップグレード

nable to find a compiler officially supported by v8.
It is recommended to use GCC v4.4 or higher

何故かというと上のエラーが気になったので、試してみたのですがこれまたなかなか大変でした。
ちなみにデフォは4.2です。

$ gcc -v
gcc version 4.2.1 20070831 patched [FreeBSD]

4.4を入れようと思います。

$ wget http://core.ring.gr.jp/pub/GNU/gcc/gcc-4.4.4/gcc-4.4.4.tar.gz

まずはいきなり./configureしてみました。

configure: error: Building GCC requires GMP 4.1+ and MPFR 2.3.2+.

うすうす分かっていましたが、gmpとmpfrを入れろとの事。
Versionを確認したのさと言い訳して先に進む。

最初にgmpをインストールしましょう。
オプションはこれでOKかと思います。
なんでmpmrなんてディレクトリ名なのかというと、先にgmpを入れないといけないのに、mpfrを入れようとしてエラーが出たけどそのままやっちゃったんですね~。
しかもスペルを間違えてるというバカっぷり。

./configure --prefix=/home/USER/mpmr/

Libraries have been installed in:
   /home/USER/mpmr//lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/sh ./mkinstalldirs /home/USER/mpmr//include
mkdir /home/USER/mpmr/include
 /usr/bin/install -c -m 644 gmp.h /home/USER/mpmr//include/gmp.h
/bin/sh ./mkinstalldirs /home/USER/mpmr//include
/bin/sh ./mkinstalldirs /home/USER/mpmr//info
mkdir /home/USER/mpmr/info
 /usr/bin/install -c -m 644 ./gmp.info /home/USER/mpmr//info/gmp.info
 /usr/bin/install -c -m 644 ./gmp.info-1 /home/USER/mpmr//info/gmp.info-1
 /usr/bin/install -c -m 644 ./gmp.info-2 /home/USER/mpmr//info/gmp.info-2
 install-info --info-dir=/home/USER/mpmr//info /home/USER/mpmr//info/gmp.info

では続いて、mpfrを入れますが、ここではgmpのパスを指定します。
さっき間違えたパスのまま進めたので、ずっとmpmrのままですorz

$ ./configure --prefix=/home/USER/mpmr/ --with-gmp=/home/USER/mpmr/

ranlib /home/USER/mpmr/lib/libmpfr.a
----------------------------------------------------------------------
Libraries have been installed in:
   /home/USER/mpmr/lib
Libraries have been installed in:
   /home/USER/mpmr//lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/sh ./mkinstalldirs /home/USER/mpmr//include
mkdir /home/USER/mpmr/include
 /usr/bin/install -c -m 644 gmp.h /home/USER/mpmr//include/gmp.h
/bin/sh ./mkinstalldirs /home/USER/mpmr//include
/bin/sh ./mkinstalldirs /home/USER/mpmr//info
mkdir /home/USER/mpmr/info
 /usr/bin/install -c -m 644 ./gmp.info /home/USER/mpmr//info/gmp.info
 /usr/bin/install -c -m 644 ./gmp.info-1 /home/USER/mpmr//info/gmp.info-1
 /usr/bin/install -c -m 644 ./gmp.info-2 /home/USER/mpmr//info/gmp.info-2
 install-info --info-dir=/home/USER/mpmr//info /home/USER/mpmr//info/gmp.info

ここまでは大したことはなかったのですが、ここからだんだん大変になってきます。

gmake[2]: *** [configure-stage1-target-libgcc] エラー 1
gmake[1]: *** [stage1-bubble] エラー 2
gmake: *** [all] エラー 2

config.logを見ろとあるので(気づくのにだいぶかかったのだが)素直に見ましょう。

$ cat ./x86_64-unknown-freebsd9.1/libgcc/config.log | grep "not found"
Shared object "libmpfr.so.2" not found, required by "cc1"
Shared object "libmpfr.so.2" not found, required by "cc1"

ないと言われるのだが、あるのでしっかりここだよここ!としてあげます。

$ ls -l /home/USER/mpmr/lib/ | grep libmpfr.so.2
lrwxr-xr-x  1 USER  users       12 11月 19 02:11 libmpfr.so -> libmpfr.so.2
-rwxr-xr-x  1 USER  users   963649 11月 19 02:11 libmpfr.so.2

どこでやるかと言うと

LD_LIBRARY_PATH

こいつです。
./bash_profileに指定しました。

で、もう1度!で上手くいきました。

Libraries have been installed in:
   /home/USER/bin/lib

そして、よく見ると毎回メッセージでちゃんと教えてくれていた訳ですね。

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag

LD_LIBRARY_PATHに追加するように書いてあります。

これでGCC4.4が入ったのですが、GCCのMakeはかなり時間とリソースを食います。
-s -g4オプションで4並列でgmakeしましたが、Loadaverageも10ほどになりました。

これが出来上がったGCC。ちゃんとライブラリとかいろいろ設定しましょう。

$ gcc-4.4  -v
Using built-in specs.
Target: x86_64-unknown-freebsd9.1
▒▒▒▒ե▒▒▒▒▒▒ץ▒▒▒▒: ./configure --prefix=/home/USER/bin --program-suffix=-4.4 --disable-multilib --with-gmp=/home/USER/mpmr --with-mpfr=/home/USER/mpmr
▒▒▒▒åɥ▒ǥ▒: posix
gcc version 4.4.4 (GCC)

文字化けしちゃうんだが、動作には問題ないです。

ではでは、ここらでいったん必要なものをまとめてみます。
通常であればFreeBSD 9 で amd64の場合は

gem install libv8 -v '3.3.10.4' -- --with-system-v8
gem install therubyracer -v '0.10.2' -- --with-v8-dir

この組み合わせのはずです。

参考サイト

libv8とtherubyracer入らない問題にわたしもハマったメモ - 青いの:

GCCもバージョンあげたし大丈夫だあ!という事でやってみたら。
全然無理でした。

ハッと思ったのが、ローカルからぶっこむとどうだろうかと思ったのですが。

$ gem install --local therubyracer-0.10.2.gem
Building native extensions.  This could take a while...
Successfully installed libv8-3.3.10.4
Building native extensions.  This could take a while...
ERROR:  Error installing therubyracer-0.10.2.gem:
        ERROR: Failed to build gem native extension.

    /home/USER/.rbenv/versions/2.1.5/bin/ruby extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling rr.cpp
rr.cpp: In function 'VALUE rr_define_finalizer(VALUE, void*, VALUE)':
rr.cpp:48: warning: control reaches end of non-void function
compiling v8.cpp
In file included from v8.cpp:16:
v8_locker.h:6:7: warning: no newline at end of file
In file included from v8.cpp:17:
v8_debug.h:6:7: warning: no newline at end of file
In file included from v8.cpp:18:
v8_v8.h:6:7: warning: no newline at end of file
compiling v8_array.cpp
v8_array.cpp:48:2: warning: no newline at end of file
compiling v8_callbacks.cpp
compiling v8_context.cpp
compiling v8_date.cpp
v8_date.cpp:34:2: warning: no newline at end of file
compiling v8_debug.cpp
In file included from v8_debug.cpp:2:
v8_debug.h:6:7: warning: no newline at end of file
compiling v8_exception.cpp
v8_exception.cpp:10: warning: '<unnamed>::stack' defined but not used
compiling v8_external.cpp
v8_external.cpp:10: warning: '<unnamed>::references' defined but not used
compiling v8_function.cpp
In file included from /home/USER/bin/include/c++/4.4.4/vector:61,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h: In function '_OI std::__copy_move_a(_II, _II, _OI)':
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: expected primary-expression before ')' token
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: there are no arguments to '__is_pod' that depend on a template parameter, so a declaration of '__is_pod' must be available
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:391: error: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:396: error: '__simple' cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:397: error: template argument 2 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h: In function '_BI2 std::__copy_move_backward_a(_BI1, _BI1, _BI2)':
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:587: error: expected primary-expression before ')' token
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:587: error: there are no arguments to '__is_pod' that depend on a template parameter, so a declaration of '__is_pod' must be available
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:592: error: '__simple' cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_algobase.h:593: error: template argument 2 is invalid
In file included from /home/USER/bin/include/c++/4.4.4/vector:62,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/allocator.h: At global scope:
/home/USER/bin/include/c++/4.4.4/bits/allocator.h:146: error: expected primary-expression before ')' token
/home/USER/bin/include/c++/4.4.4/bits/allocator.h:146: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available
/home/USER/bin/include/c++/4.4.4/bits/allocator.h:163: error: expected primary-expression before ')' token
/home/USER/bin/include/c++/4.4.4/bits/allocator.h:163: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available
In file included from /home/USER/bin/include/c++/4.4.4/vector:63,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/stl_construct.h: In function 'void std::_Destroy(_ForwardIterator, _ForwardIterator)':
/home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:116: error: a function call cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:116: error: template argument 1 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:117: error: invalid type in declaration before '(' token
/home/USER/bin/include/c++/4.4.4/bits/stl_construct.h:117: error: invalid use of qualified-name '::__destroy'
In file included from /home/USER/bin/include/c++/4.4.4/vector:64,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator)':
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:115: error: a function call cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:116: error: a function call cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:116: error: template argument 1 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function 'void std::uninitialized_fill(_ForwardIterator, _ForwardIterator, const _Tp&)':
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:170: error: a function call cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:170: error: template argument 1 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:171: error: invalid type in declaration before '(' token
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:171: error: invalid use of qualified-name '::uninitialized_fill'
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h: In function 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&)':
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:223: error: a function call cannot appear in a constant-expression
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:223: error: template argument 1 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:224: error: invalid type in declaration before '(' token
/home/USER/bin/include/c++/4.4.4/bits/stl_uninitialized.h:224: error: invalid use of qualified-name '::uninitialized_fill_n'
In file included from /home/USER/bin/include/c++/4.4.4/vector:65,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/stl_vector.h: In member function 'void std::vector<_Tp, _Alloc>::swap(std::vector<_Tp, _Alloc>&)':
/home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available
/home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: '__is_empty' was not declared in this scope
/home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: template argument 2 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_vector.h:939: error: invalid type in declaration before '(' token
In file included from /home/USER/bin/include/c++/4.4.4/vector:66,
                 from v8_function.cpp:2:
/home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h: In member function 'void std::vector<bool, _Alloc>::swap(std::vector<bool, _Alloc>&)':
/home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: there are no arguments to '__is_empty' that depend on a template parameter, so a declaration of '__is_empty' must be available
/home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: '__is_empty' was not declared in this scope
/home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:759: error: template argument 2 is invalid
/home/USER/bin/include/c++/4.4.4/bits/stl_bvector.h:760: error: invalid type in declaration before '(' token
*** [v8_function.o] Error code 1

Stop in /home/USER/lib/ruby/gem/gems/therubyracer-0.10.2/ext/v8.

make failed, exit code 1

Gem files will remain installed in /home/USER/lib/ruby/gem/gems/therubyracer-0.10.2 for inspection.
Results logged to /home/USER/lib/ruby/gem/extensions/x86_64-freebsd-9/2.1.0-static/therubyracer-0.10.2/gem_make.out

Successfully installed libv8-3.3.10.4が出たところでぬか喜びさせられましたが結局無理でした。
これをクリアすれば解決かなぁとうすうす感じていたので引くに引けない状態で、それが3日ほど続きましたw

 

いろいろなバージョンのv8とtherubyracerだったらどや!

また諦めようと思いかけたのですが、v8とtherubyracerにfreebsd版がある事に気づいたのでいろいろなパターン試してみました。

これが正しいバージョンのはずですが。

$ gem list v8

*** LOCAL GEMS ***

libv8 (3.3.10.4 ruby amd64-freebsd-8)
libv8-freebsd (3.3.10.4)


$ gem list therubyracer

*** LOCAL GEMS ***

therubyracer-freebsd (0.11.1)

$ gem list therubyrhino

これです。
まぁ、これもダメだったんですけどね。
その他、libv8を1個にするのも試したし、Bundleに指定するのも試しましたがダメですた。

ガンガン進めてログも残してないので何も載せれませんw

 

めげずにダウンロードできる全てのバージョンで試しましたが

Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs 
for a list of available runtimes. (ExecJS::RuntimeUnavailable)

(´・ω・`)

 

 

execjsでも、therubyrhinoも試しましたが同じく、Javascriptのruntimeがないと仰る同じ結果でした。

$ gem list execjs

*** LOCAL GEMS ***

execjs (2.2.2)
$ gem list therubyrhino

*** LOCAL GEMS ***

therubyrhino (2.0.4)
therubyrhino_jar (1.7.4)

 

だが今回はまだあきらめなかった!

逆転裁判だったらこの辺でのりうつった綾里千尋が出てくるところらへん。

Node.jsを入れる

過去にも参考にしていた

JavaScriptエンジンをインストールする - 祈れ、そして働け ~ Ora et labora:

こちらでも色々な方法があるぜよ!と記載されているので、じつは前回にも解決できたのかもしれないが、そこは当時と今との経験と引き出しの違いだってことで。

参考サイト

root権限なしでNode.js、MongoDBをインストールする方法:

手順は参考サイトを見て進めてね。

$ node -v
v0.10.33

よし、入りました!!
この手順でlibexecinfoも入りました。

レンサバでPortsCollectionからインストールする手順もググると出てきますので、そっちでもいいかもしれません。

 

さあ、閉めにいきますか。

簡単なものを作成してみます。

$ rails new testrails -d mysql

次rails gでエラーが出なければこちらの勝利です。

$ rails g controller users index show
      create  app/controllers/users_controller.rb
       route  get 'users/show'
       route  get 'users/index'
      invoke  erb
      create    app/views/users
      create    app/views/users/index.html.erb
      create    app/views/users/show.html.erb
      invoke  test_unit
      create    test/controllers/users_controller_test.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    test_unit
      create      test/helpers/users_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.js.coffee
      invoke    scss
      create      app/assets/stylesheets/users.css.scss

トゥットゥル ━━(゚∀゚)━━━━━!!

長かった・・・。

Mysqlの設定をconfig/database.ymlに書き換えよう。

$ rails s

rails

libv8-freebsdとNode.jsでOKだったってことで。

javascript - therubyracer or nodejs, which should I use? - Stack Overflow:
StackOverflowでネタにもなっていました。

 

あじゃじゃしたー (●´ω`●)

 

Similar Posts:


Leave a Reply

Your email address will not be published. Required fields are marked *