2013年07月30日

MacVim KaoriYaをSnow Leopard + Homebrewでビルドした

06/27の記事にMacVimの導入記を書いたが、一昨日MacVim KaoriYaのサイトを覗いてみたら、最新バージョン(20130713版テストリリース)のリリース情報が掲載されていた。Vimの最新の機能であるif_lua(プログラミング言語Luaを使ってVimスクリプトプログラムを書ける機能)に対応したものらしい。これをSnow Leopard用にビルドできるか挑戦してみたら、試行錯誤を繰り返して二日がかりで何とかビルドに成功した。同じ事をやってみたい人は結構いるんじゃないだろうか。有益な情報だと思うので、この作業の記録を残しておく。ビルドを試みたのは以下の環境。

 Mac OS X 10.6.8 Snow Leopard
 Xcode 4.2 + Command Line Tools(デフォルトコンパイラ:LLVM-GCC 4.2.1 build 2336.1.00)
 Homebrew 0.9.4

MacVim KaoriYaの最新版のバイナリパッケージはLion/Mountain Lion用は配布されているが、Snow Leopard用は配布されていない。Snow LeopardでMacVim KaoriYaを使いたい場合は、古いバージョンのバイナリパッケージ(本記事投稿時、20120509リリースが最後のSnow Leopard対応版)を利用するか、ソースからビルドする必要がある。

Homebrew環境でMacVim KaoriYa(20130713版テストリリース)をソースからビルドするには、以下のフォーミュラをあらかじめインストールしておく必要がある。

 python 2.7.x     Python 2.7以降ならどのバージョンでも良い
 mercurial        pythonフォーミュラを先にインストールしておくこと
 python 3.3.2     --use-clang」オプションをつけないとビルドできない(前記事を参照)
 ruby 2.0.0-p247 「--with-suffix」オプションをつけてインストールすること
 lua 5.1.5
 lua52 5.2.1     「brew tap homebrew/versions」でリポジトリ追加後にインストール可
 luajit 2.0.2

