root がなくても git-svn が使いたい

よくあるニーズですね。

以下、Linux 環境でのおはなしです。

使いたいコマンドがインストールされていないなら、野良ビルドして、置けるところに置いて、パスをとおせばいいわけです。

git の野良ビルドなんて特に悩むところなんてないんですが、これが、git-svn を使いたいとなると git 本体だけでなく svnperl バインディングが必要になります。これを、perl が見に行ってくれるところに置くにも root 権限がいるわけで、まあ、デフォルト以外のところも探しに行ってもらうような方法もあるのかもしれませんが、見つけられなかったので、じゃあもう、perl からインストールしちゃおう、というのが以下の手順になります。

なんだかんだと毎年1回くらいこれで苦労してるような気がするので、いい加減なにかメモを書いておこうと思った次第です。

まずインストール先を決める

今回は、${HOME}/.install/ にしました。

で、決めたら、環境変数 PATH と LD_LIBRARY_PATH をこれに合わせて設定しておきます。これが設定されてないと野良ビルドできないやつとかあります。業務の合間にぼちぼちとかいう感じで作業してると、ふつーに数日掛かり *1ということになったりするので、もう .bash_profile (とか、その類のファイル) に書いておきます。

export PATH=${HOME}/.install/bin:${PATH}
export LD_LIBRARY_PATH=${HOME}/.install/lib:${LD_LIBRARY_PATH}

基本的な作業の流れ

目的は、git コマンドが呼びだした → perl インタプリタが → use しようとしているモジュール (svnperl バインディング) を見つけられるようにすること、なので、

  1. Perl モジュールの置き場所と、そこを見に行くインタプリタを用意するために perl野良ビルドしてインストール
  2. Perl モジュールをインストール
  3. そのモジュールを見つけられる perl インタプリタを呼び出すような git コマンドを野良ビルドしてインストール

となります。

ところで、2. の Perl モジュールのインストールですが、これは CPAN にはなく、subversion の tar 玉からインストールすることができます。

依存関係の解決

ディストロのパッケージシステムを使ってインストールするなら、依存関係は自動的に解決して必要なパッケージもインストールしてくれますが、野良ビルドだとそうはいかないわけで、configure スクリプトを実行してはエラーメッセージを読み、必要なライブラリの tar 玉を取ってきてインストールし、make でビルドエラーが起こればまた必要なライブラリの tar 玉を取ってきてインストールし、ってなことを繰り返して必要なコマンドをインストールすることになります。

今回、野良ビルドしたパッケージはこちら。

もちろん、環境は千差万別なので、環境ごとに依存ライブラリは変わるでしょう。このメモが次回にどの程度役に立つかはちょっと心配なところです。

あと、野良ビルドしてインストールしたライブラリは、configure スクリプトは勝手には見つけてくれないことが多いので、そういうときはオプションなどで教えてあげる必要があります。configure スクリプトだと --help オプションでだいたいは分かりますが、Makefile の中を検索してうんぬんみたいなことをしたりなんだり。

手順

実行した手順をスクリプトとしてまとめて書いちゃうと以下になります。

#!/bin/bash -eu

DEST=${HOME}/.install

#
# perl

# gdbm
tar xf ~/.download/gdbm-1.12.tar.gz
cd gdbm-1.12
./configure --prefix=${DEST}
make
make install
cd -

# perl
tar xf ~/.download/perl-5.24.0.tar.gz
cd perl-5.24.0
./Configure -des -Dprefix=${DEST} -Dccflags=-L${DEST}/lib -Dldflags=-L${DEST}/lib
make
make install
cd -


#
# Subverion Perl binding

# apr
tar xf ~/.download/apr-1.5.2.tar.bz2
cd apr-1.5.2
./configure --prefix=${DEST}
make
make install
cd -

# apr-util
tar xf ~/.download/apr-util-1.5.4.tar.bz2
cd apr-util-1.5.4
./configure --prefix=${DEST} --with-apr=${DEST}/bin/apr-1-config
make
make install
cd -

# swig
tar xf ~/.download/swig-3.0.11.tar.gz
cd swig-3.0.11
./configure --prefix=${DEST} --with-perl5=${DEST}/bin/perl
make
make install
cd -

# svn swig-pl
tar xf ~/.download/subversion-1.9.5.tar.bz2
cd subversion-1.9.5
./configure --prefix=${DEST} --with-swig=${DEST}/bin/swig PERL=${DEST}/bin/perl --libdir=${DEST}/lib
make
make swig-pl
make install-swig-pl
cd -


#
# git

tar xf ~/.download/git-2.11.0.tar.gz
cd git-2.11.0
make prefix=${DEST} PERL_PATH=${DEST}/bin/perl all
make prefix=${DEST} PERL_PATH=${DEST}/bin/perl install
cd -

今回ハマったところをいくつかあげてみると、

  • perl の Configure が LD_LIBRARY_PATH を設定しても必要なライブラリを見つけてくれないので、ccflags、ldflags を指定する必要がある
  • もとから入ってた (=他の人たちが使う) svn に合わせて 1.7.8 を入れようと思ったらコンパイルエラー
  • subversion-1.9.5 の Makefile の distclean がバグってて、make swig-pl のやりなおしをすると必要なライブラリがビルドされない
    • tar玉を展開しなおすとビルドされる

まとめ

サーバー管理者のひとにお願いして入れてもらうといいと思います。

*1:トラブルシューティングしながらという感じにもなるので、今回は2週間かかった。