4 Debian から最後まで

木洋

PIC
____________________________________________________________________

4.1 は じ め に

... なんてそれたタイトルなんでし.. 私事忙しくてできなかですがながらずしい です

さて以下りです:

  1. 物ソフトウdpkg するために弄りめる
  2. 分達のているソフトウdeb める
  3. どうせなら... イマココ

のおこれらを踏まえてのから最後までですここでは」 、 最後 lintian & piuparts cleanとしますHow toハマりやすい debian/rulesについては 文献へのポインタすに留めますしてさい

4.2 Package

コンパイルソフトウなどをすぐ利用できるにまとめたものをバイナリパびますDebian では張子 .deb イルがこれにあたりますapt-getaptitude 利用してバイナリパ導入// したりしていますバイナリパtar.gzとともに ar(1) でまとめた ものですこれらは的なコマンドですからバイナリパ展開するだけならば多くのシステム です

バ イ ナ リ パ し て こ れ を す る た め の を ま と め た も の を ス パ い ま す こ れ は つないし つのイルからなります:

スパ導入したりしたりするではありません的はバイナリパにあります Debian しているバイナリパにはするスパ必ず存在しており必要じてスパ してバイナリパすることができます

4.2.1 deb package inside

dpkg-deb コマンド利用して展開してみましえば rabbit*3 というdeb イル展開してみると...

  % dpkg-deb -x rabbit_0.6.1-1_all.deb rabbit
                 (rabbit  という rabbit  というレクトリ展開)
  % dpkg-deb -e rabbit_0.6.1-1_all.deb rabbit/DEBIAN
                 (rabbit   rabbit/DEBIAN  展開)
  % cd rabbit ls
  DEBIAN/  usr/
  % tree
  .
  |-- DEBIAN
  |   |-- control
  |   |-- md5sums
  |   ‘-- preinst
  ‘-- usr
      |-- bin
      |   |-- rabbit
-------- snip ---------------
      |   ‘-- rabbit-theme-manager
      |-- lib
      |   ‘-- ruby
      |       ‘-- 1.8
      |           |-- rabbit
-------- snip ---------------
      |
      ‘-- share
          |-- doc
          |   ‘-- rabbit
          |       |-- NEWS.en.gz -> changelog.gz
-------- snip ---------------
          |       |-- README.Debian
          |       |-- README.en.gz
          |       |-- README.ja.gz
          |       |-- changelog.Debian.gz
          |       |-- changelog.gz
-------- snip ---------------
          ...
179 directories, 575 files

DEBIAN 以下展開しましたrabbit

  % ls -R DEBIAN
  DEBIAN:
  control  md5sums  preinst*

つからなりますこれらは

control
メンテナ名前するスパ名、 存関などがされたイル
md5sums
されるイルmd5 checksum
preinst
インストされる hook ルスクリプトによてはpreinst postinstprermpostrm などが存在します

usr 以下展開しましたdeb 導入したにはこれらは /usr 以下展開され ます

というわけでになレクトリツリして tar.gz したりするとバイナリパができあがり ます

4.2.2 余談: dpkg-deb 再構

物の (できない) ソフトウDebian ジシステムしたいがよくやる

としてすることですはできません *4 して大昔Intel Compiler Ver.8 以下にやていました

 % tar xvzf l_cc_pc_8.1.028.tar.gz
 % cd l_cc_pc_8.1.028
 % rm -rf *64*
 % sudo alien *.rpm
 % rm *.rpm
 % sudo chown $USER *.deb
 % mkdir tmp
 % dpkg-deb -e intel-icc8_8.1-29_i386.deb tmp/DEBIAN
 % dpkg-deb -x intel-icc8_8.1-29_i386.deb tmp/
 % echo DESTINATION=/opt/‘ls tmp/opt‘ >> tmp/DEBIAN/postinst
 % cat <<EOF >> tmp/DEBIAN/postinst
  for FILE in $(find $DESTINATION/bin/ -regex \
     ’.*[ei](cc|fort|fc|cpc)$\|.*cfg$\|.*pcl$\|.*vars[^/]*.c?sh$’ \
     2> /dev/null) do
      sed s@\@$DESTINATION@g $FILE > ${FILE}.abs
      mv ${FILE}.abs $FILE
      chmod 755 $FILE
  done
  for FILE in $(find $DESTINATION/bin/ -regex ’.*[ei]cc’ 2> /dev/null) do
      sed s@\@$DESTINATION@g $FILE > ${FILE}.abs
      mv ${FILE}.abs $FILE
      chmod 755 $FILE
  done
  for FILE in $(find $DESTINATION/bin/ -regex ’.*[ei]cpc’ 2> /dev/null) do
      sed s@\@$DESTINATION@g $FILE > ${FILE}.abs
      mv ${FILE}.abs $FILE
      chmod 755 $FILE
  done
  for FILE in $(find $DESTINATION/bin/ -regex ’.*[ei]fort’ 2> /dev/null) do
      sed s@\@$DESTINATION@g $FILE > ${FILE}.abs
      mv ${FILE}.abs $FILE
      chmod 755 $FILE
  done
  for FILE in $(find $DESTINATION/bin/ -regex ’.*[ei]fc’ 2> /dev/null) do
      sed s@\@$DESTINATION@g $FILE > ${FILE}.abs
      mv ${FILE}.abs $FILE
      chmod 755 $FILE
  done
 EOF
 % dpkg-deb -b tmp intel-icc8_8.1-29_i386.deb
 % dpkg -i intel-icc8_8.1-29_i386.deb
 % dpkg -i intel-iidb8_8.1-46_i386.deb
 % dpkg -i --force-overwrite intel-isubh8_8.1-29_i386.deb

Intel Compiler がない*5 でやていませんが

4.3

さて単にバイナリパするだけならば(4.2.2) した

して dpkg-deb でまとめればいだけですですがあんまり的ではありませんね以下ではGNU hello *6 までめた方法についてべてみます

4.3.1

ジメンテナ名前ルアドレスします:

DEBFULLNAME="Youhei SASAKI"; export DEBFULLNAME
DEBEMAIL=uwabami@gfd-dennou.org ; export DEBEMAIL

えているなら GPG わせておくといといます

必要導入 build-essential メタパ導入しておきますこのdeb するのに必要とな 導入するメタパです的には

  1. libc6-devlibc-dev
  2. g++
  3. make
  4. dpkg-dev

とこれに存するつかのイル導入されます*7

% apt-cache show build-essential
Package: build-essential
Priority: optional
Section: devel
Installed-Size: 48
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Version: 11.4
Depends: libc6-dev | libc-dev, g++ (>= 4:4.3.1), make, dpkg-dev (>= 1.13.5)
Filename: pool/main/b/build-essential/build-essential_11.4_amd64.deb
Size: 7126
MD5sum: 86a942017ad93721c91212398a828a0c
SHA1: 5ac2ba90444e1eaed96b2163389a8812eb107b01
SHA256: 3dbd2e6b4e998412a6ad4d32b242523559b536168bcce7f227c7ce30256808a5
Description: Informational list of build-essential packages
 If you do not plan to build Debian packages, you don’t need this
 package.  Starting with dpkg (>= 1.14.18) this package is required
 for building Debian packages.
 .
 This package contains an informational list of packages which are
 considered essential for building Debian packages.  This package also
 depends on the packages on that list, to make it easy to have the
 build-essential packages installed.
 .
----- snip -----
% sudo aptitude install build-essential

動かないソフトウするのはですよね? して動作認しておくといでし また動作させるために patch いた!というそのしておくとせになれるかもしれま せん

GNU hello URL からできますhttp://www.gnu.org/software/hello/

GNU hello configure ; make ; make install 導入するソフトウですconfigure 動かしてみます

% cd hello-2.4
% ./configure
...

エラがでなければこれで了ですもし./configure 必要イル探せずエラ了するにはapt-file マンド必要イルしている Debian 探してみまし

% sudo aptitude install apt-file
% sudo apt-file update
% apt-file search [file  ]

足りないイル導入したらもう./configure らせますこれをくりかえして必要イル導入して いきます

無事 ./configure るようになたらmake してみます