MacVim KaoriYaをビルドするために、私が実際に行った作業手順を以下に記す。
  1. 最初に、MacVim KaoriYa本体と依存パッケージのフォーミュラ定義ファイルをダウンロードした。
    $ wget -P /Library/Caches/Homebrew/Formula https://raw.github.com/splhack/homebrew-splhack/master/cmigemo-mk.rb
    $ wget -P /Library/Caches/Homebrew/Formula https://raw.github.com/splhack/homebrew-splhack/master/ctags-objc-ja.rb
    $ wget -P /Library/Caches/Homebrew/Formula https://raw.github.com/splhack/homebrew-splhack/master/gettext-mk.rb
    $ wget -P /Library/Caches/Homebrew/Formula https://raw.github.com/splhack/homebrew-splhack/master/macvim-kaoriya.rb

    /Library/Caches/Homebrew/Formulaというディレクトリへフォーミュラ定義ファイルを置くと、Homebrewはそれらをリポジトリに属さないローカルなフォーミュラとして認識してくれるようだ。

  2. brew edit FORMULA」コマンドを使ってcmigemo-mk, ctags-objc-ja, gettext-mkの各フォーミュラ定義ファイルを開き、いずれも以下のとおりに編集した。
    -    ENV.macosxsdk '10.7'
    - ENV.append 'LDFLAGS', '-mmacosx-version-min=10.7 -headerpad_max_install_names'
    + ENV.macosxsdk '10.6'
    + ENV.append 'LDFLAGS', '-mmacosx-version-min=10.6 -headerpad_max_install_names'

  3. すべての依存フォーミュラをインストールした(依存関係により、nkfとautoconfもインストールされる)。
    $ brew install --HEAD cmigemo-mk
    $ brew install --HEAD ctags-objc-ja
    $ brew install gettext-mk

    私の環境では、ctags-objc-jaのインストール時に次のような警告メッセージが表示された。
    $ brew install --HEAD ctags-objc-ja
    .... ....
    .... ....
    .... ....
    .... ....
    ==> make install
    Warning: Could not link ctags-objc-ja. Unlinking...
    Error: The `brew link` step did not complete successfully
    The formula built, but is not symlinked into /usr/local
    You can try again using `brew link ctags-objc-ja'

    Possible conflicting files are:
    /usr/local/bin/ctags -> /usr/local/Cellar/ctags/5.8/bin/ctags
    /usr/local/include/readtags.h -> /usr/local/Cellar/ctags/5.8/include/readtags.h
    /usr/local/share/man/man1/ctags.1 -> /usr/local/Cellar/ctags/5.8/share/man/man1/ctags.1
    /usr/local/lib/readtags.o -> /usr/local/Cellar/ctags/5.8/lib/readtags.o
    ==> Summary
    /usr/local/Cellar/ctags-objc-ja/HEAD: 8 files, 396K, built in 22 seconds

    ctagsというフォーミュラがすでに存在していると、上の警告メッセージが表示されるようだ。この警告に対応するために、以下のコマンドを実行した。
    $ brew unlink ctags
    $ brew link ctags-objc-ja

  4. brew edit macvim-kaoriya」でMacVim KaoriYaのフォーミュラ定義ファイルを開き、以下のとおりに編集した。
    +    ENV.store 'CC', '/usr/bin/clang'
    ENV.remove_macosxsdk
    - ENV.macosxsdk '10.7'
    - ENV.append 'MACOSX_DEPLOYMENT_TARGET', '10.7'
    - ENV.append 'CFLAGS', '-mmacosx-version-min=10.7'
    - ENV.append 'LDFLAGS', '-mmacosx-version-min=10.7 -headerpad_max_install_names'
    - ENV.append 'VERSIONER_PERL_VERSION', '5.12'
    - ENV.append 'VERSIONER_PYTHON_VERSION', '2.7'
    + ENV.macosxsdk '10.6'
    + ENV.append 'MACOSX_DEPLOYMENT_TARGET', '10.6'
    + ENV.append 'CFLAGS', '-mmacosx-version-min=10.6'
    + ENV.append 'LDFLAGS', '-mmacosx-version-min=10.6 -headerpad_max_install_names'
    + ENV.append 'VERSIONER_PERL_VERSION', '5.10.0'
    + ENV.append 'VERSIONER_PYTHON_VERSION', '2.6'

  5. MacVim KaoriYaの本体フォーミュラのインストールを実行した(ビルド処理はインストールの過程で実行される)。
    $ brew install --HEAD macvim-kaoriya
    ==> Cloning https://github.com/splhack/macvim.git
    Cloning into '/Library/Caches/Homebrew/macvim-kaoriya--git'...
    remote: Counting objects: 3217, done.
    remote: Compressing objects: 100% (2848/2848), done.
    remote: Total 3217 (delta 479), reused 2242 (delta 295)
    Receiving objects: 100% (3217/3217), 14.38 MiB | 151.00 KiB/s, done.
    Resolving deltas: 100% (479/479), done.
    Checking connectivity... done
    Checking out files: 100% (3002/3002), done.
    ==> ./configure --prefix=/usr/local/Cellar/macvim-kaoriya/HEAD --with-features=huge --enable-multibyte --enable-netbeans --with-tlib=ncurses --enable-cscope --enable-perlinterp=dynamic --enable-pythoninterp=dynamic --enable-python3interp=dynamic --enable-rubyinterp=dynamic --enable-ruby19interp=dynamic --enable-luainterp=dynamic --with-lua-prefix=/usr/local --enable-lua52interp=dynamic --with-lua52-prefix=/usr/local/Cellar/lua52/5.2.1
    Warning: inreplace: replacement of '-L/usr/local/Cellar/readline/6.2.2/lib' with '' failed
    ==> make
    ==> make
    ==> install_name_tool -change /usr/local/opt/gettext-mk/lib/libintl.8.dylib @executable_path/../Frameworks/libintl.8.dylib /usr/local/Cellar/macvim-kaoriya/HEAD/MacVim.app/Contents/MacOS/Vim
    ==> install_name_tool -change /usr/local/lib/libmigemo.1.1.0.dylib @executable_path/../Frameworks/libmigemo.1.1.0.dylib /usr/local/Cellar/macvim-kaoriya/HEAD/MacVim.app/Contents/MacOS/Vim
    /usr/local/Cellar/macvim-kaoriya/HEAD: 2060 files, 42M, built in 3.3 minutes

  6. ビルドとインストールが終了した後の後片付け的な作業として、次のコマンドを実行した(最後のコマンドは、ctagsが存在している場合のみ実行すれば良い)。
    $ brew uninstall cmigemo-mk
    $ brew uninstall ctags-objc-ja
    $ brew uninstall gettext-mk
    $ brew link ctags

    MacVim KaoriYaの依存フォーミュラに含まれる実行ファイルやライブラリはインストール時にすべてMacVimアプリ(MacVim.app)の中に組み込まれる。ビルドが完了したらこれらのファーミュラは不要となるので、アンイストールしても構わない。

ビルド処理が正常に終わると、/usr/local/Cellar/macvim-kaoriya/HEADというディレクトリが作成されて、この中にMacVim.appがインストールされる。次のコマンドを実行すると、Finderでこのディレクトリのウィンドウが開く。
$ open /usr/local/Cellar/macvim-kaoriya/HEAD

このウィンドウからMacVim.appを起動して、GUI版MacVimの動作確認を行った。
MacVim-Homebrew_Celler_macvim-kaoriya-FinderWindow-SCShot3077-756x438
MacVim_7.4a.9_BETA-KaoriYa_20130713-GUI_StarupWindow-SCShot3080-578x400.png
ひと通り使ってみて特に問題はないようなので、MacVim.appのリンクを「アプリケーション」ファルダの中に作成した。
$ ln -s /usr/local/Cellar/macvim-kaoriya/HEAD/MacVim.app /Applications

最後に、MacVimをCLI環境から使うための設定を.zshrc(bashを使っている場合は、.bash_profile.bashrc)へ追加した上で(06/27の記事を参照)、ターミナルからMacVimを起動できるか確認した。
MacVim_7.4a.9_BETA-KaoriYa_20130713-CLI_StarupWindow-SCShot3081-505x342.png
こちらも特に問題なく使えるようだった。

LionとMountain Lionでは最新版のMacVimを使っていたが、Snow Leopardだけはいままで古いバージョンを利用していた。これで、やっとSnow Leopard環境でも最新版のMacVimが使えるようになった。やれやれ。

【2013/07/31 追記】

本記事の内容の中で、手順4で示したmacvim-kaoriya.rbに対する以下の追加設定が最大のTips情報じゃないかと思う。
+    ENV.store 'CC', '/usr/bin/clang'

このTipsを発見するまで、macvim-kaoriyaフォーミュラのビルドを20回位繰り返してしまった。作業後記的な内容になるが、最終的にこのTipsにたどり着くまでの過程も書いておく。フォーミュラのインストール時に問題が発生したときの原因究明の方法として参考情報になるんじゃないだろうか。

上の設定を加えていないmacvim-kaoriya.rbで同フォーミュラのインストールを行うと、ビルド処理で下のようなエラー発生していた。
$ brew install --HEAD macvim-kaoriya
.... ....
.... ....
.... ....
.... ....
==> make
==> make
The following build commands failed:
ProcessPCH /var/folders/0g/0gJQyP+3Fp8VP2o8x1ZV+U+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/AppKit-aecgaphphqschsdfwnfucbvwbygl/AppKit.h.gch /System/Library/Frameworks/AppKit.framework/Headers/AppKit.h normal x86_64 objective-c com.apple.compilers.llvmgcc42
(1 failure)
make[1]: *** [macvim] Error 65
make: *** [first] Error 2

READ THIS: https://github.com/mxcl/homebrew/wiki/troubleshooting


参考ページEに載っていた情報から、MacVimはLLVM-GCCではなくClangでコンパイルする必要があることはすぐに判った。Xcode 4.2のデフォルトコンパイラはLLVM-GCCだ。それで「--use-clang」や「HOMEBREW_CC="clang"」を使って「brew instal」を実行してみたが、上のエラーは解決せずメッセージの内容もまったく変化しなかった。

Homebrewには「brew install --interactive FORMULA」というコマンド(いわゆる対話モード)が存在していて、これを使うと、ソース展開とパッチ適用後に処理が停止してシェルが起動する。このモードを使って、シェルの起動後にXcodeからsrc/MacVim/MacVim.xcodeprojを開いて、同プロジェクト内のすべてのコンパイラ設定を「LLVM GCC」から「Apple LLVM compiler」(Clang)に変更した上でフォーミュラのインストールを再実行してみたが、それでもエラーメッセージが下のように変わっただけだった。
The following build commands failed:
ProcessPCH /var/folders/0g/0gJQyP+3Fp8VP2o8x1ZV+U+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/AppKit-cavbwwzljiowuebyijkvejsxfmbx/AppKit.h.pth /System/Library/Frameworks/AppKit.framework/Headers/AppKit.h normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
make[1]: *** [macvim] Error 65
make: *** [first] Error 2

そして、さらに調べていくと、「brew install --interactive FORMULA」の実行時に「CC=cc」という環境変数が存在していることを発見した。「--use-clang」や「HOMEBREW_CC="clang"」を指定しても、この環境変数の値は変化していなかった($HOMEBREW_CCの値はちゃんと変化していた)。この事実から、MacVimのconfigureスクリプトは$CCの値だけでコンパイラコマンドのパスを認識しているのではないかという推論が浮かんだ。対話モードの中で、「export CC=clang」と環境変数の設定を変更した上で「./configure」と「make」を実行すると、エラーメッセージの最後の部分が「com.apple.compilers.llvmgcc42」から「com.apple.compilers.llvm.clang.1_0.compiler」へ変化したことで、この推論が正しいという確信を持った。それで、対話モードのシェルの中で「export CC=/usr/bin/clang」とコンパイラコマンドをフルパスで指定してやったら、ようやくMacVimをビルドすることに成功した(この問題を解決するのに二日間悩んでいたので、ビルドが通った瞬間に「やったー」と叫んでしまった)。

という訳で、Snow Leopard + Xcode 4.2 + Homebrew環境でのMacVim KaoriYaビルド時の障害の原因を究明するために「brew install --interactive FORMULA」というコマンドがとても役に立った。また、フォーミュラのインストール時に~/Library/Logs/Homebrew/FORMULAディレクトリの中にログファイルが作成されるが、これらのファイルからもいくつかの収益な情報が得られた。もしHomebrewでフォーミュラをインストールするときに問題に遭遇したら、この2つを上手く利用すると良いだろう。そうすれば、ほとんどのケースで問題の原因が判明するんじゃないかと思う(問題の原因が判明しても、その原因の解決策をどうやって実現するかで悩む場合はあるだろうが・・・)。

【参考ページ】

  1. splhack/homebrew-splhack ・ GitHub
  2. homebrew-splhack/macvim-kaoriya.rb at master ・ splhack/homebrew-splhack ・ GitHub
  3. Building - macvim-kaoriya - MacVim-KaoriYaのビルド方法 - MacVim KaoriYa - Google Project Hosting
  4. Readme - macvim-kaoriya - はじめにお読みください - MacVim KaoriYa - Google Project Hosting
  5. Building ・ b4winckler/macvim Wiki ・ GitHub


タグ:Homebrew MacVim
posted by とみやん at 18:21| Comment(0) | TrackBack(0) | 開発・プログラミング > Mac
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/71512104

この記事へのトラックバック