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