2013-12-10

nokogiri 1.6 の gem install で libxslt あたりのエラーが出て困ったら GREP_OPTIONS を疑ってみましょう

久しぶりに環境構築系のつらみをあじわいました。
nokogiri を新しい ruby に gem install しようとしたところ、失敗しました。


解決策の要約としては GREP_OPTIONS で --color などを設定しているあたりをコメントアウトしたら上手くいきました。

configure 時の grep 関連の失敗は今回に限らず割とあるらしいですね。その発見があっただけでもよしとしたいところです。いやぁ、地雷は一度は踏み抜いてみるものですなぁ。


※ちなみにここでいう grep コマンドは GNU 版の grep で OSX に標準で入っているBSD 版の grep とは少し異なります。この差異で失敗することもあるようです。

$ /usr/bin/grep --version
grep (BSD grep) 2.5.1-FreeBSD

$ /usr/local/bin/ggrep --version
/usr/local/bin/ggrep (GNU grep) 2.14.56-1e3d

$ brew tap homebrew/dupes && brew install grep --default-names
今回の grep は↑で入る grep です。


もう少し詳しく触れておくと、まず gem install nokogiri が吐いていたエラーは下記の通りです。

$ gem install nokogiri
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

    /usr/local/var/rbenv/versions/2.0.0-p353/bin/ruby extconf.rb
Extracting libxml2-2.8.0.tar.gz into tmp/x86_64-apple-darwin13.0.0/ports/libxml2/2.8.0... OK
Running 'configure' for libxml2 2.8.0... OK
Running 'compile' for libxml2 2.8.0... OK
Running 'install' for libxml2 2.8.0... OK
Activating libxml2 2.8.0 (from /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/noko
giri-1.6.0/ports/x86_64-apple-darwin13.0.0/libxml2/2.8.0)...
Extracting libxslt-1.1.26.tar.gz into tmp/x86_64-apple-darwin13.0.0/ports/libxslt/1.1.26... OK
Running 'configure' for libxslt 1.1.26... ERROR, review 'tmp/x86_64-apple-darwin13.0.0/ports/libxslt/
1.1.26/configure.log' to see what happened.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/local/var/rbenv/versions/2.0.0-p353/bin/ruby
/usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mini_portile-0.5.2/lib/mini_portile
.rb:265:in `block in execute': Failed to complete configure task (RuntimeError)
        from /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mini_portile-0.5.2/lib
/mini_portile.rb:257:in `chdir'
        from /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mini_portile-0.5.2/lib
/mini_portile.rb:257:in `execute'
        from /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mini_portile-0.5.2/lib
/mini_portile.rb:65:in `configure'
        from /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/mini_portile-0.5.2/lib
/mini_portile.rb:108:in `cook'
        from extconf.rb:101:in `block in 
' from extconf.rb:131:in `call' from extconf.rb:131:in `block in
' from extconf.rb:122:in `tap' from extconf.rb:122:in `
' Gem files will remain installed in /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/ nokogiri-1.6.0 for inspection. Results logged to /usr/local/var/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.0/ex t/nokogiri/gem_make.out


そして気になる原因ですが、下記で引用してる nokogiri#issues では --color=auto ならだいじょうぶみたいに書かれていました。

ただ、僕の場合は auto でも失敗していました。


なぜでしょうか。今回失敗していた時点の僕の GREP_OPTIONS は下記の通りです。


$ echo $GREP_OPTIONS
--color=auto --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.git --exclude-dir=.svn --exclude=\*.tmp --directories=recurse --binary-files=without-match


こうして見てみると *.tmp 無視しちゃってるのとか、かなり怪しいですね。
中途半端ですが原因究明はここまでです。

ということで、上記の issue も盛り上がっていたので blog にしてみました。