佐々木洋
平
![]() |
CDBS – Common Debian Build System は, debian/rules の共通部分を抽出し共有することで, debian/rules を簡潔かつ理 解しやすくすることを目的としたツールです. [CDBS Documentation Rev.0.1.2]の Introduction によれば, 当初の開発動機 は GNU autoconf & GNU automake を使用している Debian パッケージの重複した debian/rules をなんとかしたい, だった 様です:
The motivating factor for CDBS was originally that more and more programs today are created using GNU Autoconf configure scripts and GNU Automake, and as such they are all very similar to configure and build. It was realized that a lot of duplicated code in everyone’s debian/rules could be factored out. ...
今では CDBS はもっと汎用的になっており, autotools に限らず, Gnome, KDE, Python, Haskel な ど, 様々なパッケージの作成に使用できるようになっています. [Online CDBS Gallery]によると, 現時 点で CDBS を使用しているソースパッケージは 1805 個, ソースパッケージ全体の~ 16% だそうで す*1 .
ドキュメントで上げられている CDBS の利点は以下の通りで す*2 :
確かにそうなんですけれども, 以下の例では逆に何をしているのかわからなくて不安になったりします:
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/autotools.mk |
ここでは[CDBS Documentation Rev. 0.4.0]の冒頭をざっくり解説してみようと思います.
CDBS の実態は細分化された Makefile 群です. 実際に /usr/share/cdbs/ 以下を眺めてみましょう:
% ls -aR /usr/share/cdbs
/usr/share/cdbs/: ./ ../ 1/ /usr/share/cdbs/1: ./ ../ class/ rules/ /usr/share/cdbs/1/class: ./ autotools-vars.mk hbuild.mk perlmodule-vars.mk ../ autotools.mk kde.mk perlmodule.mk ant-vars.mk cmake.mk langcore.mk python-distutils.mk ant.mk docbookxml.mk makefile-vars.mk qmake.mk autotools-files.mk gnome.mk makefile.mk /usr/share/cdbs/1/rules: ./ buildcore.mk debhelper.mk patchsys-quilt.mk tarball.mk ../ buildvars.mk dpatch.mk simple-patchsys.mk utils.mk |
中間ディレクトリ 1 は将来の API 変更を考慮したディレクトリです. rules, class ディレクトリ以下にあるファイルが細分化 された Makefile です. パッケージを作成する際にはこれらのファイルを適宜 debian/rules 内で include して使用します. 個々 の Makefile の依存関係は以下の通りです:
|
buildvars.mk を include するとパッケージ作成のための環境変数が設定されます. 設定される変数の一覧を表3.1 に記載しま す. 良く使われるのは CURDIR と DEB_DESTDIR でしょう.
|
これらの変数を変更したい場合には, buildvars.mk を include した後で debian/rules 内部で以下の様に設定します:
# where sources are
DEB_SRCDIR = $(CURDIR)/src # in which directory to build DEB_BUILDDIR = $(DEB_SRCDIR)/build # in which directory to install the sofware DEB_DESTDIR = $(CURDIR)/destination |
buildcore.mk はパッケージ作成のための基本的なターゲットを提供します. [Debian Policy Manual]によれば, パッケージ作 成の際 debian/rules ファイルの中で外部から参照されうるターゲットは, 以下の通りです:
buidcore.mk を include するとこれらのターゲットが細分化されて提供されます. buildcore.mk が提供するターゲットの一覧を 図 3.2に示します.
|
実際には, buildcore.mk 自体はパッケージに対してなんの処理もしません. よって適宜 rules を記述することに なります. 例として, [CDBS Documentation Rev. 0.4.0]に記載されている foo ついて解説します. ここで foo は
するパッケージだとします.
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/buildcore.mk # pre-configure action makebuilddir/foo:: ln -s plop plop2 # post-configure action configure/foo:: sed -ri ’s/PLOP/PLIP/’ Makefile configure/foo-data:: touch src/z.xml # post-build action build/foo:: /bin/bash debian/scripts/toto.sh build/foo-data:: $(MAKE) helpfiles # post-install action install/foo: cp debian/tmp/myfoocmd debian/foo/foocmd find debian/foo/ -name ‘‘CVS’’ -depth -exec rm -rf {} \; install/foo-data: cp data/*.png debian/foo-data/usr/share/foo-data/images/ dh_stuff -m ipot -f plop.bz3 debian/foo-data/libexec/ # post deb action binary/foo: strip --remove-section=.comment --remove-section=.note --strip-unneeded \ debian/foo/usr/lib/foo/totoz.so # pre-clean action cleanbuilddir/foo:: rm -f debian/fooman.1 |
コメントとしてターゲットを記述するタイミングを記載しました. ターゲットの記法は
target/packagename::
です. 後ろの :: が重要です.
CDBS の一番の御利益が, この debhelper.mk です. CDBS では主な dh_ コマンドの呼び出しを debhelper.mk において行な うため, debian/rules 内の dh_ の殆んどが不要になります. debhelper.mk によって呼び出される dh_ を表 3.2に示します.
|
debhelper.mk によって呼び出される dh_ コマンドに対しては, パラメータ設定は (大抵の場合) 不要です. debelpher の呼び 出しをカスタマイズする変数は debhelper.mk 冒頭のコメント行を参照して下さい. [CDBS Documentation Rev. 0.4.0]には 以下の例があります:
依存関係がシビアな共有ライブラリについて
DEB_DH_MAKESHLIBS_ARGS_libfoo := -V’’libfoo (>= 0.1.2-3)‘‘
DEB_SHLIBDEPS_LIBRARY_arkrpg := libfoo DEB_SHLIBDEPS_INCLUDE_arkrpg := debian/libfoo/usr/lib/ |
ChangeLog のファイル名が一般的でない場合
DEB_INSTALL_CHANGELOGS_ALL := ProjectChanges.txt
|
.py を圧縮せずにパッケージ化する場合
DEB_COMPRESS_EXCLUDE := .py
|
ここでの記法
:=
に注意して下さい. := は上書きです. CDBS の提供する変数に追加する場合には += を使用します.
dpatch, quilt, そして CDBS 用の simple-patchsys の rules が提供されています. quilt, dpatch については include するだけ で patch を適用する rule が適用されます.
simple-patchsys の場合は debian/patches に patch を置くだけで, パッケージ作成時に patch を適用し clean の際には元 に戻します. patch level は 3 まで ok です. 自動的に適用しようと試みます.
前小説で rules について簡単にまとめました. ここでは幾つかの class について紹介します.
autotools を使わず Makefile のみを使用するソフトウェアには makefile.mk が便利です. [CDBS Documentation Rev. 0.4.0] で は , 元々の Makefile が
というソフトウェアの場合について例示しています:
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debheper.mk include /usr/share/cdbs/1/class/makefile.mk DEB_MAKE_CLEAN_TARGET := mrproper DEB_MAKE_BUILD_TARGET := myprog DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(CURDIR)/debian/tmp/ # no check for this software DEB_MAKE_CHECK_TARGET := check # allow changing the makefile filename in case of emergency exotic practices DEB_MAKE_MAKEFILE := MaKeFiLe # example when changing environnement variables is necessary : DEB_MAKE_ENVVARS := CFLAGS=’’-fomit-frame-pointer’’ |
いわゆる configure && make && make install なソフトウェアの場合は autotools.mk が便利です. 冒頭にも例示しました が, 標準的な autotools を使用するソフトウェアの場合には
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debheper.mk include /usr/share/cdbs/1/class/autotools.mk |
となります.
configure へのオプションや環境変数の設定を行なう場合には以下の様にします:
DEB_CONFIGURE_EXTRA_FLAGS := --with-ipv6 --with-foo
COMMON_CONFIGURE_FLAGS := --program-dir=/usr DEB_CONFIGURE_SCRIPT_ENV += LDFLAGS=’’ -Wl,-z,defs -Wl,-O1’’ |
ここでも +=, := の意味は変わりません. 例えば
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debheper.mk include /usr/share/cdbs/1/class/autotools.mk # normally DEB_MAKE_INSTALL_TARGET := install DESTDIR=$(DEB_DESTDIR) # example to work around dirty makefile # DEB_MAKE_INSTALL_TARGET := install prefix=$(CURDIR)/debian/tmp/usr DEB_MAKE_CLEAN_TARGET := distclean # example to activate check rule DEB_MAKE_CHECK_TARGET := check # overriding make-only environnement variables : # (should never be necessary in a clean build system) # (example borrowed from the bioapi package) DEB_MAKE_ENVVARS := ‘‘SKIPCONFIG=true’’ |
など.
他にも Perl, Python, Ruby, GNOME, KDE, Ant, HBuild(Haskel) 用のclass があります
そんな所で時間が切れてしましました*3 .
CDBS を使いはじめたら, もう debhelper には戻れない体になってしまうわけですが, いかんせん CDBS ってドキュメン ト少ないんですよね. この文書が最初の一歩になれば幸いです.