Subsections
Целта на този процес е да се организира изграждането на сорс и бинарни 
пакети, които да бъдат обработвани от инструментите за пакетиране, инсталиране, 
премахване и преконфигуриране. Целта е в системата да има установен ред и правила 
при изпълнението на тези дейности с което наистина ще държим нещата под наш 
контрол, независимо колко е голяма инсталираното от системата, 
знаейки какво е инсталирано, как е инсталирано, с чисто премахване или 
надграждане на нещо вече инсталирано. Debian е известен с легендарните си 
способности за чисто инсталиране и надграждане на пакетите на системата. В тази глава 
ще се постараем да обясним къде е генезиса на всичко това и то да не изглежда просто 
като легенда, а като рутинна практика при всекидневното използване на системата. 
Като реален пример може да се посочи десктопа на един от авторите който е система 
първоначално инсталирана преди около 5 години (към момента на писане на тази глава). 
Системата разбира се е подложена на всекидневни упгрейди, инсталации на нови пакети или 
тяхното премахване и други по-необичайни дейности, при които проблеми може и да има, 
но те са решими. През повечето време системата изглежда като току-що инсталирана. Чиста. 
Разбира се, това съвсем не значи, че в някой директории като /usr/local/ и в 
домашните директории на потребителите не може да се води война от инсталиране и премахване 
на каквото ви душа иска. Напротив, това не е територия на системата и е изцяло на вашата 
воля, какво ще правите там. Е, с глупави и опасни програми не си губете времето, внимавайте 
какво инсталирате и къде особено когато използвате суперпотребителя root. 
Научете Debian отвътре за да подчините и експлоатирате възможностите му за 
вашите потребителски цели.
- За да разберем какво съдържа един дебиански пакет, вземаме кой да е 
такъв и пробваме командите dpkg-deb -x и dpkg-deb -е върху него. 
 
- За да разберем какво представлява изходния код на един дебиански пакет, 
вземаме изходния код на пакета  hello, поглеждаме набързо .dsc файла, 
а останалите два файла разпакетираш по два начина:
	
- с dpkg-source 
- ръчно с tar и patch
	
 
 
- Разглеждаме съдържанието на директорията debian в изходния код на пакета 
 hello. Ползваме  Debian Policy Manual 
като справочник или това е в пакета  debian-policy.
 
- Когато нещата станат ясни, правиме същото с пакета  hello-debhelper, използвайки
 debhelper(7) като справочник. Имайте на предвид, че  debhelper улеснява значително 
създаването на дебиански пакети автоматизирайки извършването на много рутинни и повтарящи се дейности.
 
- През свободното време четем: 
	
 
- Вземаме програмата която искаме да пакетираме и копираме в изходния й код директорията 
debian от пакета  hello-debhelper, като пригодяваме нещата за да генерираме
нашия deb-пакет. Следващия път няма да използваме  hello-debhelper, а някой вече 
съществуващ изготвен от нас пакет.
 
- Когато разберем какво значи Intend To Package, изпращаме ITP съобщение, 
за да не би някой друг да реши да пакетира същата програма и да си дублирате усилията. Ако
все още не сме одобрени за upload в официалното хранилище, можем да използваме
 Mentors Public Package Repository
На практика, след като се установи, че даден софтуер си заслужава да се
включи в официалния архив от пакети на Debian, се изготвя
debian source package, който включва upstream source
и директорията с maintainer scripts. От този debian
  source package след това се получават debian binary
  packages (deb-файлове) за различните хардуерни
архитектури, като се отчита и фактът, че има и такъв софтуер, който не
е пригоден или предвиден за всички хардуерни архитектури, а само за
една или няколко. Обикновено за получаването на базовите или начални
версии на maintainer scripts за debian/ се използват 
Perl-скриптовете от пакета  debhelper, след което се донастройват
специфичните за пакета неща. В крайна сметка се създава унифицирано
управление на процеса по конфигуриране на сорса, компилация, свързване
и евентуално последващо конфигуриране и преконфигуриране на софтуера
за различните хардуерни архитектури. Разбира се, maintainer
  scripts не изместват стандартните GNU devel tools, а
работейки преди или над тях, ги използват по подходящ начин.
Естествено, в крайна сметка се извикват стандартните GNU devel
  tools чрез файла debian/rules, който се явява стандартен
