Debianパッケージの作成の手順について解説

Linux

Debianパッケージについて解説」の記事で、Debianパッケージの仕組みについて解説しましたが、今度はDebianパッケージの作成の手順について解説したいと思います。

Debianパッケージ作成の流れ

Debianパッケージの作成方法はいくつかありますが、本記事では、「debhelper」と「dh_make」を使用する方法で作成していこうと思います。(※この方法が現時点では最も一般的だそうです。) 以下のような手順になります。

  1. 必要なツールのインストール
  2. パッケージディレクトリの作成
  3. 実行スクリプトの作成
  4. ソースアーカイブの作成
  5. テンプレートファイルの作成
  6. control, rules, changelogの編集
  7. インストールスクリプトの作成
  8. パッケージのビルド
  9. 動作確認

各手順について1つずつ説明していきます。

動作環境は Ubuntu 22.04 LTS を想定しています。

1.必要ツールのインストール

まずはDebianパッケージ作成するための必要ツールのインストールを行います。

sudo apt-get install dh-make debhelper devscripts

2.パッケージディレクトリの作成

「hello」ディレクトリの中に「hello-sample-1.0」という名称のパッケージディレクトリを作成し、「hello」ディレクトリ内に移動します。

パッケージディレクトリ名は必ず <パッケージ名>-<バージョン番号> の形式である必要があります。また、パッケージ名には「アルファベット小文字、数字(0~9)、'+'、'-'、'.'」以外は使用できません。
~$ mkdir -p hello/hello-sample-1.0
~$ cd hello/

3.実行スクリプトの作成

「hello」ディレクトリ配下にhello_srcディレクトリを作成し、「hello.sh」という実行スクリプトを作成します。”hello”の文字列を標準出力するのみの動作となります。以下のコマンドを実行します。

~/hello$ mkdir hello_src && cd hello_src
~/hello/hello_src$ echo -e '#!/bin/bash\necho "hello"' > hello.sh

「hello.sh」の中身は以下のようになります。

#!/bin/bash
echo "hello"

「hello.sh」に実行権限を付けます。

~/hello/hello_src$ chmod +x hello.sh

「hello.sh」を実行すると”hello”が標準出力されます。

~/hello/hello_src$ ./hello.sh
hello

4.ソースアーカイブの作成

Debianパッケージ作成には、ソースコードのアーカイブファイルが必要になります。以下のコマンドでソースアーカイブを作成します。

~/hello/hello_src$ tar -Jcf hello-sample_1.0.orig.tar.xz hello.sh
~/hello/hello_src$ ls
hello-sample_1.0.orig.tar.xz  hello.sh

ここで作成されたソースアーカイブファイルは、パッケージのビルド時に使用されます。

今回は「hello.sh」がソースコード兼実行ファイルとなります。

5.テンプレートファイルの作成

パッケージディレクトリ内で「dh_make」コマンドを使用して、パッケージ構築に必要なテンプレートファイルを生成します。以下のコマンドを実行します。

~/hello/hello_src$ cd ../hello-sample-1.0/
~/hello/hello-sample-1.0$  dh_make -s -y -f ../hello_src/hello-sample_1.0.orig.tar.xz

各オプションは以下のような意味を持ちます。

  • -s:シング区バイナリパッケージを作成することを意味します。今回は「hello.sh」のみなのでこれを指定します。
  • -y:すべてのプロンプトに自動的に「はい」と回答し、対話的な入力をスキップします。
  • -f {ソースアーカイブファイルのパス}:使用するソースアーカイブファイルパスを指定します。

コマンド実行後、カレントディレクトリには「debian」ディレクトリが作成され、1つ上のディレクトリ(「hello」ディレクトリ直下)には「4.ソースアーカイブの作成」で作成したソースアーカイブファイル(hello-sample_1.0.orig.tar.xz)がコピーされます。

~/hello/hello-sample-1.0$ ls
debian
~/hello/hello-sample-1.0$ ls ../
hello-sample-1.0  hello-sample_1.0.orig.tar.xz hello_src

6.control, rules, changelogの編集

「dh_make」コマンド実行後に「debian」ディレクトリ配下に生成された「control」,「rules」,「changelog」ファイルはこのタイミングでそれぞれ編集できます。これらのファイルはデフォルトのままでもパッケージ作成は行えるため編集は行いませんが、中身について簡単に説明します。

これらのファイルに関する具体的な内容については、こちらのページ等を参照してください。

control

「control」ファイルはパッケージに関するメタデータが含まれています。ビルドプロセス実行中やパッケージ管理プロセス中の複数のタイミングで呼び出されます。デフォルトでは以下のようになっています。

Source: hello-sample
Section: unknown
Priority: optional
Maintainer: Your Name <youremail@example.com>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.0
Homepage: <insert the upstream URL, if relevant>
#Vcs-Browser: https://salsa.debian.org/debian/hello-sample
#Vcs-Git: https://salsa.debian.org/debian/hello-sample.git
Rules-Requires-Root: no

Package: hello-sample
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
 <insert long description, indented with spaces>

各項目のそれぞれの意味を簡単に説明します。

  • Source:パッケージ名を表します。
  • Section:パッケージが属するセクションを表します。
  • Priority:パッケージの優先順位を表します。
  • Maintainer:パッケージのメンテナーの名前とメールアドレスを表します。
  • Build-Depends:ビルドに必要な依存パッケージを表します。
  • Standards-Version:使用する Debian ポリシーのバージョンを表します。
  • Package:バイナリパッケージの名前を表します。
  • Architecture:パッケージのアーキテクチャを表します。
  • Depends:実行時の依存パッケージを表します。
  • Description:パッケージの説明を表します。

