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 を指定すると上手く行くかみたいな部分はよくわかってないので、後で調べるか偉い人に聞いてみよう。
コンパイラの優先順位は関係ありませんでした!
eban
@eban
これは-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