Online Gentoo Hackathon 11月 (付録: ebuildのversion bumpについて)

Online Gentoo Hackathon 11月 : ATNDを開催しました。

freenodeのIRC channel #gentoo-ja に集まってebuild書いたり直したりバグとったりしました。

@kozo2 さんは dev-lang/R-2.14 のversion bump request(バージョン上げてねとお願い)のバグを出しました。

@ichelm さんはRuby関連のパッケージについてpatchを投稿しました

@d_aki さんは新しいRubyGemsでのruby-gettextの動作についてpatchをあててない場合、あてている場合のテストを行ないました

@sora_h さんはRuby1.9.3のversion bump requestとebuildに必要な変更について投稿しました

@matsuu さんは app-i18n/xcinのdodocのエラーとLDFLAGSが使われずにビルドされるバグとを直しました

ぼくは以下のバグを直しました

反省点

  • 0時から始めてみたけれど眠くて朝昼能率落ちたので、つぎは1時〜9時ぐらいまでは休憩時間にしよう
  • なんか簡単そうなバグネタを考えておこう
    • GentooJPにRedmineかBugzillaとかあったらいいのかな

11月と銘うったことですし、12月もやりたいと思います。ぜひ{次回も,次回から}気軽にご参加ください。こんなところわからんべや、という軽いノリでOKです。

Version bump requestについて

まずはもともとのバージョンアップを知らないといけませんね。でも、いくつも監視するのは大変です…。

そこでGentooにはeuscanというサイトがあって、たとえばdev-lang/Rだと http://euscan.iksaif.net/package/dev-lang/R/から更新情報をチェックすることができます。しかし、このサイトも総当たりで適当にスキャンしている場合がたいていなので見つけられないものは見つけられないですけどね。

さて、バージョンアップを見つけました! 次にすることは……まずはBugzillaの検索です。すでに誰かがバージョンアップのお願い出してるかも。もしかしたらそこにバージョンアップに必要なdiffとか落ちてるかも?

ということで、GentooのBugzillaを検索しましょう。 Gentoo's Bugzilla Main Pageから直接検索してみてもいいですが emerge pybugzしてからbugz search dev-lang/R とかするのもかっこいいですよ。

(bugzは最初に使う時にBugzillaのユーザ名とパスワードをきいてくるので、入力してあげてください)

 % bugz search dev-lang/R bump
 * Using https://bugs.gentoo.org 
 * Searching for 'dev-lang/R bump' 
 * Already logged in.
386403 sci-mathematics      dev-lang/R-2.13.2 version bump
391045 sci-mathematics      dev-lang/R-2.14.0 version bump
391183 bug-wranglers        dev-lang/ruby-1.9.3_p0: version bump
 * 3 bug(s) found.

ふむふむ version bumpのバグがありますねえ。

ということで、このバグにebuildのdiffがあったとします。さっそくDLしてためしてみましょう。

# cd /usr/portage/dev-lang/R
# patch -p0 < R-bump.diff
# repoman manifest
# emerge =dev-lang/R-2.14.0

(repoman manifestでebuildのdigest情報を更新しています。これをやらないとdigestがあわないエラーでemergeできません)

これでうまくビルドできて使えたらうまくいったよ!とコメントしてあげましょう。

さらにもし余裕があれば

# FEATURES='test keepwork keeptemp' emerge =dev-lang/R-2.14.0

として、パッケージのテストを実行してみましょう。うまくテストが通っているようなら、そのbuild.log(/var/tmp/portage/dev-lang/R-2.14.0/temp/build.log)を投稿してテストも通っているぜ!と見せつけてあげましょう。この時は emerge --info R として自分の環境の設定も一緒に投稿してあげるといいかもしれないですね。




さて、ではversion bumpのバグがなかったり、ebuildのdiffがなかった場合はどうしましょう。

ここでは dev-lang/foobar-1.0がportageにあって dev-lang/foobar-1.1がリリースされていたとします。まずは検索です。

 % bugz search dev-lang/foobar bump
 * Using https://bugs.gentoo.org 
 * Searching for 'dev-lang/foobar bump' 
 * Already logged in.
 * No bugs found.

ないですね。まず、最初にすることは1.1のリリース日を確認することです。リリースから2,3日であればbug登録しないでください。もしかしたら、もうメンテナの人が作業中かもしれませんよ? しばらく待ってあげましょう。

しばらく経っていればバグ報告しましょう。 https://bugs.gentoo.org/ から "File a Bug"を選びます。

まずはバグのカテゴリを選びます。version bumpは「Gento Linux」カテゴリです。

まずはもうバグレポートされてないかどうか探せよと言われますが、すでにやってるのでスルーしてスクロールしましょう。

