суббота, 28 февраля 2015 г.

Сборка простого deb пакета

1. Создаем с нуля структуру будущего пакета
dh_make -c <license_type> -e <email_maintainer> -n -s -p <pkg_name_version>

пример:
dh_make -c gpl3 -e tsyrenov@mydomain.ru -n -s -p package_name_1.0.0

2. Заводим файл debian/install
Данный файл будет использоваться debhelper'ом dh_install для сборки в пакет необходимых нам файлов, не относящихся к файлам документации, man страницам, файлам с примерами и т.д. Для сборки файлов такого типа существуют собственные debhelper'ы.

Формат файла install:

<файл_или_каталог_помещаемый_в_пакет> <местоположение_в_пакете>
<файл_или_каталог_помещаемый_в_пакет> <местоположение_в_пакете>
...

<файл_или_каталог_помещаемый_в_пакет> - указываем путь от корня собираемого пакета (на уровне каталога debian). Работает рекурсия, т.е. при ссылке на каталог, все его содержимое так же будет включено в сборку
<местоположение_в_пакете> - то самое место, которое займет каталог или файл в системе, после установки нашего пакета

3. Настраиваем makefile debian/rules (в данном примере описан makefile с целями по умолчанию)
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

clean:
    dh_testdir
    dh_auto_clean
    dh_clean

build:
    dh_testdir
    dh_auto_configure
    dh_auto_build
    dh_auto_test

binary:
    dh_testroot
    dh_prep
    dh_installdirs
    dh_auto_install
    dh_install
    dh_installdocs
    dh_installchangelogs
    dh_installexamples
    dh_installman
    dh_installcatalogs
    dh_installcron
    dh_installdebconf
    dh_installemacsen
    dh_installifupdown
    dh_installinfo
    dh_installinit
    dh_installmenu
    dh_installmime
    dh_installmodules
    dh_installlogcheck
    dh_installlogrotate
    dh_installpam
    dh_installppp
    dh_installudev
    dh_installwm
    dh_installxfonts
    dh_bugfiles
    dh_lintian
    dh_gconf
    dh_icons
    dh_perl
    dh_usrlocal
    dh_link
    dh_compress
    #dh_fixperms - Небольшая кастомизация. В данном случае закомментировали для возможности сохранять текущие выставленные на каталоги/файлы, права доступа, уезжающие в пакет. Dh_fixperms корректирует владельца/группу и права доступа на каталоги/файлы в соответствии с политикой Debian. Например ставит chmod 644 на данные в /usr/share/doc, man страницы, устанавливает владельцем файлов пользователя root, снимает права на запись для групп/других пользователей для всех файлов. Снимает права на выполнение с библиотек, файлов с заголовками, perl модулей и т.д. Помечает как исполняемые файлы в каталогах /bin, /sbin, /usr/games, /etc/init.d. Убирает setuid, setgid биты со всех файлов пакета. Соответственно при отключении этого debhelper'а стоит внимательно проследить на корректность права на данные собираемые в пакет.
    dh_strip
    dh_makeshlibs
    dh_shlibdeps
    dh_installdeb
    dh_gencontrol
    dh_md5sums
    dh_builddeb

Так же перед сборкой пакета в debian/rules можно раскомментировать строчку #export DH_VERBOSE=1 для вывода команд dh_*, которые она выполняет в процессе сборки пакета. Также, здесь вы можете добавить строку export DH_OPTIONS=-v. В этом случае каждая команда dh_* будет выводить все команды, которые она выполняет. Это помогает понять что в действительности происходит в этом простом файле rules и при решении проблем. Новая команда dh является основной инструментов debhelper и не скрывает своих действий от вас. 

4. Настраиваем debian/control
Source: package_name
Section: main
Priority: optional
Maintainer: Sayan Tsyrenov <tsyrenov@mydomain.ru>
Build-Depends: debhelper (>= 7)
Standards-Version: 3.8.3

Package: package_name
Architecture: any
Depends: any_package
Description: package for test 

5. Настраиваем preinst/postinst, prerm/postrm файлы
Пример postinst:

