2011年9月19日月曜日

rails3.1 on FreeBSD

rails3.1をインストールしてみるが、「Could not find a JavaScript runtime.」と出てしまう。 解決さくとして、Gemfileに「gem 'execjs'; gem 'therubyracer'」を入れて、bundle installすれば良いとあるが、 FreeBSDの場合 TheRubyRacerのインストールに失敗する。
原因は3つ
  • libv8のインストールに失敗している
    gem install therubyracerでlibv8が一緒にインストールされる。libv8は特にエラー無くインストールが終了するので、正常かと思ってしまうのだが、どうもインストールに失敗しているようす。以下のエラーが出る。
    c++ -shared -o v8.so v8_v8.o v8_callbacks.o v8_weakref.o v8_date.o v8_context.o v8_handle.o v8_external.o rr.o v8_function.o v8_exception.o v8_try_catch.o v8_string.o v8.o v8_value.o v8_message.o v8_array.o v8_debug.o v8_locker.o v8_template.o v8_script.o v8_object.o -L/usr/home/seike/rails/r3.1.test/vendor/bundle/gems/libv8-3.3.10.2/lib/libv8/build/v8 -Wl,-R/usr/home/seike/rails/r3.1.test/vendor/bundle/gems/libv8-3.3.10.2/lib/libv8/build/v8 -L. -L/usr/local/lib -Wl,-R/usr/local/lib -L.  -rpath=/usr/lib:/usr/local/lib -pthread -rdynamic -Wl,-soname,v8.so   -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby18 -lpthread  -lcrypt -lm -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread  -lv8
    /usr/bin/ld: cannot find -lv8
    *** Error code 1
    
    makeとgmakeの使い分けが出来ていないので、発生していると思われる。 libv8のディレクトリに移動して、gmakeと打ちましょう。
    % cd  vendor/bundle/gems/libv8-3.3.10.2/lib/libv8
    % gmake
    
    libv8のコンパイルが始まります。
  • execinfo.hが無いというエラーがでて、FreeBSDでは「libexecinfo」をインストールしろというtipsもある。
    しかしながら、単純にインストールしても結局エラーになる。なので、bundle installを実行するときに「--with-opt-dir=/usr/local」が付与されるように、 以下の設定をしましょう。
    % vi ~/.bundle/config
    BUNDLE_BUILD__THERUBYRACER: --with-opt-include=/usr/local/include
    
  • 実は上の「--with-opt-dir」をしても、作成されるv8.soが不十分。それはlibexecinfoがリンクされていないから。 そのためrake等を実行した場合エラーになる。libexecinfoをリンクされるように、無理矢理Makefileを修正して、v8.soを再作成する。
    % cd vendor/bundle/ruby/1.8/gems/therubyracer-0.9.4/ext/v8 
    % vi Makefile
        LIBSの最後に「-lexeinfo」を追加。
        LIBS = $(LIBRUBYARG_SHARED) -lpthread  -lcrypt -lm -L/usr/lib  -rpath=/usr/lib:/usr/local/lib -pthread  -lv8 -lexecinfo
    %  rm v8.so
    % make <- v8.soが再作成される。
    % cp v8.so ../../lib/
    
とっても疲れましたー。libv8はエラーも何も出ないんだから、原因わからんつーの。 そもそもextconf.rbの書き方が十分じゃないんだと思うんだよね。どう直せば良いのか分らないんだけど。
bundlerにて、gemインストール時に設定するオプションの付けかた。

mysqlのビルド時に--with-mysql-configを自動的に設定するやりかたです。
% bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config


マニュアル(http://gembundler.com/rationale.html)に書いてありました。

0 件のコメント: