はじめに
Debianパッケージをソースパッケージから作成する方法について記載したページは散見されますが、ここでは、ソースをビルドする必要のない設定ファイルやスクリプト等のインストールのみを行うDebianバイナリパッケージの作成方法について記載します。
シェルをインストールするDebianバイナリパッケージの作成方法を例に記載します。また、作成するパッケージは、公開せずローカル環境で使用するものとします。
作成したパッケージを公開する場合は、Debianポリシーマニュアルに記載されている仕様に準拠する必要がありますので、そちらをご一読ください。
環境
- ボード
Raspberry Pi 4 Model B - OS
Raspberry Pi OS (32-bit) Lite
Minimal image based on Debian Buster
Version: August 2020
Release date: 2020-08-20
Kernel version: 5.4
事前準備
パッケージをビルドする際に必要となるパッケージをインストールします。
pi@raspberrypi:~ $ sudo apt-get install dh-make devscripts
pi@raspberrypi:~ $
パッケージの作成方法
作成するパッケージ名を「samplepackage」、アップストリームバージョンを「0.1」とします。また、インストールするシェルは、「test.sh」とします。
ソースディレクトリの作成
ソースディレクトリは、パッケージを作成する際の起点となる作業ディレクトリです。
ソースディレクトリを作成し、そのディレクトリに移動します。
dh_makeは、現在のディレクトリ名をdebian/controlファイルの特定のフィールドで使用します。このため、-フォーマットでディレクトリを作成する必要があります。
dh_makeを実行する際に、-pオプション(–packagename)を指定することにより、
ディレクトリ名とは異なる名前に変更することができます。
pi@raspberrypi:~ $ mkdir samplepackage-0.1
pi@raspberrypi:~ $ cd samplepackage-0.1/
pi@raspberrypi:~/samplepackage-0.1 $
パッケージに含めるシェルのコピー
パッケージでインストールするシェルをソースディレクトリにコピーします。
pi@raspberrypi:~/samplepackage-0.1 $ cp ~/test.sh .
pi@raspberrypi:~/samplepackage-0.1 $
ディレクトリツリーは、以下のようになります。
pi@raspberrypi:~ $ tree
.
`-- samplepackage-0.1
`-- test.sh
pi@raspberrypi:~ $
DEBEMAIL、DEBFULLNAME環境変数の作成
この環境変数は、debian/control及びdebian/changelogファイルで使用されます。
pi@raspberrypi:~ $ cat >>~/.bashrc < DEBEMAIL="hoge@example.tld"
> DEBFULLNAME="Hoge Tester"
> export DEBEMAIL DEBFULLNAME
> EOF
pi@raspberrypi:~ $ . ~/.bashrc
pi@raspberrypi:~ $
オリジナルソースパッケージと制御ファイルの作成
samplepackage-0.1ディレクトリで、dh_makeコマンドを以下のオプションを記載して実行します。
–indepオプションは、CPUのアーキテクチャに依存しないパッケージを作成します。
–createorigオプションは、パッケージをビルドするために必要なオリジナルソースのアーカイブを作成します。
ソースアーカイブは、親ディレクトリに作成されます。(../sampmlepackage_0.1.orig.tar.gz)
pi@raspberrypi:~/samplepackage-0.1 $ dh_make --indep --createorig
Maintainer Name : Person Tester
Email-Address : person@company.tld
Date : Wed, 27 May 2020 11:08:45 +0900
Package Name : samplepackage
Version : 0.1
License : blank
Package Type : indep
Are the details correct? [Y/n/q]
Currently there is not top level Makefile. This may require additional tuning
Done. Please edit the files in the debian/ subdirectory now.
pi@raspberrypi:~/samplepackage-0.1 $
dh_makeコマンドを実行した後のディレクトリツリーは、以下のようになります。
pi@raspberrypi:~/samplepackage-0.1 $ tree ../
.
|-- samplepackage-0.1
| |-- debian
| | |-- README.Debian
| | |-- README.source
| | |-- changelog
| | |-- compat
| | |-- control
| | |-- copyright
| | |-- manpage.1.ex
| | |-- manpage.sgml.ex
| | |-- manpage.xml.ex
| | |-- menu.ex
| | |-- postinst.ex
| | |-- postrm.ex
| | |-- preinst.ex
| | |-- prerm.ex
| | |-- rules
| | |-- samplepackage-docs.docs
| | |-- samplepackage.cron.d.ex
| | |-- samplepackage.doc-base.EX
| | |-- source
| | | `-- format
| | `-- watch.ex
| `-- test.sh
`-- samplepackage_0.1.orig.tar.xz
pi@raspberrypi:~/samplepackage-0.1 $
不要な設定ファイルの削除
debianディレクトリにある使用しない設定ファイル(.exや.EXファイルやREADMEs)を削除します。
pi@raspberrypi:~/samplepackage-0.1/debian $ rm README.* *.ex *.EX
pi@raspberrypi:~/samplepackage-0.1/debian $
「debian/install」設定ファイルの作成
debian/install設定ファイルは、debuildコマンドにパッケージに含めたいファイルを伝えるために使用します。
debian/install設定ファイルは、dh_makeコマンドでは作成されません。このため、別途作成する必要があります。
ここでは、test.shを/usr/binにインストールすることにします。
pi@raspberrypi:~/samplepackage-0.1 $ touch debian/install
pi@raspberrypi:~/samplepackage-0.1 $ vi debian/install
【debian/installファイルの記載内容】
test.sh usr/bin
pi@raspberrypi:~/samplepackage-0.1 $
各行は、「インストールするプログラムパス」<スペース>「実際にインストールするパス」というフォーマットで記載します。
「インストールするプログラムパス」は、ソースディレクトリ(samplepackage-0.1)を起点としたパスを記載します。
「実際にインストールするパス」は、ルートパスを起点として記載します。
また、複数のシェルをパッケージに含めたい場合は、ソースディレクトリにそのシェルを移動し、上記と同様にdh_makeコマンドを実行します。その後、/debian/install設定ファイルに追記します。
【debian/installファイルの記載例】
test.sh usr/bin
test2.sh usr/bin
test3.sh usr/bin
パッケージの作成
以上でパッケージを作成する準備が整いましたので、debuildツールを使用してインストールパッケージを作成します。
-us及び-ucオプションは、GPGによる署名を行わないことをdebuildツールに伝えるオプションです。
ローカル環境での使用のため、署名を省略しています。
pi@raspberrypi:~/samplepackage-0.1 $ debuild -us -uc
dpkg-buildpackage -us -uc -ui
dpkg-buildpackage: info: source package samplepackage
dpkg-buildpackage: info: source version 0.1-1
dpkg-buildpackage: info: source distribution unstable
dpkg-buildpackage: info: source changed by Person Tester
dpkg-source --before-build .
dpkg-buildpackage: info: host architecture armhf
fakeroot debian/rules clean
dh clean
dh_clean
dpkg-source -b .
dpkg-source: info: using source format '3.0 (quilt)'
dpkg-source: info: building samplepackage using existing ./samplepackage_0.1.orig.tar.xz
dpkg-source: info: building samplepackage in samplepackage_0.1-1.debian.tar.xz
dpkg-source: info: building samplepackage in samplepackage_0.1-1.dsc
debian/rules build
dh build
dh_update_autotools_config
dh_autoreconf
create-stamp debian/debhelper-build-stamp
fakeroot debian/rules binary
dh binary
dh_testroot
dh_prep
dh_install
dh_installdocs
dh_installchangelogs
dh_perl
dh_link
dh_strip_nondeterminism
dh_compress
dh_fixperms
dh_missing
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: building package 'samplepackage' in '../samplepackage_0.1-1_all.deb'.
dpkg-genbuildinfo
dpkg-genchanges >../samplepackage_0.1-1_armhf.changes
dpkg-genchanges: info: including full source code in upload
dpkg-source --after-build .
dpkg-buildpackage: info: full upload (original source is included)
Now running lintian samplepackage_0.1-1_armhf.changes ...
W: samplepackage source: superfluous-clutter-in-homepage
W: samplepackage source: bad-homepage
E: samplepackage source: debian-rules-is-dh_make-template
W: samplepackage source: space-in-std-shortname-in-dep5-copyright (paragraph at line 5)
W: samplepackage: wrong-bug-number-in-closes l3:#nnnn
W: samplepackage: new-package-should-close-itp-bug
E: samplepackage: changelog-is-dh_make-template
E: samplepackage: helper-templates-in-copyright
W: samplepackage: copyright-has-url-from-dh_make-boilerplate
E: samplepackage: copyright-contains-dh_make-todo-boilerplate
E: samplepackage: description-is-dh_make-template
E: samplepackage: section-is-dh_make-template
W: samplepackage: superfluous-clutter-in-homepage
W: samplepackage: bad-homepage
W: samplepackage: script-with-language-extension usr/bin/test.sh
W: samplepackage: binary-without-manpage usr/bin/test.sh
Finished running lintian.
pi@raspberrypi:~/samplepackage-0.1 $
ソースディレクトリに、「samplepackage_0.1-1_all.deb」Debianバイナリパッケージが作成されます。
ディレクトリツリーは、以下のようになります。
pi@raspberrypi:~ $ tree -L 1
.
|-- samplepackage-0.1
|-- samplepackage_0.1-1.debian.tar.xz
|-- samplepackage_0.1-1.dsc
|-- samplepackage_0.1-1_all.deb
|-- samplepackage_0.1-1_armhf.build
|-- samplepackage_0.1-1_armhf.buildinfo
|-- samplepackage_0.1-1_armhf.changes
`-- samplepackage_0.1.orig.tar.xz
1 directory, 7 files
pi@raspberrypi:~ $
作成パッケージの確認
作成されたバイナリパッケージのインストールを行います。
pi@raspberrypi:~ $ sudo dpkg -i samplepackage_0.1-1_all.deb
以前に未選択のパッケージ samplepackage を選択しています。
(データベースを読み込んでいます ... 現在 47723 個のファイルとディレクトリがイン ストールされています。)
samplepackage_0.1-1_all.deb を展開する準備をしています ...
samplepackage (0.1-1) を展開しています...
samplepackage (0.1-1) を設定しています ...
pi@raspberrypi:~ $
インストールディレクトリ及び実行権限の確認を行います。
pi@raspberrypi:~ $ ls -l /usr/bin/test.sh
-rwxr-xr-x 1 root root 25 5月 27 11:49 /usr/bin/test.sh
pi@raspberrypi:~ $
実行できるか確認します。
pi@raspberrypi:~ $ test.sh
Hello!!
pi@raspberrypi:~ $