結構前からわかっていたんだけども、Gentoo Prefix on Mac OSX で USE=“subversion” していると gitのビルドに失敗していた。 なので、ビルドできるようにして、パッチを書いて Gentoo Bugzila へバグ報告してみた。
Gentoo Prefix というのは Gentoo Linuxのパッケージ管理である portage を /以外のところにインストールしていろんな環境で利用できるようにしているものです。役割的には MacPorts や Homebrew と同じように Mac で Unixツールをインストールするのに利用しています。
どんなエラーがでていたか
USE=“subversion” emerge gitすると
LINK svn-fe
Undefined symbols for architecture x86_64:
"_libintl_ngettext", referenced from:
_show_date_relative in libgit.a(date.o)
"_libintl_gettext", referenced from:
_show_date_relative in libgit.a(date.o)
_warn_on_inaccessible in libgit.a(wrapper.o)
_xgetpwuid_self in libgit.a(wrapper.o)
ld: symbol(s) not found for architecture x86_64
svn-fe をビルドに失敗していました。
いろいろ調べてみると OSX 上では -lintl をつければビルドできることがわかりました。git をビルドするための Makefile はかなり凝ったものが使われてるのですが、その判定が svn-fe の Makefile にないため -lintl が自動でついていませんでした。
どんなパッチをかいたか
CHOST で darwin がある場合 contrib/svn-fe/Makefile をかきかえるようなその場しのぎでかいてみました。
diff --git a/dev-vcs/git/git-1.8.1.ebuild b/dev-vcs/git/git-1.8.1.ebuild
index 1bfa55a..3338847 100644
--- a/dev-vcs/git/git-1.8.1.ebuild
+++ b/dev-vcs/git/git-1.8.1.ebuild
@@ -241,6 +241,12 @@ src_prepare() {
-e '/$(INSTALL)/s/ $(libexecdir)/ $(DESTDIR)$(libexecdir)/g' \
-e '/$(INSTALL)/s/ $(man1dir)/ $(DESTDIR)$(man1dir)/g' \
contrib/subtree/Makefile
+
+ if [[ $CHOST == *-darwin* ]]; then
+ sed -i \
+ -e 's:EXTLIBS =:EXTLIBS = -lintl:' \
+ contrib/svn-fe/Makefile
+ fi
}
git_emake() {
いろいろみていると sed -i
で改行を入れてから sed の命令をかいていくスタイルが多いのでそれに従いました。
どこに投稿したか
https://bugs.gentoo.org/show_bug.cgi?id=452044#c0 に登録されています。 登録方法は
- アカウントを作成
- new をクリック
- Gentoo/Alt をクリック
- 類似バグがないか検索
- component は Prefix Support を選択
- Opereting System は OS X を選択
- summaryとdescription を記述
- 登録
- パッチを追加
という感じでした。
component には Mac OSX という項目がありますが、DEAD. Do not use. See bug #214926.
の表示され、*使用するな!*ということみたいなので Prefix Support を選択しました。
他に学んだこと
emereg file名 で emerge するには
manifest が再計算されている必要があるようです。
ebuild があるディレクトリで
- repoman digest
または
- ebuild file名 digest
で再計算されます。
また、ebuild ファイルは PORTDIR_OVERLAY を指定したディレクトリにいれておかないとダメみたいです。
emergeの特定ステップのみ実行する
書いたpatch は prepare というコンパイルをはじめる前の段階に処理を追加しています。 なので パッチの動作確認だけであれば、そこまでで十分です。
- ebuild file名 prepare
とすれば、そこまで処理することができます。 また、prepareが成功しているともう一度実行することができないので、
- ebuild file名 clean
をした上で実行しないと反映されませんでした。 また、 ebuild を書き換えると
- ebuild file名 digest
の実行が必要になります。これらをまとめて実行するには
- ebuild file名 digest clean prepare
とすればいいことがわかりました。