Debianパッケージを作成する

概要と前提

研究で作成したソフトを使った評価など、たくさんのマシンに自作のソフトをインストールする必要が生じた場合にインストール作業を行うのは手間だ。 自分はいつもDebianを使うので、Debianパッケージを作成してインストールすることで簡単にインストールできるようにした。

C++で書いた場合などには waf を使っているのでインストール・アンインストールはそんなに面倒ではない。 ここではCで書いて make しているものと想定する。 以下のようなファイルがあるものとする。

main.c

/*
 * MIT License
 *
 * Copyright (c) 2017 pman0214
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello, world!\n");
    return 0;
}

/* end of main.c */

Makefile

#
# MIT License
#
# Copyright (c) 2017 pman0214
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#

CC       =gcc
TARGET   =test-app
CFLAGS   =-Wall
OBJ      =main.o
bindir   =/usr/bin

# main target
$(TARGET): $(OBJ)
     $(CC) $(CFLAGS) -o$@ $^

main.o: main.c
     $(CC) -c $^

.PHONY: install
install: $(TARGET)
     install -pd $(DESTDIR)$(bindir)
     install -pm 755 $(TARGET) $(DESTDIR)$(bindir)

# Cleaning
.PHONY: clean
clean:
     -@$(RM) $(OBJ)

必要パッケージの導入

何のパッケージが必要なのかがやや怪しい。 とりあえず以下は必要なはず。

% sudo apt-get install devscripts build-essential lintian

これで fakerootdebuild もインストールされるはず。

手順

debian/ ディレクトリを作成する

% mkdir debian

debian/control ファイルを作成する

debian/control にはパッケージの情報を書く。 パッケージ名や依存関係、説明などを書く。 どんなフィールドがあるかは Debian Policy Manual (Declaring relationships between packages) を参照のこと。 SourcePackage のそれぞれについて使えるフィールドが異なるので注意すること。

Source: my-test-app
Maintainer: pman0214 <hoge@example.com>
Build-Depends: make, gcc
Section: utils

Package: my-test-app
Priority: optional
Architecture: all
Description: My test application
 This package provides my Debian package test application.

debian/changelog ファイルを作成する

dch コマンドを使用すると良い。

% dch -i --create

テンプレートが開くはず。

PACKAGE (VERSION) UNRELEASED; urgency=medium

  * Initial release. (Closes: #XXXXXX)

 --  <hoge@example.com>  Sun, 21 May 2017 17:30:00 +0900

これを参考にして書き換える。

my-test-app (0.1) unstable; urgency=low

  * Initial release.

 --  pman0214 <hoge@example.com>  Sun, 21 May 2017 17:30:00 +0900

debian/rules ファイルを作成する

このファイルはこのパッケージをビルド・インストールするときの Makefile と思えばいい。 今回の場合はすでに Makefile があるのでこれを呼べばいい。

#!/usr/bin/make -f

%:
     dh $@

debuild する

% debuild -us -uc

これで1つ上のディレクトリにdebファイルができる。

インストールしてみる

試しにインストールしてみよう。

% sudo dpkg -i ../my-test-app_0.1_all.deb
% ls /usr/bin/test-app
/usr/bin/test-app

きちんと入ったようだ。 削除してみる。

% sudo dpkg -r my-test-app
% ls /usr/bin/test-app
ls: cannot access /usr/bin/test-app: No such file or directory

きちんと削除できた。

パッケージでどんなファイルが入るかは以下で確認できる。

% dpkg --contents ../my-test-app_0.1_all.deb
drwxr-xr-x root/root         0 2017-05-22 08:47 ./
drwxr-xr-x root/root         0 2017-05-22 08:47 ./usr/
drwxr-xr-x root/root         0 2017-05-22 08:47 ./usr/share/
drwxr-xr-x root/root         0 2017-05-22 08:47 ./usr/share/doc/
drwxr-xr-x root/root         0 2017-05-22 08:47 ./usr/share/doc/my-test-app/
-rw-r--r-- root/root      1071 2017-05-21 17:48 ./usr/share/doc/my-test-app/copyright
-rw-r--r-- root/root       142 2017-05-21 17:40 ./usr/share/doc/my-test-app/changelog.gz
drwxr-xr-x root/root         0 2017-05-22 08:47 ./usr/bin/
-rwxr-xr-x root/root      6712 2017-05-22 08:47 ./usr/bin/test-app