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
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>
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#
#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
#!/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
#!/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
dh_make -c gpl3 -e tsyrenov@mydomain.ru -n -s -p package_name_1.0.0 -d -t <путь_к_шаблону>
debuild