バージョンアップしたいパッケージに適切なコンポーネントをえらびます。この場合は言語なので"Development"ですかねー。"Ebuilds"コンポーネントは「新しいパッケージ追加用」なので適切ではないです。

URL, Summary, Descriptionを書いていきましょう。 URLには、upstreamのバージョンアップしたよ、と報告しているページを貼っておくと便利です。たとえば ruby-1.9.3なら http://www.ruby-lang.org/en/news/2011/10/31/ruby-1-9-3-p0-is-released/ このページを入れるといいですね! Summaryはなにもかんがえず "dev-lang/foobar-1.1 version bump"とかしときましょう。簡潔でわかりやすいです。"[速報][拡散希望] bump this ASAP!"とかはやめましょう、わけがわかりません。パッケージのカテゴリと名前とバージョンとを入れてあげると検索しやすいです。 Descriptionも簡単でいいでしょう。 "dev-lang/foobar-1.1 has been released. Please bump it."とかで。

その下のこのへんはからっぽでいいです。一番下までスクロールして "Submit Bug Report"をぽちっとおしましょう!! これでVersion bumpのバグレポートが終わりました!!







そして。。。。。。待てどくらせど更新したよ!とのコメントが来ない……あるいは待ってられん!すぐにでも最新使いたい。 そんな時は自分でバージョンアップを試してみましょう。

# cd /usr/portage/dev-lang/R
# cp R-2.13.1-r1.ebuild R-2.14.0.ebuild
# repoman manifest
# emerge R

ebuildを単純にコピってバージョンの部分だけ変えておきます! うまくいけばこれだけでビルドできちゃいます。 ebuildいいですね!

# FEATURES='test test-fail-continue' emerge dev-lang/R
>>> Verifying ebuild manifests
>>> Emerging (1 of 1) dev-lang/R-2.14.0
...
 * Messages for package dev-lang/R-2.14.0:

 * Cannot find $EPATCH_SOURCE!  Value for $EPATCH_SOURCE is:
 * 
 *   /home/naota/repo/cvs/gentoo-x86/dev-lang/R/files/R-2.14.0-zlib_header_fix.patch
 *   ( R-2.14.0-zlib_header_fix.patch )
 * ERROR: dev-lang/R-2.14.0 failed (prepare phase):
 *   Cannot find $EPATCH_SOURCE!
 * 
 * Call stack:
 *     ebuild.sh, line   84:  Called src_prepare
 *   environment, line 2977:  Called epatch '/home/naota/repo/cvs/gentoo-x86/dev-lang/R/files/R-2.14.0-zlib_header_fix.patch'
 *   environment, line 1409:  Called die
 * The specific snippet of code:
 *                   die "Cannot find \$EPATCH_SOURCE!";
 * 
 * If you need support, post the output of 'emerge --info =dev-lang/R-2.14.0',
 * the complete build log and the output of 'emerge -pqv =dev-lang/R-2.14.0'.
 * The complete build log is located at '/var/tmp/portage/dev-lang/R-2.14.0/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/dev-lang/R-2.14.0/temp/environment'.
 * S: '/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0'

(FEATURES=testでテストを実行させて、FEATURES=test-fail-continueでとりあえずテストがこけてしまっても、インストールまではするようにしています。テストがこけるのなんてあとでデバッグすればいーんです!)

ありゃ、エラーですね…。 ポイントは "Cannot find $EPATCH_SOURCE! Value for $EPATCH_SOURCE is:" です。これはpatchあてようとしたけれど、そのファイルなかったよ?と言っています。なんたらzlib_header_fix.patchを当てようとしてるので、ebuildを覗いて検索かけてみると

        # update for zlib header changes (see bug #383431)
        epatch "${FILESDIR}"/${P}-zlib_header_fix.patch

どうも、ここのようですね。 ${P}はここでは R-2.14.0に展開されます。 R-2.13.1-r1の時は R-2.13.1に展開されてたのでうまくいってたのですが 2.14.0では当然file not foundになりますね。

patchを見てみましょう。 files/R-2.13.1-zlib_header_fix.patch です

--- src/main/unzip.h.orig       2011-09-24 19:35:53.000000000 -0700
+++ src/main/unzip.h    2011-09-24 19:37:06.000000000 -0700
@@ -58,6 +58,10 @@
 #define ZLIB_FILEFUNC_SEEK_END (2)
 #define ZLIB_FILEFUNC_SEEK_SET (0)
 
+#ifndef OF
+#define OF(x) x
+#endif
+
 #define ZLIB_FILEFUNC_MODE_READ      (1)
 #define ZLIB_FILEFUNC_MODE_WRITE     (2)
 #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)

