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はインストールせず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もうまくいったかもしれないのでそちらも良かったら見てみてください。