% make
make all-recursive
make[1]: Entering directory ‘/home/uwabami/Desktop/hello-2.4’
Making all in contrib
make[2]: Entering directory ‘/home/uwabami/Desktop/hello-2.4/contrib’
make[2]: Nothing to be done for ‘all’.
make[2]: Leaving directory ‘/home/uwabami/Desktop/hello-2.4/contrib’
...
make[2]: Entering directory ‘/home/uwabami/Desktop/hello-2.4’
make[2]: Leaving directory ‘/home/uwabami/Desktop/hello-2.4’
make[1]: Leaving directory ‘/home/uwabami/Desktop/hello-2.4’

コンパイル正常了したのでしにしてみます

% ./src/hello
% ./src/hello -t
% ./src/hello -g "Good Night.."

ここまでが動作認作です

するためのするには動作認以にも Copyright License 認しておくべき で す

4.3.2

dh_makeコマンドしますdh_makedh-makeされていますのでこれを します

% sudo aptitude install dh-make
% dh_make --help
dh_make - prepare Debian packaging for an original source archive, version 0.50

Copyright (C) 1998-2009 Craig Small <csmall@debian.org>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  Usage: dh_make [options]
  -c, --copyright <type>    use <type> of license in copyright file
                            (apache|artistic|bsd|gpl|gpl2|gpl3|lgpl|lgpl2|lgpl3)
      --dpatch              using dpatch to maintain patches
      --quilt               using quilt to maintain patches
  -e, --email <address>     use <address> as the maintainer e-mail address
  -n, --native              the program is Debian native, don’t generate .orig
  -f, --file <file>         specify file to use as the original source archive
  -r, --createorig          make a copy for the original source archive
  -s, --single              set package class to single
  -i, --indep                           set package class to arch-independent
  -m, --multi               set package class to multiple binary
  -l, --library             set package class to library
  -k, --kmod                set package class to kernel module
      --kpatch              set package class to kernel patch
  -b, --cdbs                set package class to cdbs
  -a, --addmissing          reprocess package and add missing files
  -t, --templates <dir>      apply customizing templates in <dir>
  -d  --defaultless         skip the default debian and package class templates
  -o, --overlay <dir>       reprocess package using template in <dir>
  -p, --packagename <name>  force package name to be <name>
  -h, --help                display this help screen and exit
  -v, --version             show the version and exit

By Craig Small <csmall@debian.org>
Based on deb-make by Christoph Lameter <clameter@debian.org>.
Custom template support by Bruce Sass <bmsass@shaw.ca>.

ここでは

–createorig, -r
オリジナルスフイル (.orig.tar.gz) する
–copyright gpl, -c gpl
ライセンスgpl3 なのでライセンス表的なモノしておくと できあがていてです
–single, -s
シングルバイナリしますライブラリには -l としてするといでし
–cdbs, -b
CDBS() 使するのでします
–quilt, –dpatch
てることがているのであれば--dpatch もしくは--quilt しておくと でししません

以下コマンドします

% dh_make --createorig --copyright gpl --single --cdbs
(もしくは)
% dh_make -r -c gpl -s -b

すると以下のような表示されるので認して Enter します

Maintainer name : Youhei SASAKI
Email-Address   : uwabami@gfd-dennou.org
Date            : Sun, 25 Oct 2009 00:08:43 +0900
Package Name    : hello
Version         : 2.4
License         : gpl3
Using dpatch    : no
Using quilt     : no
Type of Package : cdbs
Hit <enter> to confirm:

うまく動作するとdebian レクトリができこのレクトリ以下(.ex, .EX) ができますdebian レクト 以下のようなになています

.
|-- README.Debian        ( README)
|-- changelog            (ンジログ)
|-- compat               ()
|-- control              ()
|-- copyright            (コピライト)
|-- cron.d.ex            ( cron  使イル)
|-- dirs                 (するレクトリ名の)
|-- docs                 (めるドキメントフイルする)
|-- emacsen-install.ex   (emacs  イル)
|-- emacsen-remove.ex    (emacs  イル)
|-- emacsen-startup.ex   (emacs  イル)
|-- hello.default.ex     ( debfonf  使イル)
|-- hello.doc-base.EX    ( doc-base  使イル)
|-- init.d.ex            ( init.d  使イル)
|-- init.d.lsb.ex        ( init.d  使イル)
|-- manpage.1.ex         (manpage  )
|-- manpage.sgml.ex      (manpage  )
|-- manpage.xml.ex       (manpage  )
|-- menu.ex              (メニ)
|-- postinst.ex          (postinst メンテナフイル)
|-- postrm.ex            (postrm メンテナフイル)
|-- preinst.ex           (preinst メンテナフイル)
|-- prerm.ex             (prerm メンテナフイル)
|-- rules                (ジビルドスクリプト)
‘-- watch.ex             (プストリムチイル)

