= CDBS 移行への 1st step
== CDBSとは?
(())
は、deb パッケージビルド用の debian/rules ファイルを短く簡単に書けるようにするための仕組みです。
実際大抵 rules やることというのはかなり似通っているので、その汎用的な内容のコレクションを CDBS 側で用意し、各パッケージの rulesファイルで必要なものを include してやれば、パッケージ特有の部分だけ書けば OK、と言う訳。
さて、便利な CDBS なんですが、既存パッケージをどう移行するかという視点で HowTo を書いてみました。
== 何処から始めようか
=== debhelperが長い
((<ドキュメント (CDBS Documentation)|URL:http://perso.duckcorp.org/duck/cdbs-doc/cdbs-doc.xhtml>))
を読むと最初に「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
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は大まかに以下のような順でターゲットを実行します
(もっと詳しい内容が必要なら((<詳細なターゲットフロー>))を見てください)。
* clean
* pre-build
* common-configure-{arch,indep}
* configure/パッケージ名
* common-build-{arch,indep}
* build/パッケージ名
* common-post-build-{arch,indep}
* common-install-{arch,indep}
* install/パッケージ名
* binary-post-install/パッケージ名
* common-binary-post-install-{arch,indep}
* binary-fixup/パッケージ名
* binary-predeb/パッケージ名
* binary/パッケージ名
なにやら一杯ありますが、これらを全部書く必要は有りません。
必要な部分だけ選んでターゲットを作れば 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で出来ることは色々とあります。
* debian/control の生成
* makefile ルールによる make の呼び出しの簡略化
* autotools ルールだと ./configure; make; make install のステップをまとめて省略できる
* perl や python, kde や gnome 等のルールもある
このへんの追加情報については、私は調べていないので CDBS Documentation を参考にしてください。
何れにせよ、Undocumented な部分が多いので、実際の Makefile
(/usr/share/cdbs/*/{class,rules}) を読む必要もあるでしょう。
もしこの辺りに挑戦したら、今度はあなたが文書を書いてみてください。
是非参考にさせて頂きます。では Enjoy!
== 付録
=== 詳細なターゲットフロー
恐らくすぐに必要になるので、buildcore.mk + debhelper.mk
で実行されるターゲット一覧をあげておきます
(update-config, udeb 等は除く)。
((<ターゲットフロー|"IMG:cdbs-targets.png">))
(Notice) 表を見てもらうと分かりますが、makebuilddir 等は重複しています。
debuild は debian/rules を clean build binary の順で呼び出すため、
これらは複数回呼び出される点に注意してください。
例えば mkdir をかける場合には -p を付けるか、存在をチェックする必要があります。
=== 覚えておくと便利なマクロ
* $(CURDIR) - 今までと同じ。作業ディレクトリのルート
* $(cdbs_curpkg) - CDBS が今作業対象にしているパッケージ名
* $(DEB_DESTDIR) - single binary なら "$(CURDIR)/debian/パッケージ名/", multi binary パッケージの場合は "$(CURDIR)/debian/tmp/"
=== その他手軽で便利なルール
==== /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
* (())
* (())
* (())