12 / 22

2016

Linuxで香り屋Vimのビルドを自動化する

Vim(その2) Advent Calendar 22日目

この記事はVim(その2) Advent Calendar 2016の22日目のエントリーです。昨日は凡人さんの続・初めてのプラグイン作成 - 最小限なvimプラグインでした。明日はJpnLavenderさんです。

香り屋版Vim、使ってますか?

さっそくですが、Windows使いの皆さん、香り屋Vimを使っていますか?僕も使ってます。まあ、Vim初心者なので使いこなせているかといえば使いこなせてないですが・・・。

それはさておき、Windowsで使っているならLinuxでも香り屋Vimを使いたいって思うことはありますよね(・・・ありますよね?)

ご存知のように、Windowsなら香り屋版公式バイナリが配布されていますし、MacでもMacVim-kaoriyaというプロジェクトのおかげでHomebrewなどを使うことにより楽に入手ができるのですが、Linuxディストリビューションにはそのようなパッケージはありません。じゃあお前が作れよって声が聞こえてきそうですがそれは置いておいて、今回はパッケージがないなら自分でビルドしよう。で、どうせならビルドも1コマンドでできるように自動化しようという話です。

香り屋版VimをLinuxでビルドする

香り屋VimをLinuxでビルドするだけなら実は以前にも記事を書いています。

ArchLinuxでKaoriya-Vimをビルド(Git版) - THE SNOWBALL

基本的にはこの記事の内容とほとんど変わらないですが、Gitでブランチを切ったりパッチを当てたりというのが意外と面倒くさいのでもっと簡単にしたいなと思っていたところ、下記の記事に巡り遇いました。

Vimの全てを最新に保つ(VAC2014) - c4se記:さっちゃんですよ☆

我ながらアホですが、シェルスクリプトでやればいいんじゃん!というのに今さら気づきました(汗)

で、書いてみたのが下記のGistに貼ったスクリプトです。

update-vim.sh

あまり複雑なことをやっているわけではないですが、以下簡単に解説していきます。

前提条件

  • gcc環境
  • Git
  • cmigemo
  • guilt(Gitでのパッチ管理ツール)

cmigemo,guiltのインストールは上の僕の過去記事を参照してください。

シェルスクリプトでビルドを自動化

さて、必要なツールやソースコードが揃ったら、上記のGistに貼ったシェルスクリプトを実行すれば最新のVimが香り屋パッチを当てた上でビルドされます。以下、何をやっているか解説していきます。

香り屋Vimのソースコードを取得

香り屋Vim(vim-kaoriya)のリポジトリをGitHubからクローンします。

% cd ~/src
% git clone https://github.com/koron/vim-kaoriya.git

ソースコードを最新の状態に更新する

WORK=$HOME/src/vim-kaoriya
cd $WORK
git checkout master
git pull
git submodule update

3-7行目: vim-kaoriyaディレクトリに移動し、githubからgit pullして最新に更新するとともに、同梱されているサブモジュールも更新します。

cd $WORK/vim
git checkout master
git pull
ver=`git tag | tail -n 1`
git checkout -b $ver

8-12行目: vim-kaoriyaディレクトリ下にあるVim本体のディレクトリに移動し、最新のコミットをチェックアウトします。

※本当はすでに香り屋版でテストされているパッチレベルにVim本体のコミットが合っているのでそのまま作業していいのですが、あえてより新しいコミットで試みています(当然以降の作業でコケる可能性があるので嫌な方は上記の行を削ってお試しください)。

途中、変数verにtagの末尾(つまり最新のパッチレベル)を代入しています。というのも、以下でguiltを使う際にチェックアウトしただけでブランチを切っていないままだとパッチが適用できないと怒られるためです。

パッチの適用

Vimのリポジトリで($ver)という名前のブランチを作ったら、guiltでパッチを当てます。

git config guilt.patchesdir $WORK/patches
cp -rf $WORK/patches/master $WORK/patches/$ver
guilt init
cd $WORK/vim
guilt push -a

git config guilt.patchesdir コマンドでguiltで当てるパッチの場所を指定します。この場合はvim-kaoriya/直下にあるpatches/ というディレクトリ(中身は koron/vim-kaoriya-patches というリポジトリ)です。

guilt init コマンドで guilt/$ver というディレクトリが patches/ 直下に生成されます。ここがあてたいパッチを入れる場所なのですが、そのままだと実質空です。そこで guilt init の前にあらかじめ patches/master/ の中にある香り屋パッチ本体をコピーして同名のディレクトリを作ります。

vimディレクトリに移動し、guilt push -a ですべてのパッチが適用されます。ここでソースコードとパッチに何か齟齬があればエラーが出て止まります。

cmigemoに対応したconfigureの作成

香り屋パッチを適用すると、vim/src/configure.in にmigemoに関する設定が生成されます。しかし、vim/src/auto/configure は自動的には更新されませんから、このまま ./configure しても-enable-migemo オプションが有効になりません。 vim/src に移動してから make autoconf を実行します。

cd $WORK/vim/src
make autoconf

これで、vim/src/auto/configure が更新され、中身をのぞいてmigemoで検索すると関数やヘッダファイル名でヒットするはずです。

configure、そしてmake

ここまで来たら、あとは ./configure してコンパイルするだけです。

ただしこのとき注意しなければならないのは、上記で make autoconf した直後は vim/src/ にいるので、1つ上の vim/ に戻ってから ./configure する必要がある点です。

cd $WORK/vim
LIBS="-lmigemo" ./configure \
--prefix=/usr/local \
--with-features=huge \
--enable-gui=gtk2 \
--enable-multibyte \
--enable-perlinterp \
--enable-pythoninterp \
--enable-python3interp \
--enable-tclinterp \
--enable-rubyinterp \
--enable-luainterp \
--with-luajit \
--enable-gpm \
--enable-cscope \
--enable-fontset \
--enable-migemo \
--enable-fail-if-missing

さて、configureするときのオプションですが、これは人によって好みがあるので僕が使った設定を紹介するに留めます。

ただし、+migemoなVimにするためには以下の2点だけは忘れないでください。

  • ./configure の前にLIBS="-lmigemo"を指定する。
  • --enable-migemo オプションを指定する。

make & インストール

configureして特に問題なければコンパイルしてインストールするだけです。

make
sudo make install

これでインストール自体は終了ですが、後々同じソースコードを更新して再ビルドするときのために、リポジトリをきれいにしておきます。

make distclean
cd $WORK/vim
git checkout -- src/auto/configure
git checkout master
git branch -D $ver
git branch -D guilt/$ver
cd ../patches
rm -rf $ver
cd ..
git submodule update
cd

42-52行目ではvim/ディレクトリで変更されたsrc/auto/configure を元の状態に戻し、さらにmasterブランチに切り替えたあとで、パッチを当てる際に作った2つのブランチを削除します。また patches/ ディレクトリも作業中に作成した $ver という名のディレクトリを削除します。またvim-kaoriya/ ディレクトリに戻り、サブモジュールを初期状態に戻して完了です。

最後に

最後まで読んでいただきありがとうございました。

Category

computer

Tags

#vim
#linux