ふむ。src/main/unzip.hにあててますね。 R-2.14.0では直っているでしょうか? /var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/src/main/unzip.h 見てみましょう。

#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0)

#define ZLIB_FILEFUNC_MODE_READ      (1)
#define ZLIB_FILEFUNC_MODE_WRITE     (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)

あたっている雰囲気ないですね。では、R-2.14.0でもこのpatchをあてるべきでしょう。そのままR-2.14.0にもあたりそうなので、ebuild

        epatch "${FILESDIR}"/${PN}-2.13.1-zlib_header_fix.patch

と書きかえます。 ${P} を ${PN}-2.13.1 としました。では、もう一度

# repoman manifest
# FEATURES='test test-fail-continue' emerge --quiet-build=n R

今回は途中経過をちゃんと見たいので --quiet-build=n をつけてみました。最近のportageの変更でデフォルトでビルドログを表示しなくなったのですが、これをつけておけばちゃんと表示してくれます。

x86_64-pc-linux-gnu-gcc -std=gnu99 -shared -fopenmp -Wl,--hash-style=gnu -Wl,-O1 -Wl,--as-needed -o libRmath.so -Wl,-soname,libRmath.so.0.0.0 mlutils.lo d1mach.lo i1mach.lo fmax2.lo fmin2.lo fprec.lo fround.lo ftrunc.lo sign.lo fsign.lo imax2.lo imin2.lo chebyshev.lo log1p.lo expm1.lo lgammacor.lo gammalims.lo stirlerr.lo bd0.lo gamma.lo lgamma.lo gamma_cody.lo beta.lo lbeta.lo polygamma.lo bessel_i.lo bessel_j.lo bessel_k.lo bessel_y.lo choose.lo snorm.lo sexp.lo dgamma.lo pgamma.lo qgamma.lo rgamma.lo dbeta.lo pbeta.lo qbeta.lo rbeta.lo dunif.lo punif.lo qunif.lo runif.lo dnorm.lo pnorm.lo qnorm.lo rnorm.lo dlnorm.lo plnorm.lo qlnorm.lo rlnorm.lo df.lo pf.lo qf.lo rf.lo dnf.lo dt.lo pt.lo qt.lo rt.lo dnt.lo dchisq.lo pchisq.lo qchisq.lo rchisq.lo rnchisq.lo dbinom.lo pbinom.lo qbinom.lo rbinom.lo rmultinom.lo dcauchy.lo pcauchy.lo qcauchy.lo rcauchy.lo dexp.lo pexp.lo qexp.lo rexp.lo dgeom.lo pgeom.lo qgeom.lo rgeom.lo dhyper.lo phyper.lo qhyper.lo rhyper.lo dnbinom.lo pnbinom.lo qnbinom.lo rnbinom.lo dpois.lo ppois.lo qpois.lo rpois.lo dweibull.lo pweibull.lo qweibull.lo rweibull.lo dlogis.lo plogis.lo qlogis.lo rlogis.lo dnchisq.lo pnchisq.lo qnchisq.lo dnbeta.lo pnbeta.lo qnbeta.lo pnf.lo pnt.lo qnf.lo qnt.lo ptukey.lo qtukey.lo toms708.lo wilcox.lo signrank.lo std_unif.lo
make[1]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/src/nmath/standalone' から出ます
make: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/src/nmath/standalone' から出ます
>>> Source compiled.
>>> Test phase [check]: dev-lang/R-2.14.0
make[1]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests' に入ります
make[2]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests' に入ります
make[3]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests/Examples' に入ります
Testing examples for package ‘base’
....
running code in 'reg-BLAS.R' ...make[3]: *** [reg-BLAS.Rout] エラー 1
make[3]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests' から出ます
make[2]: *** [test-Reg] エラー 2
make[2]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests' から出ます
make[1]: *** [test-all-basics] エラー 1
make[1]: ディレクトリ `/var/tmp/portage/dev-lang/R-2.14.0/work/R-2.14.0/tests' から出ます
make: *** [check] エラー 2
 * ERROR: dev-lang/R-2.14.0 failed (test phase):
 *   Make check failed. See above for details.

さて、これでとりあえずコンパイルは終わりました。が、テストがこけていますねえ…。 とりあえずさっきのebuildへの変更をpatchにして、これでビルドは通ったよ!とBugzillaにコメントは書いておけるでしょう。 そして…あとで FEATURES='-test-fail-continue' でemergeしなおしてなぜテストが通ってないのかdebugしましょうか。もし、テストが通らない原因がわかってそれを直せたらさらにpatchを追加すればいいでしょうね。