Hello Octopress - Build Ruby 2.0 on Mac OS X 10.8

Github 上に公開しているじぶんのプロジェクトについてのメモやノートをブログにして書いていこうと思い立ち、流行の Octpress に手を出すことにしました。その際、ちょっとつまづいたところがあったので、記録しておくことにします。

Git や Ruby には少しは慣れてはいるので、すぐセットアップできるだろうと、午前中の旅番組を観ながら始めたのですが、こうして最初の記事を書き始める頃にはすっかり外が暗くなってしまっていました。尤も、合間合間にご飯食べたり、他のことをしたり、しているのではありますが。

何につまづいたかと言えば、 Mac に Ruby をインストールする、最初の最初のところでした。たぶんどこかで話題になっていると思うのですが、 OpenSSL のライブラリとリンクできない事例が、じぶんのところでも起こりました。

OS は Mac OS X 10.8.4 で、入れようとしている Ruby は ruby 2.0.0p195 。 Octopress が高いバージョンの Ruby を必要とすることもそうですが、どうせなら最新がいいやということで、最近リリースされたばかりだと思っていた 2.0 を使うことにしたのです。

ちなみに、じぶんはプロジェクトごとに、インタプリタまるごとインストールしたいので(環境をまったく分け隔てたいので) rbenv を使ってそれらを管理しているのですが、諸事情あって ruby-build プラグインは使っていません。 ruby-build の配布元 の wiki には、 Mac にインストールするときの注意点が記載されているので、それに従えば単に Ruby をインストールすることはできたのかもしれませんが──、つまるところ諸事情のために、ソースから入れる必要があったのです。だから、今日も configure スクリプトを叩きます。

さて、ダウンロードして、展開、それから configure してそのまま make するとこんなメッセージを見ることになります。 Mac に入っている OpenSSL が古いので、使えないことを伝えて来ています:

Ignore OpenSSL broken by Apple.
Please use another openssl. (e.g. using `configure --with-openssl-dir=/path/to/openssl')
Failed to configure openssl. It will not be installed.

OpenSSL はシステムとは違う場所に、次のようにビルドしました。 shared がミソで、かつ config ではなく Configure darwin64-x86_64-cc ... としたのも、何かの README かフォーラムか、ともかくどこかで見たものでした(どこを見たのかは忘れてしまいました)。

$ ./Configure darwin64-x86_64-cc --prefix=/path/to/MyOpenSSL ¥
    --openssldir=/path/to/MyOpenSSL/openssl shared

そして Ruby のソースに戻って、言われたとおりのオプションを追加してみましたが、 configure スクリプトは、「そんなオプションは知らん」と言うではありませんか。

configure: WARNING: unrecognized options: --with-openssl-dir

これでしばらくハマりました。任意の場所に入れた OpenSSL を configure が見つけてくれずに、システムに入っている OpenSSL を使おうとしてしまうのです。 configure へ渡すオプションがいけないのは、きっとそうなのですが、ドキュメントを見たり、フォーラムなども海外にまでも足を伸ばして、いろいろと探してみたのですが、すっきり解決している例が見つかりません。結局どういうふうに configure に指定したらよいかが分りませんでした。

ただそうしているうち、なにかの折に Makefile を見てみたらば、気がつきました。結局のところ OpenSSL の位置を伝えてあげればいいのだから、それを伝える術がほかにあればそれでよいのではないかと。そしてこのような解決にたどりついたのです:

$ export PKG_CONFIG_PATH=/path/to/MyOpenSSL/lib/pkgconfig
$ export LDFLAGS=`pkg-config --libs openssl`
$ export CFLAGS=`pkg-config --cflags openssl`
$ ./configure --prefix=$HOME/.rbenv/versions/octopress ¥
    --enable-shared --disable-install-doc
$ make

余計ながら pkg-config はたぶん、 Mac には標準では入っていないかと思います。その場合 LDFLAGS と CFLAGS には、次のような値をセットしておきます:

$ export LDFLAGS="-L/path/to/MyOpenSSL/lib -lssl -lcrypto"
$ export CFLAGS="-I/path/to/MyOpenSSL/include"

BK と言われそうですが、これで上手くいきました。

Ruby のビルドは OpenSSL に関する問題があっても、そこで止まることはないのですが、のちのち不都合が起きます。むしろそこでビルドが止まってくれた方がよいと言うものですが、そのまま流れて行ってしまうので、ややともすると気がつかなかったかもしれません。するといつまでもこの問題に気がつかずに、苦い思いを強くしていたかもしれません。

ある程度普及している(とじぶんが勝手に思っている) Mac と Ruby の組み合わせで、このような問題に当たるとは思いも寄らなかったので、不意打ちを喰らったようでした。正直なところ、苦悩の最中には configure のバグというか考慮不足があるんじゃないかと疑ったりもしましたが、このようなちょっとズレた現象に遭遇するのは Mac ではよくあることなので、今回もそういうものかとも思います。考察とは言えませんね、まあ、感想です。

──さて、終いにこの記事の主題を含んでいる冒頭の段落を繰り返しますが、このブログでは Github 上に公開しているじぶんのプロジェクトについてのメモや解説なんかを書いていこうと思います。と言いながらも、さっそくプロジェクトとは関係のない記事を長々書いてしまいました。

ブログを書くということは、本来ならばそのツールがどうこうではなく、ツールを使って作ったコンテンツがどうだ、なのだと思うので、なるべくなら、手段の方ばかりに時間を取られないようにしたいものだと思うと同時に、しかし、そんなところで時間をかけなくても済むように、ニッチな事例でもまとめておくことで、どこかで役立てられる場合もあるのではないか、とも思います。そしてそこには、将来のじぶんに対して、ということも含んでのことでもあるので、当人以外誰も困らないようなごく局所的な問題や開発環境等の話題でも、ときどきは記事にしていきたいと、いまは考えています。