файл за програмата make, само че не е именуван като
Makefile, а започващ с shebang (#!) ред в
началото си, указващ пътя до make. Използват се още доста
файлове в maintainer scripts и пример за това как точно
стават нещата, е даден в  Debian New Maintainers'
  Guide. Едно доста добро 
  обяснение като за начало би бил документът на IBM -  
 Learn how to build easy-to-distribute packages for Debian users.
Ще обясним накратко кои пакети и кои програми идващи с тях обикновено 
се използват при този процес. Тук ще дадем само някои насоки, което не 
изключва прочитането на  man(1) страниците на програмите и документацията 
в директориите /usr/share/doc/име_на_пакет/. Имайте предвид, че 
постоянно могат да се появяват такива, но възлагайте на тях само рутинната част по 
създаването на файловете необходими за пакетиране, след което лично се убедете 
в тяхното съдържание и нанесете съответните корекции, така щото сорс пакета 
който създавате да се получат съответните бинарни пакети ( deb(5)) в 
съответствие с всички правила и норми. Процеса може да бъде много прост и 
рутинен, но и много сложен и необичаен, всичко зависи от това какъв сорс 
пакетирате и как точно сте решили да го направите.
 
Съдържа програмата  dh_make(8), която се използва 
за първоначалното създаване на директорията debian и файловете в нея. 
С други думи спестява ви тази рутинна дейност, но задължително трябва да разгледате 
файловете и да внесете необходимите промени за точно този сорс пакет който дебианизирате.
Дотук вече трябва да сте добили представа как се борави с debian binary packages 
(или  deb(5)). Нека видим как се получават те. Захващаме се да разберем какво има и в 
debian source packages. Само да напомним, че без да сте прочели 
 Debian New Maintainer's Guide, още достъпен 
и като пакет  maint-guide, или поне да сте прехвърлили с поглед
 стария му превод,
ще ви е доста трудно да разберете за какво ще се говори в следващата глава.
Пакетът  dh-make съдържа скрипта  dh_make(8), който
генерира debian source package от regular source code archive
(или upstream sources), подготвя control-файловете,
както и предоставя примерна конфигурация за  debhelper(1)
инструментите, за която конфигурация обикновено е необходимо само
малко донастройка, за за да пасне за конкретния случай.  Или с други
думи,  dh-make се използва за създаване на скелета или общия вид
на debian source package, след което може да доредактирате файловете в
директория debian/ както намерите за добре.  По-опитните
maintainers могат и без него, но силно се препоръчва да се използва от
начинаещите потребители, при което по-лесно и бързо ще свикнат с
процеса на конфигуриране на debian source packages.  Използва се
например така:
# cd program-source-directory
# dh_make -e your.maint@address -f ../programname-x.y.z.tar.gz
Разбира се, ще отговорите на няколко въпроса, като дали това ще е
single или multiple binary packages, библиотеки и прочее. За повече се
обърнете към  Debian New Maintainer's
  Guige, главата First Steps,
т. 2.4 Initial Debianization.
Съдържа колекция от мощни Perl скриптове които 
можете да извиквате от debian/rules, който обикновено е файл за 
програмата  make(1), както и от други скриптове като
.preinst,.postinst,.prerm,.postrm. Скриптовете са много, просто изпълнете: 
dpkg -L denhelper за да ги видите.
Скриптовете dh_* от пакета  debhelper се извикват от
maintainer scripts в debian source packages, и по точно от файла
debian/rules.  Използват се за автоматизиране на процедурите
по построяването на debian binary packages, а именно, като инсталиране
на определени файлове в дадения пакет, компресиране, установяване на
съответните права и собственост, интегриране с debian menu system и
много други.  Повечето debian source packages използват скриптовете на
 debhelper като част от техния build процес.
Ето и какви Perl скриптове се съдържат във версия 4.0.2 на пакета
 debhelper. За да ги листнем, изпълняваме:
$ dpkg -L debhelper | grep usr/bin
Следват кратки обяснения за скриптовете от пакета  debhelper:
-  dh_builddeb(1): извиква  dpkg(8) да билдва пакети.
 
-  dh_clean(1): почиства build директорията на пакета.
 
-  dh_compress(1): компресира файлове и оправя символните
  връзки в билд директорията на пакета.
 
-  dh_fixperms(1): оправя правата на файловете в билд
  директорията на пакета.
 
-  dh_gencontrol(1): генерира и инсталира
  control-файла в билд директорията на пакета.
 
-  dh_install(1): инсталира файлове, които не се нуждаят от
  специална обработка в билд директорията на пакета. За някои
  по-специални файлове са предвидени и по-специални скриптове.
 
-  dh_installchangelogs(1): инсталира
  changelog-файловете в билд директорията на пакета
 
-  dh_installcron(1): инсталира  cron скриптове в
  etc/cron.*
 
-  dh_installdeb(1): в DEBIAN директорията
  инсталира файловете:
 
- package.postinst 
- package.preinst
- package.postrm
- package.prerm
- package.shlibs
- package.conffiles
  
 
 
-  dh_installdebconf(1): инсталира файловете,
  използвани от  debconf(7) в билд директорията на пакета.
 
-  dh_installdirs(1): създава поддиректориите в билд
  директорията на пакета.
 
-  dh_installdocs(1): инсталира документацията в билд
  директорията на пакета.
 
-  dh_installemacsen(1): за някои пакети е възможно или е
  необходимо да се извършва byte-compiling по време на инсталацията.
  Такъв пример е Emacs (е то оставаше точно пък той да не е ;-). Ако
  вашият пакет се нуждае подобна функционалност, точно този
  dh_*-скрипт ще извикате от файла debian/rules.
 
-  dh_installexamples(1): инсталира examples файловете в
  билд директорията на пакета, или по-точно в
  usr/share/doc/пакет/examples. Файлът
  debian/packages.examples може да съдържа списък с други
  файлове, които да бъдат инсталирани.
 
-  dh_installinfo(1): инсталира info-файловете.  Файлът
  debian/packages.info може да съдържа списък с други
  файлове, които да бъдат инсталирани.
 
-  dh_installinit(1): инсталира init-скриптове в билд
  директорията на пакета.
 
-  dh_installlogrotate(1): инсталира конфигурационните
  файлове за  logrotate
 
-  dh_installman(1): инсталира man-файловете. Файлът
  debian/packages.manpages може да съдържа списък с други
  файлове, които да бъдат инсталирани
 
-  dh_installmanpages(1): това е стария аналог на предната
  команда, вместо него използвайте  dh_installman(1)
 
-  dh_installmenu(1): инсталира debian menu файловете в билд
  директорията на пакета. Автоматично генерира postinst и
  postrm, необходими да взаимодействат в пакета  menu.
  Ако има файл debian/package.menu, то той се инсталира в
  usr/lib/menu/package в билд директорията на пакета (това е
  debian menu файлът,  menufile(5L)). Ако има файл
  debian/package.menu-method, то той се инсталира в
  etc/menu-methods/пакет в билд директорията на
  пакета.  Tова е debian menu method файл. За повече информация вижте
   update-menus(1).
 
-  dh_installmime(1): инсталира MIME-файловете в билд
  директорията на пакета. Ако има файл debian/package.mime,
  то той се инсталира в usr/lib/mime/packages/пакет
  в билд директорията на пакета.
 
-  dh_installmodules(1): регистрира kernel-модули
  посредством  modutils. Ако има файл
  debian/package.modules, то той ще бъде инсталиран в
  etc/modutils/пакет
 
-  dh_installpam(1): инсталира файловете за поддръжка на
  PAM. Ако има файл debian/package.pam, то той ще бъде
  инсталиран като etc/pam.d/пакет.
 
-  dh_installwm(1): регистрира window manager.  Файлът
  debian/package.wm може да съдържа списък с други прозоречни
  манежери.
 
-  dh_installxaw(1): инсталира конфигурационните файлове на
  Xaw wrappers в билд директорията на пакета. Ако има файл
  debian/package.xaw, то той ще бъде инсталиран в
  usr/lib/xaw-wrappers/config/пакет в билд
  директорията на пакета.
 
-  dh_installxfonts(1): регистрира шрифтовете за X
 
-  dh_link(1): създава символни връзки в билд директорията
  на пакета
 
-  dh_listpackages(1): листва binary packages, за които ще
  се използва  debhelper
 
-  dh_makeshlibs(1): генерира shlibs-файл
 
-  dh_md5sums(1): генерира DEBIAN/md5sums файл.
 
-  dh_movefiles(1): файлът debian/package.files
  съдържа списък с файловете, които да бъдат преместени от
  debian/tmp в subpackages. Използвайте
   dh_install(1), която напълно я замества, като може и доста
  други работи.
 
-  dh_perl(1): генерира зависимостите на Perl скриптовете
  вкл. и Perl модулите, от които зависят
 
-  dh_shlibdeps(1): генерира зависимостите за споделените
  библиотеки (много яка проверка)
 
-  dh_strip(1): стрипва или премахва дебъг символите от
  изпълнимите и библиотечните файлове, за да се намали размера им
 
-  dh_suidregister(1): не ползвайте този скрипт! Оставен е
  само за обратна съвместимост. Вместо него използвайте
   dpkg-statoverride(8).
 
-  dh_testdir(1): тества директорията преди да се билдва
  пакета. Проверява за наличието на debian/control, както и
  за някой други основни файлове.
 
-  dh_testroot(1): проверява за това дали пакетът се билдва
  от потребителя root. За справка  fakeroot(1).
 
-  dh_testversion(1): не ползвайте този скрипт! Проверява
  дали е инсталирана правилната версия на пакета  debhelper.
  Вместо него се използват dependencies и conflicts от
  control файла.
 
-  dh_undocumented(1): създава символна връзка към
  undocumented.7.gz. В случай, че пакетът няма man
  страница, разбира се.
 
Разбира се, не при всички debian source packages ще се извикват всички
dh_* скриптове. Това ще зависи от съответния пакет, както и
от решенията на maintainer-а. Най-добре ще е първо да изчетете добре
man-стрaниците за тези скриптове, както и четенето на самите скриптове
(Perl) не пречи, разбира се. Вземете, например, сорса на MPlayer от
CVS или някое негово издание и разгледайте файла debian/rules
за това какви dh_* скриптове се извикват от него. Същото
можете да направите и с който и да е debian source package, включен в
официалния Debian архив. Другото, което е добре да направите, е да
разгледате самия  debhelper като debian source package, и по
специално неговата директория debian/ и естествено
Perl-скриптовете, които предоставя. Изпълняваме:
# apt-get source debhelper
 
Унифициран начин пакетите да задават въпроси на потребители при първоначално 
инсталиране, последващо преконфигуриране и премахване. 
 
Съвременният начин. zless /usr/share/doc/devscripts/README.gz
Предвиден е да облекчи живота на Debian package maintainers. Съдържа следните 
скриптове, като dependencies/recommendations са показани в счупените скоби:
-  bts(1): Команда за комуникиране с Bug Tracking System
  [ www-browser,  mailx]
 
-  dch(1),  debchange(1): Автоматично добавя entries към
  debian/changelog файловете
 
-  debclean(1): Пречиства (purge) a Debian source tree
  [ fakeroot]
 
-  debuild(1): Wrapper за билдване на пакети без да е
  необходимо да се изпълнява su или да се мисли как да се
  стартира  dpkg(8) да билдва, използвайки  fakeroot(1). Също
  така се оправя с общите проблеми на средата, umask и т.н.
  [ fakeroot,  lintian,  gnupg]
 
-  debdiff(1): Сравнява две версии на Debian package, за да
  привери за добавени или премахнати файлове [ wdiff,
   patchutils]
 
-  debpkg(1): Dpkg wrapper за менажиране и тестове на пакети
  без su [ perl-suid]
 
-  debi(1),  debc(1): скриптове за инсталиране на пакети
  и извличане на тяхното съдържание
 
-  debit(1): скрипт за инсталиране на пакети и тестването им
  с debian-test [ debian-test]
 
-  debrelease(1): Wrapper за  dupload или  dput
  [ dupload |  dput,  ssh]
 
-  dscverify(1): Проверка целостта на Debian package от
  файловете .changes или .dsc [ gnupg,
  debian-keyring, libdigest-md5-perl]
 
-  debsign(1),  debrsign(1): подписване на двойката
  файлове .changes/.dsc без да необходима останалата
  част от пакета; двойката файлове може да се подписва отдалечено или
  да се изтеглят файловете и да се подпишат локално [ gnupg,
   debian-keyring,  ssh]
 
-  dpkg-depcheck(1),  dpkg-genbuilddeps(1): Определя
  използваните пакети по време на build на даден Debian package;
  удобен за определяне на Build-Depends в control
  файла [ build-essential,  strace]
 
-  grep-excuses(1):  grep(1) на файла
  update_excuses.html за дадени пакети [ libwww-perl]
 
-  mergechanges(1): merge на .changes файловете от
  пакет, който е билднат за друга хардуерна архитектура
 
-  plotchangelog(1): показва графика на данните от
  changelog файла [ libtimedate-perl,  gnuplot]
 
-  uupdate(1): интегрира upstream промените в debian source
  package [ patch]
 
-  uscan(1): сканира upstream сайтовете за нови издания. Също
  така са включени и няколко примерни mail filters за филтриране на
  пощата от пощенските списъци на Debian чрез  exim,
   procmail и др.  [ libwww-perl]
 
Старият начин. Това е още един от пакетите, предназначени за
разработка и поддръжка на Debian source packages. Но този пакет се
използва все по-рядко.
-  deb-make(1L): генерира debian source package от upstream
  source код. Настройва файловете control. Предоставя примерна
  конфигурация за debstd, която в повечето случаи е използваема с
  минимална нужда от доредактиране
 
-  debstd(1L) разполага със следните възможности:
 
- автоматизира компресирането и инсталирането на документацията
- генерира multiple binaries от един-единствен debian source
    package
- генерира maintainer scripts и ги инсталира на подходящите
    места с подходящите права.
- може да модифицира много от debian config files чрез
    генериране на подходящи maintainer scripts.
- извиква  dpkg-shlibdeps(1) за всички ELF binaries и
    генерира коректен shlibs файл за дадените библиотеки автоматично.
- проверява symlinks за manpages / documentation и пренасочва в
    случай, че е необходимо.  
  
 
 
FIXME: да се започне и довърши step-by-step пример за:
Примерни apt хранилища с binary и source пакети:
Nikola Antonov
2004-10-31