MPFI のバグを修正したときの作業記録
多倍長区間演算ライブラリ MPFI を使っていたら segmentation fault が起こり、調べていたら MPFI 自体のバグだった。 このページは、Ubuntu 10.10 で MPFI のバグを修正して、メールで連絡したときの作業記録。
ソースコードの修正
ソースコードの取得
MPFI のリポジトリは subversion なのだが、私は git ユーザなので
git svn clone -s svn://scm.gforge.inria.fr/svn/mpfi
として git で管理する。
まずは、README や README.dev などに目を通す。
トピックブランチの作成
バグを修正するためのトピックブランチを作り、そのブランチに切り替える。
git checkout -b fix-sub-fr
とりあえずコンパイル
まずは、コンパイルしてみる。 README.dev にあるように
autoreconf -i
とする。
Can't exec "libtoolize": そのようなファイルやディレクトリはありません at /usr/bin/autoreconf line 196.
となってエラーが出たので、
sudo aptitude install libtoolize
として必要なソフトウェアをインストールする。
./configure
make
コンパイルが終わったら
make check
でエラーがないかを確認する。
テストの追加
扱うのは、mpfi_sub_fr を [0, 0] に対して実行すると segmentation fault が起こる場合があるというバグである。
バグを修正する前に、エラーが出るようなテストを追加する。 MPFI の場合は tests 以下にテストがあり、 tests/.c のファイルが条件を記述した tests/.dat ファイルを読み込んでテストを実行していた。 mpfi_sub_fr は sub_fr.c の中でテストされているので sub_fr.dat に条件を書き加える。
関数におかしなポインタを渡しているというエラーなので条件によっては segmentation fault が再現しない。 今回は、なぜかほとんどの場合、エラーが再現しなかった。
ここで、テストの追加を git にコミットする。
バグの修正
mpfi_sub_fr は src/sub_fr.c で定義されている。 このファイルを修正し、変更をコミットする。
パッチをメールで送る
git diff --no-prefix --relative=mpfi master > patchfile
としてパッチを作成してメールで送った。 取り込んでくれると良いのだが。
Debian・Ubuntu 用のパッケージの作成
パッケージのソースを git.debian.org から取得
バグを修正した deb パッケージを作成する。 http://git.debian.org/?p=collab-maint/mpfi.git;a=summary に debian のパッケージ用のリポジトリがある。まず、
git clone git://git.debian.org/collab-maint/mpfi.git mpfi.debian
として適当なディレクトリに複製する。 このリポジトリを上で subversion から作成したリポジトリのブランチにしたかったのだが subversion から作った方は mpfi/mpfi となっていて、 ディレクトリの階層が合わなかったので断念した。
cd mpfi.debian
git pull origin upstream:upstream
で upstream ブランチを取得する。 master ブランチで
git-buildpackage
を実行してパッケージが作成できるかを確認する。
ブランチを作成してパッチを当てる
git checkout -b customize
としてパッチを当てるためのブランチを作成する。
patch -p0 < patchfile
で先ほど作成したパッチを当てる。
メンテナの名前を変える
メンテナが自分になっていないと「秘密鍵が得られません」となるので debian/controal の Maintainer の部分を変更する。 もちろん、あらかじめ鍵の設定をしておく必要がある。
スナップショットのパッケージの作成
ブランチ customize を元にして野良パッケージを作る。 git-buildpackage を使う場合、master がパッケージ作成元のブランチで、 upstream が元のソースコードのブランチになっているので、 オプションで使用するブランチを指定してコマンドを実行することになる。
git-dch --snapshot --auto --debian-branch=customize
としてスナップショット用のバージョンが debian/changelog に記載する。 master ブランチで作業していないので「–debian-branch=customize」が必要。 debian/changelog が問題なければ
git commit -a
としてコミットする。
git-buildpackage --git-debian-branch=customize
でパッケージを作成する。 「–git-debian-branch=customize」はブランチ customize からパッケージを作るというオプション。