Вече има нова директория в директорията на програмата (`gentoo-0.9.12'), която се казва `debian'. В нея има няколко файла. Ще ги редактираме за да можем да настроим държанието на пакета при инсталирането му. Най-важните от тях са `control', `changelog', `copyright' и 'rules', които са задължителни за всички пакети.
Този файл съдържа няколко стойности които dpkg и dselect ще използват за управление на пакета. Ето control файла който dh_make създава.
1 Source: gentoo
2 Section: unknown
3 Priority: optional
4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
5 Standards-Version: 3.0.1
6
7 Package: gentoo
8 Architecture: any
9 Depends: ${shlibs:Depends}
10 Description: <insert up to 60 chars description>
11 <insert long description, indented with spaces>
(Номерата на редовете са добавени от мен.)
Редове 1-5 са контролната информация на изходния пакет. Ред 1 е името на изходния пакет.
Ред 2 е секцията на дистрибуцията в която пакета ще бъде поставен. Както може би сте забелязали Debian е разделен на секции: main (свободен софтуер), non-free (не точно свободен софтуер) и contrib (свободен софтуер който зависи от не свободен софтуер). Под всяка една от тези секции съществуват подсекции които описват какъв тип са пакетите в него. За пример `admin' съдържа програми за администриране, `base' съдържа основните инструменти, `devel' - инструменти в помощ на програмиста, `doc' - документация, `libs' - библиотеки, `mail' - e-mail еклиенти и демони, `net' - мрежови приложения и демони, `x11' - специфични приложения за X11, и много други.
Нека тогава да го променим на x11.
Ред 3 описва колко важно е потребителя да инсталира този пакет. Section и priority всъщност се използват само от dselect когато сортира пакетите и те могат (и най-вероятно ще бъдат) променени от нашите FTP maintainers. Виж в Policy manual за повече информация какво да напишете в тези полета.
Тъй като това е пакет с нормален приоритет ще го оставим като optional.
Ред 4 е името и e-mail адреса на отговорника по поддръжка.
Ред 5 е версията на Debian Policy стандарта с която този пакет е съобразен (две основни версии на инсталиран debian-policy пакет).
Ако се изисква някакъв нестандартен компилатор или друг инстумент за да бъде изграден пакета, трябва да го добавите тук на `Build-Depends' реда и списък със задължителните пакети. За повече информация прочетете Packaging Manual (секция 8.7) и документацията на `build-essential' пакета.
Ред 7 е името на бинарния пакет.
Ред 8 описва аритектурата на процесора за която пакета е бил компилиран. Можем
да го оставим "any" защото dpkg-gencontrol(1) ще попълни
съответната стойност за всяка машина за която този пакет е компилиран (виж
Developer's Reference за информация относо пренасянето на пакети от една
платформа на друга). Ако вяшият пакет е независим архитектурно (примерно shell
скрипт, Perl скрипт или документ), променете го на "all", и прочетете
по-късно файлът `rules', Section 4.4 относно
използването на `binary-indep' правило вместо `binary-arch' за изграждането на
пакета.
Ред 9 разкрива едно от най-мощните свойства на системата за пакетиране на Debian. Пакетите могат да зависят един с друг по няколко различни начина. Освен Depends:, други зависимости са Recommends:, Suggests:, Pre-Depends:, Conflicts:, Provides:, и Replaces: .
Инструментите за управление на пакети като dpkg, dselect или APT (и тяхните
помощни обвивки) обикновенно се държат по един и същ начин когато работят с
тези зависимости, ако ли не, то ще бъде обяснено. (виж dpkg(8),
dselect(8), apt(8), console-apt(8),
gnome-apt(8))
Ето какво обикновенно означават:
Този пакет нямя да бъде инсталиран докато пакетите от които зависи не бъдат инсталирани. Ползвайте го ако вашата програма няма изобщо да тръгне (или ще нанесе щети) докато не присъства даден пакет.
Dselect няма да инсталира вашият пакет докато пакетите които препоръчва не са инсталирани. Dpkg и APT обаче ще ви позволят да го инсталирате. Ползвайте го за пакети които не са абсолютно задължителни но обикновенно се използват с вашата програма.
Когато потребителя инсталира вашата програма, dselect ще предложи да бъдат инсталирани и други пакети. Dpkg и APT не се съобразяват с това. Използвайте го за пакети които ще работят добре с вашата програма но като цяло не са необходими.
Това е по силно и от Depends:. Пакета няма да бъде инсталиран докато пакетите от които той зависи не бъда инсталирани и правилно конфигурирани. Ползвайте го много внимателно и то след като сте го обсъдили в debian-devel mailing list. С две думи, не го ползвайте :-)
Този пакет няма да бъде инсталиран докато всички пакети с които той е в конфликт не бъдат премахнати. Използвайте го ако вашата програма 100% няма да тръгне (или ще нанесе щети) ако е инсталирана определена програма.
За някои видове пакети са дефинирани множество алтернативни виртуални имена. Можете да намерите пълния списък в файла /usr/share/doc/debian-policy/virtual-package-names-list.text.gz. Използваите го ако вашата програма осигурява функция на съществуващ виртуален пакет.
Използвайте го когато вашата програма замества файлове от друг пакет или напълно замества даден пакет (използва се заедно с Conflicts:). Файловете от именувания пакет ще бъдат премахнати преди да бъде инсталиран вашият пакет.
Всички тези полета имат еднакъв синтаксис. Те са списък от пакети разделени със запетая. Тези имена на пакети също може да бъдат алтернативни пакети разделени с вертикална черта | (pipe symbols). Полетата могат да ограничат тяхната приложимост за определени версии за всеки именуван пакет. Версиите са изброени в скоби след всеки индивидуален пакет и трябва да включват зависимости последвани от номер на версия. Зависимостите могат да бъдат: <<, <=, =, >= и >> за съответно по-стара версия, по-стара или равна, точно тази, по-нова или равна и по-нова версия.
И накрая последното нещо с което трябва да се запознаете е $(shlibs:Depends).
Това е генерирано автоматично от dh_shlibdeps(1) и попълнено от
dh_gencontrol(1) с имената на всички споделени библиотеки които
вашата програма използва, такива като libc6 или xlib6g, такак че не се налага
да ги указвате ръчно. И казано с две думи - ред 9 го оставяме както си е :-)
Ред 10 съдържа списък с предложени пакети за инсталация. В този случай това е само `file' защото gentoo може да ползва някои свойства предоставени от този програма/пакет.
Ред 11 е кратко описание. Повечето потребители иползват 80 колонен екран така че не трябва да е по дълго от 60 символа. Аз ще го променя на "A fully GUI configurable GTK+ file manager".
Ред 12 е за пълното описание. Тук трябва да има детайлно описание на пакета. 1-вата колона на всеки ред трябва да е празна, тоест да оставяте по един интервал. Не трябва да има празни редове, но може да ползвате . (точка) за да симулирате празен ред. Също така не трябва да има повече от един празен ред след края на пълното описание.
Ето и редактирания control файл:
1 Source: gentoo
2 Section: x11
3 Priority: optional
4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
5 Standards-Version: 3.0.1
6
7 Package: gentoo
8 Architecture: any
9 Depends: ${shlibs:Depends}
10 Suggests: file
11 Description: A fully GUI configurable GTK+ file manager
12 gentoo is a file manager for Linux written from scratch in pure C. It
13 uses the GTK+ toolkit for all of its interface needs. gentoo provides
14 100% GUI configurability; no need to edit config files by hand and re-
15 start the program. gentoo supports identifying the type of various
16 files (using extension, regular expressions, or the 'file' command),
17 and can display files of different types with different colors and icons.
18 .
19 gentoo borrows some of its look and feel from the classic Amiga file
20 manager "Directory OPUS" (written by Jonathan Potter).
(номерата на редовете са добавени от мен.)
Този файл съдържа информация относно от къде е изтеглен пакета , copyright и информация за лиценза. Неговия формат не е продиктуван от Policy, но съдържанието му е (секция 6.5). Dh_make го създава по подразбиране и ето как изглежда:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from <fill in ftp site>
5
6 Upstream Author(s): <put author(s) name and email here>
7
8 Copyright:
9
10 <Must follow here>
(номерата на редовете са добавени от мен.)
Важните неща които трябва да присъстват в този файл са мястото от където е взета тази програма, точния лиценз и copyright. Трябва да включите пълния лиценз освен ако той не е някой от основните свободни лицензи като GNU GPL или LGPL, BSD или the Artistic license, за тях просто може да посочите съответния файл в директорията /usr/share/common-licenses/ която съществува във всяка Debian система. Gentoo е лицензиран под GNU General Public License така че ще променим файла така:
1 This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on
2 Wed, 11 Nov 1998 21:02:14 +0100.
3
4 It was downloaded from: ftp://ftp.obsession.se/gentoo/
5
6 Upstream author: Emil Brink <emil@obsession.se>
7
8 This software is copyright (c) 1998-99 by Emil Brink, Obsession
9 Development.
10
11 You are free to distribute this software under the terms of
12 the GNU General Public License.
13 On Debian systems, the complete text of the GNU General Public
14 License can be found in /usr/share/common-licenses/GPL file.
(номерата на редовете са добавени от мен.)
Този файл задължително трябва да съществува, той има специален формат описан в Packaging Manual (секция 3.2.3). Форматът се използва от dpkg и от други програми за да получат номер на версията, преработка, дистрибуция и приоритет (спешност) на вашия пакет.
За вас също ще е полезен тъй като е добре да имате документирани всичките промени които сте направили. Също така ще помогне на тези които са изтеглили вашия пакет да разберат дали има неразрешени проблеми с този пакет за които трябва да се разбере веднага. Той ще бъде съхранен като `/usr/share/doc/gentoo/changelog.Debian.gz' в бинарния пакет.
Dh_make създава по подразбиране ето такъв файл:
1 gentoo (0.9.12-1) unstable; urgency=low
2
3 * Initial Release.
4
5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
6
7 Local variables:
8 mode: debian-changelog
9 End:
(номерата на редовете са добавени от мен.)
Ред 1 е името на пакета, версията, дистрибуцията и приоритета. Името трябва да съвпада с името на пакета с изходния код., дистрибуцията трябва да е или `unstable' или `experimental' (засега) и приоритета трябва да е променен на нещо по голямо от `low'. :-)
Редове 3-5 са log записи където са отразени промените направени в тази версия
на пакета (не промените по изходния код които са правени от авторите - има
специален файл за тази цел, който е създаден от авторите на програмата,
инсталира се в /usr/share/doc/gentoo/changelog.gz). Новите редове трябва да
бъдат вмъквани в началото на файла точно над първия ред започващ със звездичка
(`*'). Можете да направите това с помоща на dch(1),
emacs(1) (редове 7-9 съдържат информация относно редактора Emacs),
или който и да е друг редактор. Трябва да се получи нещо такова:
1 gentoo (0.9.12-1) unstable; urgency=low
2
3 * Initial Release.
4 * This is my first Debian package.
5 * Adjusted the Makefile to fix $DESTDIR problems.
6
7 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
8
9 Local variables:
10 mode: debian-changelog
11 End:
(номерата на редовете са добавени от мен.)
Когато публикувате нова версия, трябва да увеличите номера на версията. Най-лесно ще го направите с `dch -i` или `dch -v <version>-<revision>` и после добавете коментари чрез любимия ви редактор. Полезен съвет: как най-лесно мога да получа датата в изисквания формат? Ползвайте `822-date`, или `date -R`.
Информацията за новата версия е добавена в началото на changelog файла. Ето как изглежда той след промените:
1 gentoo (0.9.12-2) unstable; urgency=low
2
3 * Fixed a glitch in the menu file.
4
5 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 22:15:39 +0100
6
7 gentoo (0.9.12-1) unstable; urgency=low
8
9 * Initial Release.
10 * This is my first Debian package.
11 * Adjusted the Makefile to fix $DESTDIR problems.
12
13 -- Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
14
15 Local variables:
16 mode: debian-changelog
17 End:
(номерата на редовете са добавени от мен.)
Може да прочетете повече относно нови версии/прегледи на пакетите в Обновяване на пакета, Section 6.4.
Сега трябва да погледнем и правилата които dpkg-buildpackage(1) ще
използва за да създаде пакета. Този файл всъщност е един вид Makefile, тъй
като се се изпълнява чрез `make -f`, но е различен от този който идва с
изходния код.
Всеки файл `rules', както и всеки Makefile се състои от няколко правила които указват как да бъде манипулиран изходния код. Всяко правило се състои от цел, имена на файлове или имена на действия които трябва да бъдат изпълнени. Правилата които искате да бъдат изпълнени се извикват като аргументи на командния ред (примерно: `./debian/rules build` или `make -f rules install`). След името може да укажете зависимост, програма или файл от който зависят правилата. След това може да укажете брой команди (разделени с <tab>!) докато се достигне празен ред. След него започва ново правило. Множество празни редове и редове започващи с `#' (диез) се третират като коментари и съответно се игнорират.
Хмм, най-вероятно вече достатъчно се объркахте но ще ви стане ясно след като изследваме файла `rules' който dh_make създава по подразбиране. Препоръчвам ви да прочетете информацията относно `make' (info make) за повече подробности.
Важно е да знаете че файла `rules' който е създаден dh_make е просто за да ви подскаже как би трябвало да изглежда този файл. На по простите пакети най-вероятно ще работи но за по-сложните пакети не се страхувайте а го редактирате така че да пасне на нуждите на програмата. Не променяйте единствено имената на правилата защото всички инструменти използват тези имена както е указано в Packaging Manual.
1 #!/usr/bin/make -f
2 # Made with the aid of dh_make, by Craig Small
3 # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
4 # Some lines taken from debmake, by Christoph Lameter.
5
6 # Uncomment this to turn on verbose mode.
7 #export DH_VERBOSE=1
8
9 # This is the debhelper compatability version to use.
10 export DH_COMPAT=1
11
12 build: build-stamp
13 build-stamp:
14 dh_testdir
15
16 # Add here commands to compile the package.
17 $(MAKE)
18
19 touch build-stamp
20
21 clean:
22 dh_testdir
23 dh_testroot
24 rm -f build-stamp
25
26 # Add here commands to clean up after the build process.
27 -$(MAKE) clean
28
29 dh_clean
30
31 install: build-stamp
32 dh_testdir
33 dh_testroot
34 dh_clean -k
35 dh_installdirs
36
37 # Add here commands to install the package into debian/tmp.
38 $(MAKE) install DESTDIR=`pwd`/debian/tmp
39
40 # Build architecture-independent files here.
41 binary-indep: build install
42 # We have nothing to do by default.
43
44 # Build architecture-dependent files here.
45 binary-arch: build install
46 # dh_testversion
47 dh_testdir
48 dh_testroot
49 # dh_installdebconf
50 dh_installdocs
51 dh_installexamples
52 dh_installmenu
53 # dh_installemacsen
54 # dh_installpam
55 # dh_installinit
56 dh_installcron
57 dh_installmanpages
58 dh_installinfo
59 # dh_undocumented
60 dh_installchangelogs
61 dh_link
62 dh_strip
63 dh_compress
64 dh_fixperms
65 # You may want to make some executables suid here.
66 dh_suidregister
67 # dh_makeshlibs
68 dh_installdeb
69 # dh_perl
70 dh_shlibdeps
71 dh_gencontrol
72 dh_md5sums
73 dh_builddeb
74
75 binary: binary-indep binary-arch
76 .PHONY: build clean binary-indep binary-arch binary install
(номерата на редовете са добавени от мен.)
Най-вероятно сте срещали редове като 1-ви от shell и Perl скриптовете. Той указва на операционната система че този файл трябва да бъде обработен от /usr/bin/make.
Редовете от 12 до 19 описват правилото `build' (и неговото под-правило `build-stamp') който стартира Makefile-а за да се компилира програмата.
Правилото `clean' както е описано на редове 21-29 изчиства всички ненужни бинарни файлове и автоматично създадени неща който са останали от процеса на изграждане. Правилата трябва да работят винаги (дори когато и изходния код е почистен!) така че използвайте force опциите (примерно за rm тя е `-f') , или игнорирайте върнатите стойности (`-' пред името на командата).
Инсталационния процес започва при правилото `install' на 31 ред. То всъщтност стартира правилото `install' от Makefile-а но инсталацията се прави в директория `pwd`/debian/tmp - ето защо указахме $(DESTDIR) като основна директория за инсталиране в Makefile-а на gentoo.
Както ни подсказва и коментара, правилото `binary-indep на ред 41 се използва когато изграждаме архитектурно независими пакети. Тъй като няма да правим това не се налага да пипаме нищо. Ако пакета е от типа `Architecture: all', трябва да преместим всичките команди под това правило а правилото `binary-arch' да оставим празно.
В следващото правило - `binary-arch', на редове от 45 до 73 стартираме няколко малки програмки от пакета debhelper които помагат пакета да бъде съобразен с Policy.
Имената им започват с dh_ и останалото е описание за какво служи програмката. Имената им говорят сами по себе си но ето малко допълнителна информация:
dh_testdir(1) проверява дали сте в правилната директория (тоест в
основната директория на изходния код на програмата),
dh_testroot(1) проверява дали имате root права които са нужни за
binary* целите и clean,
dh_installmanpages(1) копира всички man страници които намери в
дървото с изходния код (внимавайте това е DWIM),
dh_strip(1) премахва дебъг символите от изпълнимите файлове и
библиотеките за да станат по-малки,
dh_compress(1) компресира man страниците и документацията
по-големи от 4 kB,
dh_installdeb(1) копира файловете които се отнасят към пакета
(скриптовете) в директория debian/tmp/DEBIAN,
dh_shlibdeps(1) изчислява зависимостите между споделените
библиотеки и изпълнимите файлове и библиотеки,
dh_gencontrol(1) добавя необходимите неща и инсталира файла
control,
dh_md5sums(1) генерира MD5 checksums за всички файлове в пакета.
За повече изчерпателна информация какво точно вършат всичките тези dh_* скриптове и какви са техните опции, прочетете страниците с ръководство. Съществуват и други доста полезни dh_* скриптове които не са споменати тук. Ако се нуждаете от тях прочетете документацията на debhelper.
В секцията binary-arch трябва да коментирате всички редове които не са ви нужни. За gentoo ще коментирам редовете относно testversion, emacsen, pam, init, cron, manpages, info, undocumented, suidregister, makeshlibs, и perl, просто защото gentoo не се нуждае от тях. А на ред 60 трябва да добавя `FIXES' защото така е именуван оригиналния changelog файл.
Последните два реда (заедно с всички други редове които не са обяснени) са просто повече или по-малко нужни неща за които може да прочетете в ръководството на make и в Packaging Manual. Но засега те не са важни.
jrodin@jagor.srce.hrgeroy@stemo.bg