#!/bin/sh
# postinst script for package_name
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postinst> `configure' <most-recently-configured-version>
#        * <old-postinst> `abort-upgrade' <new version>
#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
#          <new-version>
#        * <postinst> `abort-remove'
#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
#          <failed-install-package> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    configure)
    env_type=`cat /etc/environment.type`
    if [ -a /etc/environment.name ]; then
    env_name=`cat /etc/environment.name`
    fi
    case "$env_type" in
    production)
        if [ "$env_name" != testing ];
        then ln -snfv /etc/server-production.yaml /etc/server.yaml;
        else ln -snfv /etc/server-partners.yaml /etc/server.yaml;
        fi
    ;;
    testing)
        ln -snfv /etc/server-testing.yaml /etc/server.yaml
    ;;
    *)
        ln -snfv /etc/server-testing.yaml /etc/server.yaml
    ;;
    esac
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

Пример prerm:

#!/bin/sh
# prerm script for package_name
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <prerm> `remove'
#        * <old-prerm> `upgrade' <new-version>
#        * <new-prerm> `failed-upgrade' <old-version>
#        * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
#        * <deconfigured's-prerm> `deconfigure' `in-favour'
#          <package-being-installed> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    remove|upgrade|deconfigure)
        rm -fv /etc/server.yaml
    ;;

    failed-upgrade)
    ;;

    *)
        echo "prerm called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

6. Собираем
debuild

Сборка по шаблону

Так же есть возможность создать шаблон, используя который можно сократить кол-во действий при сборке пакета.

1. Пример содержимого шаблона

[tsyrenov@my_container template]$ ls -l
total 36
-rw-r--r-- 1 tsyrenov root  164 2013-11-15 15:28 changelog
-rw-r--r-- 1 tsyrenov root  2 2013-11-15 15:28 compat
-rw-r--r-- 1 tsyrenov root  370 2013-11-15 16:03 control
-rw-r--r-- 1 tsyrenov root 1796 2013-11-15 15:28 copyright
-rw-r--r-- 1 tsyrenov root  982 2013-11-15 15:28 postinst.ex
-rw-r--r-- 1 tsyrenov root  955 2013-11-15 15:28 postrm.ex
-rw-r--r-- 1 tsyrenov root  715 2013-11-15 15:28 preinst.ex
-rw-r--r-- 1 tsyrenov root  902 2013-11-15 15:28 prerm.ex
-rwxr-xr-x 1 tsyrenov root 1184 2013-11-15 15:55 rules

Пример подготовленных rules, control файла и т.д.

control:

Source: #PACKAGE#
Section: main
Priority: optional
Maintainer: #USERNAME# <#EMAIL#>
Build-Depends: #BUILD_DEPS#
Standards-Version: #POLICY#
Homepage: <insert the upstream URL, if relevant>

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

changelog:

#PACKAGE# (#VERSION#) unstable; urgency=low

  * Initial release

 -- #USERNAME# <#EMAIL#>  #DATE#

postinst.ex:

#!/bin/sh
# postinst script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postinst> `configure' <most-recently-configured-version>
#        * <old-postinst> `abort-upgrade' <new version>
#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
#          <new-version>
#        * <postinst> `abort-remove'
#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
#          <failed-install-package> <version> `removing'
#          <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    configure)
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)
    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

postrm.ex:

#!/bin/sh
# postrm script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <postrm> `remove'
#        * <postrm> `purge'
#        * <old-postrm> `upgrade' <new-version>
#        * <new-postrm> `failed-upgrade' <old-version>
#        * <new-postrm> `abort-install'
#        * <new-postrm> `abort-install' <old-version>
#        * <new-postrm> `abort-upgrade' <old-version>
#        * <disappearer's-postrm> `disappear' <overwriter>
#          <overwriter-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
    ;;

    *)
        echo "postrm called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

preinst.ex:

#!/bin/sh
# preinst script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <new-preinst> `install'
#        * <new-preinst> `install' <old-version>
#        * <new-preinst> `upgrade' <old-version>
#        * <old-preinst> `abort-upgrade' <new-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    install|upgrade)
    ;;

    abort-upgrade)
    ;;

    *)
        echo "preinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

prerm.ex

#!/bin/sh
# preinst script for #PACKAGE#
#
# see: dh_installdeb(1)

set -e

# summary of how this script can be called:
#        * <new-preinst> `install'
#        * <new-preinst> `install' <old-version>
#        * <new-preinst> `upgrade' <old-version>
#        * <old-preinst> `abort-upgrade' <new-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package

case "$1" in
    install|upgrade)
    ;;

    abort-upgrade)
    ;;

    *)
        echo "preinst called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

exit 0

2. Собираем с использованием шаблона
dh_make -c gpl3 -e tsyrenov@mydomain.ru -n -s -p package_name_1.0.0 -d -t <путь_к_шаблону>
debuild