brew installでコケたので回避してみた話

今回のお題

Error: groonga 4.0.7 did not build
Logs:
     /Users/homebrew/Library/Logs/Homebrew/groonga/01.configure
     /Users/homebrew/Library/Logs/Homebrew/groonga/01.configure.cc
     /Users/homebrew/Library/Logs/Homebrew/groonga/02.make
     /Users/homebrew/Library/Logs/Homebrew/groonga/02.make.cc
     /Users/homebrew/Library/Logs/Homebrew/groonga/config.log

These open issues may also help:
groonga 4.0.8 (https://github.com/Homebrew/homebrew/pull/34541)

そもそもの発端

mrubyです。

groongaでなぜかruby_evalruby_loadが使えない。なんでかなー、brew install mrubyしとかないとダメとかかなーなどとあてずっぽうに調べたり試したりするが変わりない。念のためとFormulaを見てみても、たしかに--with-mrubyconfigureに渡している。

あれ? with?

--enable-mrubyだよな。

エラーが起きるようになってしまった

そういうわけで--enable-mrubyを渡すようにして、これでmrubyできるぞーと期待をふくらませていら、コケるようになってしまった。

make中にコケているので02.makeログを見る。するとこんなエラーが出ていた。

libtool: link: cannot find the library `../vendor/onigmo-source/libonig.la' or unhandled argument `../vendor/onigmo-source/libonig.la'

brew install--debug

--debugを付けておくとbrew installでコケたら、その時点でもごもごできる。逆にこれがなければ結果によらずソースツリー消えてしまって哀しい。

さて、--debug付きでbrew installを実行し、改めて問題が起きることを確認する。--debug付きだとエラーが起きたところで「どうする?」とたずねられることになる。

libtool: link: cannot find the library `../vendor/onigmo-source/libonig.la' or unhandled argument `../vendor/onigmo-source/libonig.la'
make[3]: *** [libgroonga.la] Error 1
make[2]: *** [install-recursive] Error 1
make[1]: *** [install] Error 2
make: *** [install-recursive] Error 1
/usr/local/Library/Homebrew/debrew.rb:10:in `raise'
BuildError: Failed executing: make install 
1. raise
2. ignore
3. backtrace
4. irb
5. shell
Choose an action:

5と回答してシェルを起動して、どういう状態になっているかを見てことにする。

シェル起動時のカレントディレクトリはソースコードツリーのトップである。まずはファイルがほんとうにないことを念のため確認しておく。

bash-3.2$ ls vendor/onigmo-source

たしかにlibonig.laがない。いや、というか、.oファイルも一切ない。なんと。

いったんシェルを終了せて、再度表示される選択肢には1と回答してbrew installをコケさせておく。そして02.makeログからonigmo-sourceに関係しそうなところを見ていってみれば——予想通りにちょっとおかしい。

Making install in vendor
Making install in onigmo
make[2]: Nothing to be done for `install'.
Making install in mruby
/Applications/Xcode.app/Contents/Developer/usr/bin/make  install-am
  CC       parse.lo
[...]

vendor/onigmo以下で何もしようとしていない? なるほど。コケるわけだ。だが、なぜ?

--debugで回避策を探る

実際にやってみよう。

再び--debug付きでbrew installを実行し、エラーが出たところでやはり5と回答する。念のためvendor/onigmo-source以下にlibonig.laがないことを確認し、vendorディレクトリでmake installを実行してみる。

bash-3.2$ cd vendor/
bash-3.2$ make install
Making install in onigmo
make[1]: Nothing to be done for `install'.
Making install in mruby
/Applications/Xcode.app/Contents/Developer/usr/bin/make  install-am

うん、なるほど。なんでかなーといろいろ試してみているうちに、うっかり手がすべって単にmakeだけ実行してしまった。

bash-3.2$ make
Making all in onigmo
cd ../onigmo-source && /Applications/Xcode.app/Contents/Developer/usr/bin/make all
[...]
make[1]: Nothing to be done for `all-am'.
bash-3.2$ ls onigmo-source/libonig.la
onigmo-source/libonig.la

あら、これならいけるんだ。

brew edit

それじゃあFormulaをいじっちゃおう。といっても発端からしてFormulaをいじっているわけですが。

brew edit groongaするとGroongaのためのFormulaをエディタで開いてくれる。これに手を加えてセーブする。あとはbrew installでコケないこと、たしかにruby_evalruby_loadが使えるようになっていることを確認する。

brew editした結果はLibrary/Formula以下にある。そして今回の差分

$ cd $(brew --repository)/Library/Formula
$ git diff
diff --git a/Library/Formula/groonga.rb b/Library/Formula/groonga.rb
index 66a643d..441bddc 100644
--- a/Library/Formula/groonga.rb
+++ b/Library/Formula/groonga.rb
@@ -28,7 +28,7 @@ class Groonga < Formula
       --prefix=#{prefix}
       --with-zlib
       --disable-zeromq
-      --with-mruby
+      --enable-mruby
       --without-libstemmer
     ]

@@ -38,6 +38,7 @@ class Groonga < Formula

     # ZeroMQ is an optional dependency that will be auto-detected unless we disable it
     system "./configure", *args
+    system "make"
     system "make install"
   end
 end

一つめのハンクがwith→enableの修正。二つめのハンクが今回のエラーの、とりあえずの回避策。