トップ «前の日記(2012/08/11 (土) ) 最新 次の日記(2012/08/13 (月) )» 編集 RSS feed

HsbtDiary


2012/08/12 (日) [長年日記]

[ruby][ffi][nokogiri] ruby turnk(2.0.0) で nokogiri や ffi をインストールできない時の対処方法

funtoo で動かしている tDiary の CI が1ヶ月くらいずーっとレッドになっていて、その原因は 2.0.0 で nokogiri や ffi をインストールできないということだったんだけど、夏休みなのでガッと調べてみた。

gem i ffi した時のエラーは以下のような内容。

Fetching: ffi-1.1.5.gem (100%)  
Building native extensions.  This could take a while...  
ERROR:  Error installing ffi:  
    ERROR: Failed to build gem native extension.

        /usr/local/rvm/rubies/ruby-head/bin/ruby extconf.rb  
checking for ffi_call() in -lffi... yes  
checking for ffi_prep_closure()... yes  
...(snip)...
compiling Pointer.c  
In file included from Pointer.c:34:0:  
rbffi_endian.h:46:4: エラー: #error "Cannot determine the endian-ness of this platform"  
Pointer.c: 関数 ‘ptr_order’ 内:  
Pointer.c:339:59: エラー: ‘BYTE_ORDER’ が宣言されていません (この関数内での最初の使用)  
Pointer.c:339:59: 備考: 未宣言の識別子は出現した各関数内で一回のみ報告されます  
Pointer.c:339:72: エラー: ‘BIG_ENDIAN’ が宣言されていません (この関数内での最初の使用)  
Pointer.c:351:25: エラー: ‘LITTLE_ENDIAN’ が宣言されていません (この関数内での最初の使用)  
Pointer.c:368:1: 警告: 制御が非 void 関数の終りに到達しました [-Wreturn-type]  
make: *** [Pointer.o] エラー 1

これは何だろうとキーワードでぐぐったり、ruby-ffi のフォーラムを探してみたら、このフォーラムに同じ問題に遭遇して workaround で解決したという人がいた。 どうやら、trunk でコンパイラの優先順位を変えたことによる副作用が原因っぽい。 とりあえず、こんな状況になった時には

gem i ffi — --with-cflags='—std=gnu99'

というように cflags の指定を変更することでインストールはできるようになるみたい。これで何とか CI の方は無事グリーンに戻せた。そもそもなんで gnu99 を指定すると上手く行くかみたいな部分はよくわかってないので、後で調べるか偉い人に聞いてみよう。

追記

コンパイラの優先順位は関係ありませんでした!

これは-ansiの影響だろうな "ruby turnk(2.0.0) で nokogiri や ffi をインストールできない時の対処方法 - HsbtDiary(2012-08-12)" http://t.co/hBfL00Q4 2012-08-12 12:52:56 +0000 Reply Retweet Favorite