rules

「rules」ファイルはパッケージのビルドプロセスを制御するスクリプトです。「debuild」コマンド実行中に呼び出されます。デフォルトでは以下のようになっています。

#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1


# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed


%:
	dh $@


# dh_make generated override targets
# This is example for Cmake (See https://bugs.debian.org/641051 )
#override_dh_auto_configure:
#	dh_auto_configure -- \
#	-DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)

上記のスクリプトでは「dh $@」が実行されます。「$@」はターゲット(build, clean, install等)に応じて置き換えられます。

changelog

「changelog」ファイルには、パッケージのバージョン履歴と変更点が記録されます。デフォルトでは以下のようになっています。

hello-sample (1.0-1) UNRELEASED; urgency=medium

  * Initial release (Closes: #nnnn)  <nnnn is the bug number of your ITP>

 -- unknown <furu@unknown>  Sat, 06 Jan 2024 11:14:50 +0900

「changelog」ファイルのフォーマットは以下のようになっているので、それに合わせて編集できます。

パッケージ名 (バージョン) ディストリビューション; 緊急度=緊急度
  * 変更点1
  * 変更点2
-- メンテナー名 <メンテナーメール>  日付

7.インストールスクリプトの作成

「debian/install」ファイルを作成して、インストールするファイルとその宛先を指定します。以下のコマンドを実行します。

~/hello/hello-sample-1.0$ echo '../hello_src/hello.sh usr/bin' > debian/install

「debian/install」ファイルの中身は以下のようになります。

../hello_src/hello.sh usr/bin
「hello.sh」は、「3.実行スクリプト作成」の章で作成したものです。

8.パッケージのビルド

debuild」コマンドを使用して、パッケージのビルド(作成)を行います。以下のコマンドを実行します。

~/hello/hello-sample-1.0$ debuild -us -uc

「-us」と「-uc」は、GPG署名を省略するためのオプションです。作成したパッケージを配布する場合はGPG署名は必要ですが、今回はそういったことは行わないので省略します。

実行後、成功するとパッケージファイルを含む複数のファイルが1つ上のディレクトリ(「hello」ディレクトリ直下)に生成されます。

~/hello/hello-sample-1.0$ cd ..
~/hello$ ls
hello-sample-1.0                  hello-sample_1.0-1.dsc          hello-sample_1.0-1_amd64.buildinfo  hello-sample_1.0-1_amd64.deb
hello-sample_1.0-1.debian.tar.xz  hello-sample_1.0-1_amd64.build  hello-sample_1.0-1_amd64.changes    hello-sample_1.0.orig.tar.xz

生成されたファイルについてそれぞれ説明します。

  • hello-sample_1.0-1_amd64.deb:実際のDebianパッケージファイルで、ユーザーがシステムにインストールできる形式です。
  • hello-sample_1.0-1.dsc:パッケージビルドに関するメタデータが記載されたテキストファイルです。
  • hello-sample_1.0-1_amd64.changes:ビルドされたパッケージの変更履歴やメタデータが記載されたテキストファイルです。
  • hello-sample_1.0-1.debian.tar.xz:Debianパッケージの一部であり、パッケージ作成時に必要なDebian固有のファイルを含んでいます。
  • hello-sample_1.0-1_amd64.buildinfo:ビルドプロセスの詳細が記載されたテキストファイルです。
  • hello-sample_1.0-1_amd64.build:パッケージのビルドプロセス中に発生したすべてのイベント、コマンドの実行、出力メッセージ記載されたテキストファイルです。

9.動作確認

8.パッケージのビルド」で作成したDebianパッケージの動作確認をしてみます。

インストール

dpkg」コマンドでパッケージのインストールを行います。

~/hello$ sudo dpkg -i hello-sample_1.0-1_amd64.deb
Selecting previously unselected package hello-sample.
(Reading database ... 67755 files and directories currently installed.)
Preparing to unpack hello-sample_1.0-1_amd64.deb ...
Unpacking hello-sample (1.0-1) ...
Setting up hello-sample (1.0-1) ...
「-i」オプションはインストールの意味を持ちます。また、インストールではシステムディレクトリにアクセスするため、「sudo」を付けます。

実行

インストール時に「hello.sh」が「/usr/bin」配下に置かれるので、「hello.sh」をコマンド入力することで実行することができます。

~/hello$ ls /usr/bin | grep hello.sh
hello.sh
~/hello$ hello.sh
hello

“hello”が標準出力されたので、インストールは成功となります。

アンインストール

インストール時と同様に、dpkgコマンドでパッケージのアンインストールを行います。アンインストール後、「hello.sh」が実行できないことが確認できます。

~/hello$ sudo dpkg -P hello-sample
(Reading database ... 67761 files and directories currently installed.)
Removing hello-sample (1.0-1) ...
~/hello$ hello.sh
-bash: /usr/bin/hello.sh: No such file or directory
「-P」オプションを付けると、パッケージを完全に削除します。「-r」でもパッケージの削除は行えますが、設定ファイルが残ります。設定ファイルを残すことで再インストールなどに便利ですが、今回はその必要がないため、「-P」で完全削除を行います。

まとめ

今回は、Debianパッケージの作成手順について解説してきました。思ったよりも複雑な内容だったと思います。また機会があれば、APTサーバを立ててリポジトリでパッケージの管理を行う方法についても解説したいと思いますのでよろしくお願いします。

参考文献

タイトルとURLをコピーしました