CDBS(Common Debian Build System) は、deb パッケージビルド用の debian/rules ファイルを短く簡単に書けるようにするための仕組みです。
実際大抵 rules やることというのはかなり似通っているので、その汎用的な内容のコレクションを CDBS 側で用意し、各パッケージの rulesファイルで必要なものを include してやれば、パッケージ特有の部分だけ書けば OK、と言う訳。
さて、便利な CDBS なんですが、既存パッケージをどう移行するかという視点で HowTo を書いてみました。
ドキュメント (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
消し終わったら、ともあれ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 ツール群の呼び出 しの時にオプションを付けていた場合は、これを引き継がないといけません。 このへんのオプションは変数で指定する事になります。 変数はかなり色々あるんですが、少しだけ例を示します。
他の変数については /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 を付けるか、存在をチェックする必要があります。
環境にあわせて CFLAGS 等をセットします。 C や C++で書かれたプログラムをパッケージングしているなら include しておきましょう。
ただ、もっと色々やってくれる makefile.mk や autoconf.mk を使う場合は いちいち指定しなくても内部で勝手に include してくれます。
dpatch 用のルールです。include すると debian/patches に置いた パッチを自動的に適用します。詳しくはdpatchについて調べてみてください。