CDBS 移行への 1st step

CDBSとは?

CDBS(Common Debian Build System) は、deb パッケージビルド用の debian/rules ファイルを短く簡単に書けるようにするための仕組みです。

実際大抵 rules やることというのはかなり似通っているので、その汎用的な内容のコレクションを CDBS 側で用意し、各パッケージの rulesファイルで必要なものを include してやれば、パッケージ特有の部分だけ書けば OK、と言う訳。

さて、便利な CDBS なんですが、既存パッケージをどう移行するかという視点で HowTo を書いてみました。

何処から始めようか

debhelperが長い

ドキュメント (CDBS Documentation) を読むと最初に「debian/rules が2行で終わるぜ!」みたいな事が書いてあるん ですが、いきなりそこに行くのは大変なので確実で効果の高い所から始めましょう。

と言うわけで、どのパッケージも必ず持っているであろう debhelper の呼び出しを 省略してみます。ビルドの簡単なパッケージだと rules ファイルの9割近くは debhelper 関係だったりするので、これを消すと一気にファイルが見やすくなり ます。

ガンガン消す

では、このへんの呼び出しを全部 CDBS に任せる事にしましょう。 と言う訳で作業開始……の前に、rules ファイルのバックアップを取って おいてください。それから debian/control に cdbs (>=0.4.26-2) を 追加しておきます。

さて。それが出来たら気を取り直して開始。debian/rules をどんどん削ります。 Makefile として文法エラーにならない程度に自分で書いた場所以外をばっさり 削除。最初の方にある CFLAG のセットとか、dh_何とかとかの行、 コメント等も抹消。中身が無くなってしまうようなものはターゲット ごと消してしまいます。

おそらく configure-stamp, build-stamp, clean, install あたりに 自分の書いた部分が有るはずなので、その辺が残るはずです。 binary-{arch,indep} ターゲット内 dh_xxx にオプションを追加している 箇所があったら、その行だけコメントにして残し、ターゲットは消してしまって ください。

大体こんな感じになったはずです。

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk

clean:
   -$(MAKE) distclean

configure-stamp:
   ./configure --prefix=/usr

build-stamp:
   $(MAKE)

install:
   $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp

CDBS の debhelper rule を試す

消し終わったら、ともあれ2行目あたりに CDBS のルールを include します。

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk

こんな感じで。足したらいきなり debuild をかけてみましょう。

sugi@tempest:~/works/debian/apt-upchk/apt-upchk% debuild -uc -us
dpkg-buildpackage: source package is apt-upchk
dpkg-buildpackage: source version is 22
dpkg-buildpackage: source changed by Tatsuki Sugiura <sugi@nemui.org>
dpkg-buildpackage: host architecture i386
 fakeroot debian/rules clean
