南極の図書館

ペンギンが寝ていた…。

MacOSX LionでのRubyの扱い方、またはllvm-gccについて。

はじまりはgem install sqlite3-rubyが上手くいかなかったこと。
gemが悪いのかsqlite3が悪いのかと調べていったら、最終的な原因はLion(Xcode)のgccだった。
※以降、LionのXcodeを入れることでインストールされるgccをllvm-gccと記載する。

目次

  • 環境
  • 迷走の記録
  • Xcodeの更新
  • gccのインストール
  • 解決
  • 参考サイト

環境

今回の作業開始時の環境は以下の通り。

  • iMac Mid 2010(プリインストールはSnowLeopard)
  • Xcodeインストール済み
  • Ruby1.8.7
  • gem1.3.7
  • OSをSnowLeopardからLionに更新した

迷走の記録

備忘として、簡単なまとめ。

  1. gem install sqlite3-rubyでエラー。
  2. sqlite3をyumかMacportsでいれろと言われるが、port install sqlite3 +universalでエラー。
  3. portのためにXcodeを更新する。(数時間かかる)
  4. port install sqlite3 +universalは成功。
  5. それでもgem install sqlite3-rubyでエラー。
  6. 何が悪いのかわからず、実験としてrvmの1.9.2で試すとすんなり入る。これはこれで困る。
  7. rvmで1.8.7を入れたらsqlite3-rubyも入るんじゃないかと閃く。(systemのRubyはもう諦めよう。)
  8. rvm install 1.8.7は成功するが、gemコマンドで右のようなエラー。(略)/ruby/1.8/timeout.rb:60: [BUG] Segmentation fault
  9. 検索するとllvm-gccだと上記のエラーとなるらしいのでgccを入れる。
  10. rvm install 1.8.7をやり直し、sqlite3-rubyを入れると成功。
  11. もしや?と思いsystemのRuby(1.8.7)でsqlite3-rubyを入れると成功。


要するに、全部llvm-gccが悪い!
(逆に考えるとRuby1.8系が悪い(古い)、ということにもなるが。)


なお、rvmについてはこちら。
Rubyの複数バージョンを共存させるgem。rvmとpikについて - holyppの日記


sqlite3-rubyで何度も出たエラーはこちら。

iMac% sudo gem install sqlite3-ruby
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3-ruby:
	ERROR: Failed to build gem native extension.

/opt/local/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** 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
	--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=/opt/local/bin/ruby
	--with-sqlite3-dir
	--without-sqlite3-dir
	--with-sqlite3-include
	--without-sqlite3-include=${sqlite3-dir}/include
	--with-sqlite3-lib
	--without-sqlite3-lib=${sqlite3-dir}/lib
	--enable-local
	--disable-local


Gem files will remain installed in /opt/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.5 for inspection.
Results logged to /opt/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.5/ext/sqlite3/gem_make.out

Xcodeの更新

(2012/7/23追記)この項は行わず、次項の「gccのインストール」のみ行っても動作すると思います。急ぎでxcodeが不要の方は飛ばして下さい。


上記のとおり、gemだけじゃなくMacportsもエラーを出すし、どうしようか困っていた。
調べていると「LionにしたらXcodeは入れなおせ」と各所に書いているので入れ直す。
AppStoreから無料でインストールできるが時間がかかる。3Gほどあり、1時間どころじゃないのでしばらく放置した。
Mac App Store - Xcode
※↑リンクがうまくいかなければ「xcode app store」などで検索して下さい。


Xcodeを入れ直す理由は、Lionにするとgccやmakeが消えるからということ。これはひどい。
Macportsがエラーを出してたのもXcodeを入れ直すことで解消され、sqlite3がインストールできた。
(sudo port clean libeditしろとは言われたけど。)


そして、Ruby1.8系などを除けばこれで十分動くんだろうけど、実はここで入ったllvm-gccが諸悪の根源だった。

iMac% gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gccのインストール

port install sqlite3 +universal が成功するも gem install sqlite3-ruby のエラーメッセージは変わらず。
systemのRubyを消すのもはばかられるし、rvmで1.8.7を入れてメインにしようと考える。
結局それはllvm-gccのせいで失敗するのだが。
ログを取ってなかったのでllvm-gccを使って再現しようとしたら、今ではしっかり教えてくれて再現すらできなかった。

iMac% rvm install 1.8.7-head
The provided CC(/usr/bin/gcc) is LLVM based, it is not yet fully supported by ruby and gems, please read `rvm requirements`.


当初は rvm install 1.8.7-head は成功したように見え gem install sqlite3-ruby で [BUG] Segmentation fault というエラーが出ていた。
そこから検索するとllvm-gccが悪いという情報が出てくるので、gccをこちらからインストール。
kennethreitz/osx-gcc-installer · GitHub
readmeの OS X 10.7 Lion: GCC-10.7.pkg からダウンロードして実行するだけ。

そして環境変数CCを.bash_profileに書き、ターミナルを再起動する。

iMac% echo "export CC=/usr/bin/gcc-4.2" >> ~/.bash_profile

その場限りなら export CC=/usr/bin/gcc-4.2 とコマンドを打つだけで良い。

解決

sqlite3を入れるのにここまで苦労するとは思わなかった。
いろいろとやってきたが、結局、問題はllvm-gccだけだったのだ。

iMac% echo $CC
/usr/bin/gcc-4.2

iMac% ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10]

iMac% gem -v
1.3.7
iMac% gem list

*** LOCAL GEMS ***

actionmailer (2.3.5)
actionpack (2.3.5)
activerecord (2.3.5)
activeresource (2.3.5)
activesupport (2.3.5)
i18n (0.4.2)
mime-types (1.16)
mysql (2.8.1)
rack (1.1.0, 1.0.1)
rails (2.3.5)
rake (0.9.0)
rest-client (1.6.1)
rubygems-update (1.3.7)


iMac% sudo gem install sqlite3-ruby
Building native extensions.  This could take a while...

#######################################################

Hello! The sqlite3-ruby gem has changed it's name to just sqlite3.  Rather than
installing `sqlite3-ruby`, you should install `sqlite3`.  Please update your
dependencies accordingly.

Thanks from the Ruby sqlite3 team!

<3 <3 <3 <3

#######################################################

Successfully installed sqlite3-1.3.5
Successfully installed sqlite3-ruby-1.3.3
2 gems installed
Installing ri documentation for sqlite3-1.3.5...

No definition for libversion

Enclosing class/module 'mSqlite3' for class Statement not known
Installing ri documentation for sqlite3-ruby-1.3.3...
Installing RDoc documentation for sqlite3-1.3.5...

No definition for libversion

Enclosing class/module 'mSqlite3' for class Statement not known
Installing RDoc documentation for sqlite3-ruby-1.3.3...
iMac% 

お疲れ様。