ちなみにするにはこのレクトリりませんオリジナルえる quilt dpatch チシステム利用するといでし

はおもむろに .ex, .EX します

% rm -f debian/*.ex debian/*.EX

CDBS debian/rules なわれますdebian/rules はいわゆる Makefile ですのでmake 文法 必要となるていきます

GNU hello ./configure ; make ; make install install しますのでこのcdbs 使したせになれま *8 dh_make -b したdebian/rules になています

 #!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk


# Add here any variable or target overrides you need.

include されているのは

という命令です

CDBS についてはえば [CDBS 1st step][Online CDBS Gallery][CDBS Documentation Rev. 0.4.0] さい

rules 調整 ここで旦バイナリパしてみまし

  % sudo aptitude install fakeroot
  % fakeroot debian/rules binary
  ...

rules binary することでレクトリバイナリパされますこの ではバイナリパにはきもせずdebian レクトリ生成されるdebian/hello 以下認します

|-- DEBIAN
|   |-- control
|   ‘-- md5sums
‘-- usr
    |-- local
    |   |-- bin
    |   |   ‘-- hello
    |   ‘-- share
    |       |-- info
    |       |   ‘-- hello.info
    |       |-- locale
    |       |   |-- bg
    |       |   |   ‘-- LC_MESSAGES
    |       |   |       ‘-- hello.mo
--------- snip -------------------
...
103 directories, 61 files

hello /usr/local/bin install されていますこれはですよね? build log ていると configure --prefix されておらず/usr/local 以下されています

cdbs して configure --prefix=/usr するようにします

#!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk

DEB_CONFIGURE_EXTRA_FLAGS:= --prefix=/usr

もういちど fakeroot debian/rules binary しますこれをしてイル望んだになるまで debian/rules していきます

的には

  1. debian/control
  2. debian/changelog
  3. debian/copyright

つです無いならば debian/README.Debian してもいでし

control :

Source: hello
Section: devel
Priority: optional
Maintainer: Youhei SASAKI <uwabami@gfd-dennou.org>
Build-Depends: cdbs, debhelper (>= 7), autotools-dev
Standards-Version: 3.8.3
Homepage: http://www.gnu.org/software/hello

Package: hello
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: The classic greeting, and a good example
 The GNU hello program produces a familiar, friendly greeting.  It
 allows non-programmers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian package.
 It is the Debian version of the GNU Project’s ‘hello world’ program
 (which is itself an example for the GNU Project).

changelog :

% cat debian/changelog
hello (2.4-1) unstable; urgency=low

  * Initial release

 -- Youhei SASAKI <uwabami@gfd-dennou.org>  Sun, 25 Oct 2009 00:08:43 +0900

には ITP バグするところがありますITP しているにはめておくといと ます

copyright :

This work was packaged for Debian by:

    Youhei SASAKI <uwabami@gfd-dennou.org> on Sun, 25 Oct 2009 00:08:43 +0900

It was downloaded from:

    http://www.gnu.org/software/hello/

Upstream Author:

Authors of GNU Hello.

  Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.

  Copying and distribution of this file, with or without modification,
  are permitted in any medium without royalty provided the copyright
  notice and this notice are preserved.

The following contributions warranted legal paper exchanges with the
Free Software Foundation.  See also the ChangeLog and THANKS files.

Mike Haertel
David MacKenzie
Jan Brittenson
Roland McGrath
Charles Hannum
Bruce Korb              hello.c, configure.ac.
Karl Eichwalder         all files.
Karl Berry              all files.
The King                releases.

License:

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This package is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

On Debian systems, the complete text of the GNU General
Public License version 3 can be found in ‘/usr/share/common-licenses/GPL-3’.

The Debian packaging is:

    Copyright (C) 2009 Youhei SASAKI <uwabami@gfd-dennou.org>

and is licensed under the GPL version 3, see above.

AUTHORS とか COPYING とかあるにはですね

debuild, lintian バイナリパスパポリシ反の認をないますdevscriptslinitian 導入します

% sudo aptitude install debuild lintian

そのdebuild コマンドします:

% debuild -rfakeroot -uc -us
...
W: hello source: configure-generated-file-in-source config.status
W: hello source: configure-generated-file-in-source config.log
W: hello: new-package-should-close-itp-bug
Finished running lintian.

-uc-us GPG サインをしないですGPG サインするにはこのオプシ略して さい

最後てきたのが lintian によるですこれをしまし最後ITP うがないですが つは config.statusconfig.log clean ばれたするようにすればいのです

% cat debian/rules
#!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk

DEB_CONFIGURE_EXTRA_FLAGS:= --prefix=/usr

clean::
rm -f config.status config.log

このでもうdebuild してみます

% debuild -rfakeroot -uc -us
...
dpkg-deb: ‘../hello_2.4-1_amd64.deb’   ‘hello’  しています
 dpkg-genchanges  >../hello_2.4-1_amd64.changes
dpkg-genchanges: including full source code in upload
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
W: hello: new-package-should-close-itp-bug
Finished running lintian.

ITP したならばdebian/changelog ITP いておくと最後warning せますね

これでオシマイメデタシメデタシではありません

4.4 ビルドインストルテスト

まずビルドテストないますビルドテストえばスパ

ことをテストします

ビルドテストには pbuilder 使しますpbuilder 必要Debian 導入された tar.gz いてビルドにその tar.gz 展開chroot してない ます

まずは pbuilder 導入します

% sudo aptitude install pbuilder
% sudo pbuilder  --create --distribution sid

がかかりますが長にちますこれによ/var/cache/pbuilder/base.tgz 生成されますこれを使 ビルドテストないます

% sudo pbuilder --build --distribution sid --basetgz /var/cache/pbuilder/base.tgz hello_2.4-1.dsc

無事build テストりましたか? きちんとができているなら/var/cache/pbuilder/result 以下 かれています

さてビルドテストたらインスト/アンインストルテストですこれには piuparts 使します

% sudo aptitude install piuparts

piuparts pbuilder 同様からインスト/アンインストルテストしますpbuilder base.tgz 使してみまし

% sudo piuparts -d sid -b /var/cache/pbuilder/base.tgz hello_2.4-1_amd64.deb
...
0m50.1s DEBUG: No broken symlinks as far as we can find.
0m51.3s INFO: PASS: Installation, upgrade and purging tests.
0m51.3s DEBUG: Starting command: [’chroot’, ’/tmp/tmpZ2-nup’, ’umount’, ’/proc’]
0m51.3s DEBUG: Command ok: [’chroot’, ’/tmp/tmpZ2-nup’, ’umount’, ’/proc’]
0m51.7s DEBUG: Removed directory tree at /tmp/tmpZ2-nup
0m51.7s INFO: PASS: All tests.
0m51.7s INFO: piuparts run ends.

ここまできたら了です

4.5 まとめ

というわけで GNU hello から最後まで眺めてみましたには単一から複数 バイナリパしたりライブラリパ(有ライブラリ的ライブラリ + デバ シンボル) したりネルパしたりえるありますですが必要 になたらその都度えるいのではないでしうか? ですlintian がちんとてくれ ます

あ と 的 に は 法 の debhelper 使したいですえばunstable libdap debian/rules はこれだけなんですよ:

#!/usr/bin/make -f

DEB_CONFIGURE_EXTRA_FLAGS := --with-gnu-ld

# The magic debhelper rule:
%:
dh --with quilt $@

override_dh_auto_configure:
# remove out of date files
rm -f conf/config.guess conf/config.sub
autoreconf -fi
dh_auto_configure

build:
dh build
$(MAKE) docs

clean:
dh clean
rm -rf docs

これもスゴいなしたらCDBS よりえやすいんじないだろうか? とか