debian/rules:7: *** ターゲットファイル `clean' が : と :: 項目の両方を持っています。中止。
debuild: fatal error at line 765:
dpkg-buildpackage failed!

ふむ。停止しましたね(clean ターゲットが無い人は素直に通ったはずなので、 この段落を読み飛ばしてください)。CDBSを使う場合はターゲットを二重コロン (::)で書かなければなりません。clean: を clean:: に修正して 再度実行……今度は通るはず。

さて、debuild が成功するとパッケージは出来ているはずですが……、 中を見てみると空っぽです。でも、control ファイル群や postinst スクリプト なんかはちゃんと入っているのが確認できます。 CDBS では(clean を除き)今までのターゲット名を使いません。なので、 install ターゲット等は実行されずに空のパッケージが作られています。 空でもパッケージの製作自体が巧くいっているなら、あとは新しいターゲット 移行するだけです。

ルールの書き方

では CDBS でのルールの書き方を見ていきましょう。

ターゲットの追記

CDBSは大まかに以下のような順でターゲットを実行します (もっと詳しい内容が必要なら詳細なターゲットフローを見てください)。

なにやら一杯ありますが、これらを全部書く必要は有りません。 必要な部分だけ選んでターゲットを作れば OK です。 ターゲット名の最後は :: で終わるのはお忘れ無く。

先ほど残してあった configure-stamp, build-stamp, install の中身を順に 新しいターゲットに移動します。このとき、パッケージ依存でないものは ``common-xxx'' の方に、依存していれば ``xxx/パッケージ名'' に移すようにして ください。

最初にあげた例を置換するとこんな感じ。

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk

clean::
   -$(MAKE) distclean

configure/yourpackage::
   ./configure --prefix=/usr

build/yourpackage::
   $(MAKE)

install/yourpackage::
   $(MAKE) install DESTDIR=$(CURDIR)/debian/yourpackage

全部移し終わったら debuild にトライ。ちゃんとビルドとインストールが されていることを確認します。

debhelperにオプションを渡すには

さて、これで殆んど終わってるのですが、最後の debhelper ツール群の呼び出 しの時にオプションを付けていた場合は、これを引き継がないといけません。 このへんのオプションは変数で指定する事になります。 変数はかなり色々あるんですが、少しだけ例を示します。

DEB_INSTALL_DIRS_ALL
dh_installdirs で全パッケージに作られるサブディレクトリ
DEB_INSTALL_DIRS_パッケージ名
上の各パッケージ版。
DEB_INSTALL_DOCS_ALL
全部の /usr/share/doc/パッケージ名 に置かれるファイル
DEB_INSTALL_DOCS_パッケージ名
上の各パッケージ版
DEB_INSTALL_CHANGELOGS_ALL
ChangesLogs ファイルの名前
DEB_COMPRESS_EXCLUDE
dh_compress で除外するファイル(スペース区切り)
DEB_FIXPERMS_EXCLUDE
dh_fixmerms で除外するファイル(スペース区切り)
DEB_SHLIBDEPS_LIBRARY_パッケージ名
dh_shlibdeps の -Lオプション
DEB_SHLIBDEPS_INCLUDE
dh_shlibdeps で依存関係に追加するライブラリパス(-lオプション) (スペース区切り)
DEB_SHLIBDEPS_INCLUDE_パッケージ名
上の各パッケージ版

他の変数については /usr/share/cdbs/1/rules/debhelper.mk の最初の方の コメントと、実際にファイルの中身を読んでください。 大体どれも、dh_xxx に対応する DEB_DH_XXX_ARGS という変数が用意されて いるようです。

例えばこんな感じで指定します。

DEB_INSTALL_CHANGELOGS_ALL := ProjectChanges.txt
DEB_DH_INSTALLINIT_ARGS := --init-script=foo -r
DEB_DH_INSTALL_CRON_ARGS := --name=$(cdbs_curpkg)-maint

CDBS のドキュメントでもサンプルには := で書いてありますが、 用途に応じて += や = を使ってもおそらく大丈夫かと。

次のステップ

この文章の対象はここまでです。debhelper 呼び出しが消えるだけで、 かなり rules ファイルはすっきりしたんじゃないでしょうか。

しかし、まだまだCDBSで出来ることは色々とあります。

このへんの追加情報については、私は調べていないので CDBS Documentation を参考にしてください。 何れにせよ、Undocumented な部分が多いので、実際の Makefile (/usr/share/cdbs/*/{class,rules}) を読む必要もあるでしょう。

もしこの辺りに挑戦したら、今度はあなたが文書を書いてみてください。 是非参考にさせて頂きます。では Enjoy!

付録

詳細なターゲットフロー

恐らくすぐに必要になるので、buildcore.mk + debhelper.mk で実行されるターゲット一覧をあげておきます (update-config, udeb 等は除く)。

ターゲットフロー

(Notice) 表を見てもらうと分かりますが、makebuilddir 等は重複しています。 debuild は debian/rules を clean build binary の順で呼び出すため、 これらは複数回呼び出される点に注意してください。 例えば mkdir をかける場合には -p を付けるか、存在をチェックする必要があります。

覚えておくと便利なマクロ

その他手軽で便利なルール

/usr/share/cdbs/1/class/langcore.mk

環境にあわせて CFLAGS 等をセットします。 C や C++で書かれたプログラムをパッケージングしているなら include しておきましょう。

ただ、もっと色々やってくれる makefile.mk や autoconf.mk を使う場合は いちいち指定しなくても内部で勝手に include してくれます。

/usr/share/cdbs/1/rules/dpatch.mk

dpatch 用のルールです。include すると debian/patches に置いた パッチを自動的に適用します。詳しくはdpatchについて調べてみてください。

参考 URL