RMagick のインストールでコケる問題

昨日から、自分の Lion 環境上で rmagick を使う Rails プロダクトの Bundle install 時に、

/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for /usr/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... *** 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=/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/ruby
/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:452:in `try_cpp'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:834:in `block in have_header'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:254:in `open'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:276:in `postpone'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for'
        from /Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/mkmf.rb:833:in `have_header'
        from extconf.rb:193:in `<main>'

というエラーで rmagick のインストールに失敗するという現象に悩まされていたのですが、
単純にググってもそれらしい情報に行き当たらず、苦労していたので原因と解決方法をメモしておきます。

まず、この環境ですが、ImageMagick を brew で入れた時から怪しいところがありました。

% brew install imagemagick
==> Downloading http://downloads.sf.net/project/machomebrew/Bottles/imagemagick-6.7.1-1-bottle.tar.gz
File already downloaded in /Users/xxx/Library/Caches/Homebrew
==> Pouring imagemagick-6.7.1-1.bottle.tar.gz
==> Caveats
Some tools will complain unless the ghostscript fonts are installed to:
  /usr/local/share/ghostscript/fonts
ln: Wand.pc: Permission denied
Error: The linking step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link imagemagick'
==> Summary
/usr/local/Cellar/imagemagick/6.7.1-1: 1389 files, 32M

良く見ると、途中でエラーを吐いています。シンボリックリンクが作れなかったから、手動で brew link しろと。
単純に実行しただけだと ” ln: Wand.pc: Permission denied ” を解決できず同じ様に死んでしまうものの、 sudo で実行すると完了し、一見問題ないように見えます。
しかし、肝心の rmagick のインストール時には上記のようなエラーになってしまいました。

bundle が悪いのかと思って、単純に

% gem install rmagick

しても、同じでした。冒頭のエラーを良く見ると

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.

とあるので、mkmf.log を読んでみる事に。

% less ~/.rvm/gems/ruby-1.9.2-p290/gems/rmagick-2.13.1/ext/RMagick/mkmf.log
checking for Ruby version >= 1.8.5... -------------------- yes

--------------------

find_executable: checking for /usr/bin/gcc-4.2... -------------------- yes

--------------------

find_executable: checking for Magick-config... -------------------- yes

--------------------

checking for ImageMagick version >= 6.4.9... -------------------- yes

--------------------

checking for HDRI disabled version of ImageMagick... -------------------- yes

--------------------

"/usr/bin/gcc-4.2 -o conftest -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-darwin11.0.1 -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1 -I.  -I/usr/local/Cellar/imagemagick/6.7.1-1/include/ImageMagick  -I/usr/local/Cellar/imagemagick/6.7.1-1/include/ImageMagick -fopenmp conftest.c  -L. -L/Users/xxx/.rvm/rubies/ruby-1.9.2-p290/lib  -L/usr/local/Cellar/imagemagick/6.7.1-1/lib -L/usr/X11/lib    -L/usr/local/Cellar/imagemagick/6.7.1-1/lib -lMagickCore -llcms -ltiff -lfreetype -ljpeg -L/usr/X11/lib -lfontconfig -lXext -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lgomp -lpthread -lltdl  -lruby.1.9.1-static  -lpthread -ldl -lobjc "
ld: library not found for -llcms
collect2: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main() {return 0;}
/* end */

-llcms を見つけられないのが原因だったようです。
liblcms とはなんぞ、と思ってググったらこのページに引っ掛かりました。Libraries for the Little CMS Engine というものらしいので、 再度この名前でググると、どうやらカラーマネジメントシステムのライブラリみたい。

しかし、必要なら brew が依存性解決に入れてくれているだろうと見てみると

$ brew list
cmake          imagemagick     jpeg          little-cms     mysql          nkf          readline     zsh
gdbm          jasper          libtiff          mongodb          netcat          pidof          wget

案の定、little-cms というソレらしいのが居ます。
が、ここで先程、brew で ImageMagick 入れようとしたときにエラーが出ていたのを思い出しました。
依存性解決のために自動で入れる途中で、同じようなエラーに遭遇して、little-cms パッケージが正常にインストールされていないのではないかという仮説を思いつき、この腐った brew 環境を叩き直すために、お医者様の力を借りる事にします。

% brew doctor
Unbrewed dylibs were found in /usr/local/lib.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libmacfuse_i32.2.dylib
    /usr/local/lib/libmacfuse_i64.2.dylib
    /usr/local/lib/libosxfuse_i32.2.dylib
    /usr/local/lib/libosxfuse_i64.2.dylib

Unbrewed .pc files were found in /usr/local/lib/pkgconfig.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected .pc files:
    /usr/local/lib/pkgconfig/osxfuse.pc

Unbrewed .la files were found in /usr/local/lib.

If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected .la files:
    /usr/local/lib/libosxfuse_i32.la
    /usr/local/lib/libosxfuse_i64.la

/usr/local/lib/pkgconfig isn't writable.
This can happen if you "sudo make install" software that isn't managed
by Homebrew.

If a brew tries to write a .pc file to this folder, the install will\nfail during the link step.

You should probably `chown` /usr/local/lib/pkgconfig

Some "config" scripts were found in your path, but not in system or Homebrew folders.

`./configure` scripts often look for *-config scripts to determine if software packages
are installed, and what additional flags to use when compiling and linking.

Having additional scripts in your path can confuse software installed via Homebrew if
the config script overrides a system or Homebrew provided script of the same name.

/usr/X11R6/bin
    freetype-config libpng-config libpng15-config

brew doctor は概ね、勝手に /usr/local 以下に入ったosxfuseがお気に召さないようですが、

/usr/local/lib/pkgconfig isn’t writable.
This can happen if you “sudo make install” software that isn’t managed
by Homebrew.

If a brew tries to write a .pc file to this folder, the install will\nfail during the link step.

You should probably `chown` /usr/local/lib/pkgconfig

大事なのはおそらくここでしょう。
見ると osxfuse インストール時に作られたたらしいこのディレクトリは

drwxr-xr-x 4 root wheel 136 9 27 22:02 pkgconfig

と、root 権限で置かれていました。これを自分に chown し、

% brew uninstall little-cms
% brew install little-cms

としたら、案の定、/usr/local/lib/pkgconfig 内に、先程までは存在しなかった、lcms.pc というファイルが作られました。little-cms の環境がやはり不完全だったようです。
この状態で、ImageMagick も再インストールすると

% brew uninstall imagemagick
% brew install imagemagick

bundle install で RMagick のインストール時に失敗する事は無くなりました。
環境系のトラブルは面倒ですね。

preload preload preload