箱のプログラミング日記。

えんじにあ奮闘記

ffiがインストールできない

f:id:y_hakoiri:20191102121618j:plain

ffiが突然インストールできなくなったためメモ。

発生したエラー

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.23/ext/ffi_c
/Users/hako/.rbenv/versions/2.4.3/bin/ruby -r ./siteconf20210305-76026-11y60wk.rb extconf.rb
checking for ffi_call() in -lffi... yes
checking for ffi_closure_alloc()... yes
checking for ffi_raw_call()... yes
checking for ffi_prep_raw_closure()... yes
checking for shlwapi.h... no
checking for rb_thread_blocking_region()... no
checking for rb_thread_call_with_gvl()... yes
checking for rb_thread_call_without_gvl()... yes
checking for ffi_prep_cif_var()... yes
creating extconf.h
creating Makefile

current directory: /Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.23/ext/ffi_c
make "DESTDIR=" clean

current directory: /Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.23/ext/ffi_c
make "DESTDIR="
compiling AbstractMemory.c
compiling ArrayType.c
compiling Buffer.c
compiling Call.c
Call.c:334:5: error: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
    rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL);
    ^
./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region'
# define rbffi_thread_blocking_region rb_thread_call_without_gvl
                                      ^
1 error generated.
make: *** [Call.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.23 for inspection.
Results logged to /Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-18/2.4.0/ffi-1.9.23/gem_make.out

An error occurred while installing ffi (1.9.23), and Bundler cannot continue.
Make sure that `gem install ffi -v '1.9.23' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  bootstrap-sass was resolved to 3.3.7, which depends on
    sass was resolved to 3.5.6, which depends on
      sass-listen was resolved to 4.0.0, which depends on
        rb-inotify was resolved to 0.9.10, which depends on
          ffi

久しぶりに触るプロジェクトだったので明確な理由が特定できず。。

試したこと

結論から言うと、Gemfile.lockを削除してbundle installしたら通りました。

ただ、かなりいろいろ試して最後の強行突破だったのと、ffiはインストールできたけど他のところで依然エラーは解消しなかったためあまりお勧めしません(詳しくは最後の「おまけ」を読んでもらえれば)

とりあえずやったこと全て書いていきます

Xcodeをインストールする

Xcodeをインストールしたら直ったという記事があったのでインストールしてみた。

‎「Xcode」をMac App Storeで

元々XcodeはインストールせずCommand Line Toolsだけをインストールしていたので

$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

$ xcode -version
bash: xcode: command not found

XcodeのアプリケーションをApp Storeからインストールしてbundle installしてみたけど、変わらず。

インストール先のpathを確認

bundle install実行時のインストール先を見てみると

/Users/hako/Project/sample_app/vendor/bundle/ruby/2.4.0

ちゃんと--path vendor/bundle配下になっているのでこれは問題なさそう。

bundlerのバージョンを変えてみる

bundlerのバージョンを確認すると

$ bundle -v
Bundler version 1.17.3

1.17.3になっている。

これは記憶ベースになってしまうのだけど、以前チーム内で「1.17系だとインストールうまくいなかったから下げてね〜」という流れになり、指示通りバージョンを戻したら通ったのを思い出した。

なので当時使用していた1.16.1に戻してみる。

$ gem uninstall bundler -v 1.17.3
Successfully uninstalled bundler-1.17.3

$ gem install bundler -v 1.16.1
Successfully installed bundler-1.16.1

$ bundle -v
Bundler version 1.16.1

$ bundle install

これでもやっぱりエラー変わらず。

Gemfile.lockを削除してみる

こういう強行突破的なことはやりたくなかったのだけど、どうにもならないので一旦リセットする思いで実行

するとffiのエラーは解消したものの、次はnokogiriでエラーになりました。笑

おまけ

今回はGemfile.lockのリフレッシュでffi自体のインストールはうまくいったけど、Homebrewをupdateすれば良かったかもしれない。

その後のnokogiriのエラーはこちらで解消したので、定期的にbrew updateする必要があるかもしれないです。

$ brew update

brew updateしようとしたところ、またこちらでもエラーが発生したのですが、下記の記事とおり対応したところすんなりいきました。

ログを残していなかったので参考記事のリンクだけ。

Homebrew で Error: homebrew-core is a shallow clone が出て brew update が実行できない問題 | gotohayato.com

まとめ

ググった中にはlibffiのシンボリックリンクが貼られていないことが原因との見立てもありましたが自分の場合は関係なさそうでした。

ffi,nokogiri,mysql2,opensslあたりはよくbundle installでハマるっぽくて色々な記事が出てくるので助かりました。

別の記事で書いてますがopensslの問題を解消すればffiもうまくいったかもしれないのでそちらも良かったら見てみてください。

参考

【解決方法】Macで gem ffi の インストール (アップデート) に 失敗する - Qiita

gem ffi のインストールに失敗するときのコンパイラオプション指定方法 - Qiita