2019年5月1日水曜日

Homebrew でインストールした ruby で ffi を使う場合には pkg_config のパスを指定しなければいけない

概要

Mac 上で Ruby を使っている場合に Homebrew でインストールしていると ffi がビルドできない場合があります
libffi も Homebrew でインストールするのですがその場合だと ffi.h が ruby からうまく発見できるエラーになります
最新のバージョンだと発生するようです

環境

  • macOS 10.14.4
  • Ruby 2.6.2p47
  • libffi 3.2.1

エラー全文

bundle install --path vendor などで ruby-ffi がインストールできない場合に発生します
自分が遭遇したエラーの全文は以下の通りです

Fetching ffi 1.9.21
Installing ffi 1.9.21 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21/ext/ffi_c
/usr/local/opt/ruby/bin/ruby -I /usr/local/Cellar/ruby/2.6.2/lib/ruby/2.6.0 -r ./siteconf20190501-58126-xr7vbu.rb extconf.rb
checking for ffi.h... no
checking for ffi.h in /usr/local/include,/usr/include/ffi... no
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
creating extconf.h
creating Makefile

current directory: /usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21/ext/ffi_c
make "DESTDIR=" clean

current directory: /usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21/ext/ffi_c
make "DESTDIR="
Running autoreconf for libffi
/usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21/ext/ffi_c/libffi/autogen.sh: line 2: exec: autoreconf: not found
make: *** ["/usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21/ext/ffi_c/libffi-x86_64-darwin18"/.libs/libffi_convenience.a] Error 127

make failed, exit code 2

Gem files will remain installed in /usr/local/lib/ruby/gems/2.6.0/gems/ffi-1.9.21 for inspection.
Results logged to /usr/local/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-18/2.6.0/ffi-1.9.21/gem_make.out

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

In Gemfile:
  selenium-webdriver was resolved to 3.9.0, which depends on
    childprocess was resolved to 0.8.0, which depends on
      ffi

selenium-webdriverchildprocess に依存しておりそこから ffi に依存しています
内容的には前述した通り ffi.h が見つけられないのが原因です

対応方法

  • brew link --force libffi

を実行すると分かるのですがパスが見えないところにあるので LDFLAGS or PKG_CONFIG_PATH を設定しなさいという警告文が出ます
なので素直に設定しましょう

  • export PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig"

これで再度 bundle install すると問題なくインストールできるはずです

macOS が libffi 自体の Homebrew 経由のインストールを拒否しているのでそれが解消されるまでは上記の環境変数を自分で通すしかなさそうです

0 件のコメント:

コメントを投稿