sci

最果て風呂

Vim の各種インタプリタを有効にしてビルドする(除くPython)

Vim の configure オプションをいじってみる

今までに何度も挑戦しているお話。Mac で使っている Vim でも ruby 機能を有効にしてやろうと

./configure --enable-multibyte --enable-gui=no --with-features=big --enable-rubyinterp --with-ruby-command=/usr/local/bin/ruby

として configure する。config log には下記のようなエラーらしきものが見えるけど気にしないでおこう。意訳してみると「古くてダサい Configure のかわりに RbConfig を使う」ってことかな。いや、命令形だから使えってことかも。私の英語力なんてこんなものさ。

checking Ruby version... OK
checking Ruby header files... /usr/local/include/ruby-1.9.1
 -e:1: Use RbConfig instead of obsolete and deprecated Config.

make install をして :version にて確認してみると、+ruby でビルドされている。いよいよ Vim を起動してコマンドモードから

:ruby print "hello"

と入力するのだが

dyld: vim Undefined symbols:
                            _rb_encdb_declare

と悲しい結果となり、ターミナルを再起動するはめになってしまった。やはり環境が古いのだろうか?

脱線して Ruby のこと

Stack Overflow などをちょろっと調べてみたところ、Ruby をビルドする時に -rdynamic -Wl,-export-dynamic を使えという投稿を見掛けたけど、これって Vim と関係なさそうだしなぁ。

/usr/local/lib/ を覗いてみると libruby-static.a しか存在してなくて dylib 等が無かった。これが原因なのかなぁ。ということで

./configure CFLAGS="-D_SC_GETGR_R_SIZE_MAX=0 -Wno-long-double" --enable-shared --disable-install-doc

のオプションで Ruby を再度ビルドしてみたら下記の通り失敗に終ってしまった。今度は Ruby がビルドできなくなってしまってマズイ...。

/usr/bin/libtool: internal link edit command failed
make: *** [libruby.1.9.1.dylib] Error 1

あ〜、なんかこれ以前にも同じようなことがあった気がするなぁ。諦めたんだったよ。

もうちょい調べてみる。libtool を使う時は -fno-common というオプションを付けないといけないらしい。configure スクリプトによって作成された Makefaile には CFLAGS の部分にちゃんと書かれていたので、これが問題というわけではなさそう。

make clean をしてから再度やってみると、下記のような別のエラーになっちゃった。

compiling compiler ripper.y
ripper.y:614: unrecognized: %parse_param
ripper.y:614:    Skipping to next %
make[2]: *** [ripper.c] Error 1

Ruby から離れて bison について(最終的には Ruby にも Vim にも戻るよ)

2 ちゃんねる情報によると bison が古いとこの手のエラーが出るらしい。

> bison --version
GNU Bison version 1.28

こりゃ古いな。bison をアップデートするために別のライブラリもアップデートしなくちゃならくて、さらに... な状態になったら嫌だなぁ。と思ったら make には bison は関係ないらしい。どっちなんだ。

bison 2.5 をビルドしてやろうと README を見たら m4 1.4.6 が必要らしい。で、

> m4 --version
GNU m4 1.4

となっており、早くも負のスパイラルに突入してしまった。インストール記録を見てみると、かつて m4 1.4.9 まではインストールが出来ていたので、再度インストールすることにした。どうして現状が 1.4 なのかというと、かつて OS がクラッシュしてしまったからなんですね。で、面倒になったので不急不要なものは最新のものにしていなかったという。

というわけで、必要になったので bison をビルドする。テストにものすごく時間がかかったけど、無事に 2.5 をインストールすることができた。Ruby に戻ってまたやり直しだ。

Ruby に戻ったよ

よっしゃ〜、Ruby のシェアードライブラリ版のビルドに成功。2 ちゃんねる情報は正しかった。test は「PASS all 943 tests」と表示されたので、とりあえずは大丈夫そう。/usr/local/lib を見ると

libruby-static.a        libruby.1.9.1.dylib  libruby.dylib 
libruby.1.9.1-static.a  libruby.1.9.dylib   

のようにライブラリが増えてた。今更ながら思ったのだけど名前は 1.9.1 なのね。

Vim に戻ったよ

よしよし、やっと Vim のビルドにいける。ということで最初と同じオプションでビルドしてインストールしたのだが、今度は Terminal を終了することすら出来なくなってしまった。失敗か?

万全を期すために make clean の後に iBook を再起動してから Vim のビルドをやり直すとうまくいった。コマンドモードで

:ruby print "hello"

を入力すると、めでたく「hello」が表示された。よっしゃ〜!ちなみに Mac なので ruby.vim で警告が出る(詳しくはここを参照)ことはなかった。これからいろいろといじってみよう。

追記

調子に乗って dynamic にして Lua も使えるようにしてみる実験。オプションは下記。

./configure --enable-multibyte --enable-gui=no --with-features=big --enable-rubyinterp=dynamic --with-ruby-command=/usr/local/bin/ruby --enable-luainterp=dynamic --with-lua-prefix=/usr/local

ビルドはできたものの、コマンドを実行すると下記の通り失敗。

E370: Could not load library liblua5.2.so
Lua library cannot be loaded.
  
E370: Could not load library libruby.1.9.1.bundle
E266: Sorry, this command is disabled, the Ruby library could not be loaded.

どちらもライブラリをロードできなかったとのこと。またしても /usr/local/lib 以下を確認してみると下記のように存在していない。

liblua.a  liblua5.1.a 
libruby-static.a        libruby.1.9.1.dylib  libruby.dylib 
libruby.1.9.1-static.a  libruby.1.9.dylib   

Lua は 5.2 をインストールしてあるのにライブラリのバージョンが 5.1 のままとはこれ如何に。しかも .so って名前は linux 等の UNIX 系じゃないの。Rubylibruby.1.9.1.bundle が新しく出てきた。bundle って何よ。

Ruby の方は下記のようにリンクを張ることで動作するようになったけど、ものすごく遅くなった。これは元に戻そう。

sudo ln -s libluby.1.9.1.dylib libruby.1.9.1.bundle

Lua のシェアードライブラリを作成する方法ってどうやるのかしら。make macosx しか知らないんだけど。5.1a は liblua.a へのリンクになっているので、とりあえず

sudo ln -s liblua.a liblua5.2.a

のように 5.2a 向けにリンクを張って Vim のオプションを dynamic から yes に変更してビルドし直そう。このリンク張りをやっておかないと if_lua コンパイル時点でエラーになってしまうから。

ついでに perl も有効にさせることにして、最終的なオプションは下記。

./configure --enable-multibyte --enable-gui=no --with-features=big --enable-rubyinterp=yes --with-ruby-command=/usr/local/bin/ruby --enable-luainterp=yes --with-lua-prefix=/usr/local --enable-perlinterp=yes

これで LuaPerl も使えるようになった。

Python が仲間はずれになっているけれど、Python 自身を正常にビルドができないので除外している。Mercurial を使いたいしスクリプトの実行速度も速いので普段使いにしたいのだけど、ビルドできなきゃしゃ〜ないじゃん。Hello, world 程度なら問題なく動くのだが、いくつかのモジュールが生成されないのだ。