2006年3月24日金曜日

Mac 環境構築 その5 - vim のコンパイル [mac]

Mac 環境構築シリーズ,前回から随分間隔があいてしまった.ゆっくり Mac の設定をする時間が取れなかったのもあるけど,vim のコンパイルで結構手間取ってしまったのだ.結論として,現時点で完全に解決はしていないが,ここまでの作業をまとめておきたいと思う.

vim は +migemo でコンパイルしたいので,まずは qkc (cmigemo のインストールで必要) を入れて cmigemo のインストールを行う.

$ fink install qkc

cmigemo のソースコードはこちら.
KaoriYa.net
tarball を解凍して ./configure, make osx-install で完了 (下記の例では開発版を使用).
$ wget http://kaoriya.net/dist/var/cmigemo-1.3c.tar.bz2
$ tar xjvf cmigemo-1.3c.tar.bz2
$ cd cmigemo-1.3c
$ ./configure
$ sudo make osx-install


さて本題.
vim のコンパイルはいつものようにソースコードとパッチを取得して,パッチをあてて,好みのオプションで configure して make && sudo make install ではい終わり,だと思っていたらこれが一筋縄では行かなかった.

まず Intel Mac で vim をコンパイルするにはいくつかの work around を必要とするようだ.私が最初に辿りついたのは,「ちくくんblog」さんのこの記事 で,元ネタは vim-mac ML とのこと.

vim-mac ML を覗いてみると,関連しそうなのはこの辺りの投稿だった.
vim-mac (#3703) : Re: vim for OS X/Intel?
vim-mac (#3709) : Re: Patch to fix compilation on intel macs
vim-mac (#3713) : Re: Patch to fix compilation on intel macs

あと,興味がある方はこちらも一読されると良いだろう.
Technical Note TN2137: Building Universal Binaries from "configure"-based Open Source Projects


以上を踏まえて,vim のコンパイルをまとめてみる (作業ディレクトリは /tmp とする).


ソースコードとパッチを取得.
$ cd /tmp

$ wget ftp://ftp.vim.org/pub/vim/unix/vim-6.4.tar.bz2
$ wget ftp://ftp.vim.org/pub/vim/extra/vim-6.4-extra.tar.gz
$ wget ftp://ftp.vim.org/pub/vim/extra/vim-6.4-lang.tar.gz

$ mkdir patches
$ cd patches
$ wget 'ftp://ftp.vim.org/pub/vim/patches/6.4/6.4.*'
$ cd ..

tarball を解凍してパッチをあてる.
$ tar xjvf vim-6.4.tar.bz2
$ tar xzvf vim-6.4-extra.tar.gz
$ tar xzvf vim-6.4-lang.tar.gz

$ cd vim64

$ for f in ../patches/6.4.* ; do
for> patch -p0 < $f
for> done

上記,vim-mac ML の #3709#3713 のパッチをあてる.自分でコピペして diff file を作ってもいいし,これぐらいであれば手動で編集しても手間ではないだろう.

(※)

上記,vim-mac ML の #3703 を参考に CFLAGS を設定してから,configure (--with-features 以降の configure オプションはお好みで).
$ export  CFLAGS="-O -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
$ ./configure --disable-dependency-tracking --enable-multibyte --enable-gui=carbon --with-features=big

最後に make && make install.
$ make && sudo make install

…とまあこれでひとまず Vim.app ができるわけだ.

$ file ./src/Vim
してみると,
./src/Vim: Mach-O executable i386
と表示され,universal 化されていないようだが,この Intel Mac でしか使わないので気にしないことにする.こだわる方は vim-mac ML #3703 にハック方法があるので参考にされると良いだろう.


私の悩みはここから.
私は普段 vim に香り屋パッチをあてて使用しているが,これだとコンパイルエラーが出るようだ.

作業的には configure する前の上記 (※) のタイミングで香り屋パッチをあてる.現時点での最新パッチは 6.4.000 だ.
KaoriYa.net

$ cd /tmp

$ wget http://www.kaoriya.net/dist/vim-6.4-difj.tar.bz2
$ tar xjvf vim-6.4-difj.tar.bz2

$ cd vim-6.4-difj
$ cp -Rp * ../vim64/
$ cd ../vim64

$ patch -p0 < diffs/kaoriya.diff

src/Makefile の 1162行目,
CARBONGUI_DEFS    -DFEAT_GUI_MAC -arch ppc -fno-common -fpascal-strings 

CARBONGUI_DEFS    -DFEAT_GUI_MAC -arch i386 -arch ppc -fno-common -fpascal-strings 
としておく (念の為).

これで make すると,gui_mac.c でエラーが発生する (長いので適当に省略).
gui_mac.c: In function 'gui_mch_init':
gui_mac.c:3086: error: invalid storage class for function 'tsmproc_pre'
gui_mac.c:3088: error: invalid storage class for function 'tsmproc_post'
gui_mac.c:3092: error: 'tsmproc_pre' undeclared (first use in this function)
gui_mac.c:3092: error: (Each undeclared identifier is reported only once
gui_mac.c:3092: error: for each function it appears in.)
gui_mac.c:3093: error: 'tsmproc_post' undeclared (first use in this function)
gui_mac.c: In function 'gui_mch_init':
gui_mac.c:2934: warning: 'InitCursor' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/QD.framework/Headers/Quickdraw.h:2059)
gui_mac.c:2981: warning: 'SetRect' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/QD.framework/Headers/Quickdraw.h:2401)
gui_mac.c:3036: warning: 'NewRgn' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/ApplicationServices.framework/Frameworks/QD.framework/Headers/Quickdraw.h:2877)
gui_mac.c:3080: warning: 'TEStyleNew' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers/TextEdit.h:1405)
gui_mac.c:3086: error: invalid storage class for function 'tsmproc_pre'
gui_mac.c:3088: error: invalid storage class for function 'tsmproc_post'
gui_mac.c:3092: warning: 'NewTSMTEPreUpdateUPP' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers/TSMTE.h:118)
gui_mac.c:3092: error: 'tsmproc_pre' undeclared (first use in this function)
gui_mac.c:3092: error: (Each undeclared identifier is reported only once
gui_mac.c:3092: error: for each function it appears in.)
gui_mac.c:3093: warning: 'NewTSMTEPostUpdateUPP' is deprecated (declared at /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers/TSMTE.h:129)
gui_mac.c:3093: error: 'tsmproc_post' undeclared (first use in this function)
lipo: can't open input file: /var/tmp//ccpc9YHb.out (No such file or directory)
make[1]: *** [objects/gui_mac.o] Error 1
make: *** [first] Error 2

中身を詳しく解析するのは時間がかかりそうだったので,ひとまず私は src/gui_mac.c の 3072行目,
#ifdef USE_IM_CONTROL

#if 0
とすることで逃げてしまった.私は gvim はほとんど使わない (ターミナルから vim を使う) ので,gui_mac.c のエラーをこうして逃げても問題が起きるかどうかは微妙だが,いずれにしてもお勧めできる対応方法ではない.

ありゃ,しかも ./src/Vim --version してみたら,migemo も -migemo になっているではないか.調べてみたら configure 時のログで,
checking for migemo_open in -lmigemo... no
になっている.migemo.h は見つけられているようだが…


というわけで,現時点ではここまで.
完全ではないが,とりあえず使えそうな vim はできたので解析は後回しにして他の作業を進めたいと思う.


【2006/04/16 追記】
vim70d (+kaoriya) のコンパイルに成功しました.
Peace Pipe: 【続編】Mac 環境構築 その5 - vim のコンパイル [mac]


0 コメント: