В контексте изучения одного из скриптовых языков (Ruby), ко времени появления более или менее законченного проекта меня заинтересовал вопрос о том, как же опакетить данное творение.
В сети достаточно полно описан данный процесс, но «фишка» в том, что всё это «дело» касается того, как опакетить нечто компилируемое. Т.к. я уже говорил, что язык у меня был скриптовый – значит всё что говориться о том, как исправить makefile и тому подобное, стало для меня пустой информацией. Но всё же пришлось докапаться до истины.
Сразу расскажу о цветах и о том, как я пытался логически выделять текст
Сразу оговорюсь, что вссё описанное здесь можно почерпнуть на других ресурсах:
http://tigro.info/blog/index.php?id=375
http://www.debian.org/doc/manuals/maint-g
Но информация в них разбросана, попытаюсь её объединить.
Сразу оговорюсь об обозначениях:
$ ls -l
total 0
$ mkdir testname-0.001
1 Source: testname
2 Section: unknown
3 Priority: extra
4 Maintainer: saks <saks@unknown> - а так я выделял текст, который можно увидеть в текстовом редакторе, что бы не перепутать с выводом в консоль.
Приступим.
Начинается всё с того что перед вами данные, которые должны перекачевать на свои места после запуска и установки .deb пакета(архива). Говоря “на свои места” я имею ввиду определённое место в иерархической системе каталогов, и место это будет всегда отсчитываться от корня (он же root или “ / ”).
Первое это то, что считается хорошим тоном отсчитывать версии того, что вы хотите опакетить. Потому для начала необходимо создать папку с названием
имяпакета-версияпакета
$ ls -l
total 0
$ mkdir testname-0.001
$ ls -l
total 4
drwxr-xr-x 2 saks saks 4096 2008-08-21 19:14 testname-0.001
Далее заходим в эту папку
$ cd testname-0.001/
$ ls -l
total 0
Для дальнейшего удобства рекомендую создать ещё одну папку, например src в уже созданной:
$ mkdir src
Теперь помещаем в эту папку то что нам нужно опакетить (пусть это файл /tmp/books_index.html – именно такой файл я получаю на выходе моей програмки, которую я первой и спаковал в deb-ку :) )
testname-0.001$ cp /tmp/books_index.html src/
saks@saks-desktop:/tmp/xxx/testname-0.00
total 8
-rw-r--r-- 1 saks saks 7712 2008-08-21 19:20 books_index.html
Теперь всё что нам нужно это вспомнить про необходимый софт. Дело в том, что в стандартную поставку дистрибутивов обычно не входит набор программ для создания deb-пакетов. Посему прийдётся самостоятельно ими обзавестись. Весь необходимый список есть здесь : http://www.debian.org/doc/manuals/maint-g
но на всякий случай приведу его для леивых:
dpkg-dev - this package contains the tools needed to unpack, build and upload Debian source packages. (see dpkg-source(1))
file- this handy program can determine what type a file is. (seefile(1))
gcc- the GNU C compiler, necessary if your program like most others is written in the C programming language. (seegcc(1)) This package will also "pull in" several other packages such asbinutilswhich includes programs used to assemble and link object files (see `info binutils` in thebinutils-docpackage) andcpp, the C preprocessor. (seecpp(1))
g++- the GNU C++ compiler, necessary if your program is written in C++. (seeg++(1))
libc6-dev- the C libraries and header files gcc needs to link with to create object files. (see `info libc` in theglibc-docpackage)
make- usually creation of a program takes several steps, so rather than having to type out the same commands over and over again, you can use this program to automate the process, creating `Makefile's. (see `info make`)
patch- this very useful utility will take a file containing a difference listing (produced by the diff program) and apply it to the original file, producing a patched version. (seepatch(1))
perl- Perl is one of the most used interpreted scripting languages on today's Unix-like systems, often referred to as "Unix's Swiss Army Chainsaw". (seeperl(1))
dpkg-dev - this package contains the tools needed to unpack, build and upload Debian source packages. (see dpkg-source(1))
file- this handy program can determine what type a file is. (seefile(1))
gcc- the GNU C compiler, necessary if your program like most others is written in the C programming language. (seegcc(1)) This package will also "pull in" several other packages such asbinutilswhich includes programs used to assemble and link object files (see `info binutils` in thebinutils-docpackage) andcpp, the C preprocessor. (seecpp(1))
g++- the GNU C++ compiler, necessary if your program is written in C++. (seeg++(1))
libc6-dev- the C libraries and header files gcc needs to link with to create object files. (see `info libc` in theglibc-docpackage)
make- usually creation of a program takes several steps, so rather than having to type out the same commands over and over again, you can use this program to automate the process, creating `Makefile's. (see `info make`)
patch- this very useful utility will take a file containing a difference listing (produced by the diff program) and apply it to the original file, producing a patched version. (seepatch(1))
perl- Perl is one of the most used interpreted scripting languages on today's Unix-like systems, often referred to as "Unix's Swiss Army Chainsaw". (seeperl(1))
И ещё кое-что рекомендую установить, позже объясню зачем.
Package: build-essential
Priority: optional
Section: devel
Installed-Size: 48
Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Architecture: i386
Version: 11.3ubuntu1
Depends: libc6-dev | libc-dev, gcc (>= 4:4.1.1), g++ (>= 4:4.1.1), make, dpkg-dev (>= 1.13.5)
Filename: pool/main/b/build-essential/build-essent
Size: 7066
MD5sum: dbf21241506cb04fc6f67a93aaaf991b
SHA1: aef5b9f76a05ea23c0370eab53ef0d20b4dac1f5
SHA256: 7d3b5efbd44c8e8186e33e3b0e9585fc8a86f4b1
Description: informational list of build-essential packages
If you do not plan to build Debian packages, you don't need this
package. Moreover this package is not required for building Debian
packages.
.
This package contains an informational list of packages which are
considered essential for building Debian packages. This package also
depends on the packages on that list, to make it easy to have the
build-essential packages installed.
.
If you have this package installed, you only need to install whatever
a package specifies as its build-time dependencies to build the
package. Conversely, if you are determining what your package needs
to build-depend on, you can always leave out the packages this
package depends on.
.
This package is NOT the definition of what packages are
build-essential; the real definition is in the Debian Policy Manual.
This package contains merely an informational list, which is all
most people need. However, if this package and the manual disagree,
the manual is correct.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu
Это исчерпывающая информация об этом пакете, позже поймёте зачем он нам нужен.
Когда всё установлено, можно начать сборку. Для начала создадим необходимые служебные файлы.
saks@saks-desktop:/tmp/xxx/testname-0.00
Type of package: single binary, multiple binary, library, kernel module or cdbs?
[s/m/l/k/b] s
Maintainer name : saks
Email-Address : saks@unknown
Date : Fri, 22 Aug 2008 12:16:30 +0300
Package Name : testname
Version : 0.001
License : blank
Type of Package : Single
Hit <enter> to confirm:
Currently there is no top level Makefile. This may require additional tuning.
Done. Please edit the files in the debian/ subdirectory now. You should also
check that the testname Makefiles install into $DESTDIR and not in / .
Если не понятно что произошло, то прокоментирую : находясь в нужной папке я запустил
dh_make с опцией -r (-r, --createorig make a copy for the original source archive), после этого последовал вопрос о том что я хочу создать за пакет, ответ был “ s “ т.к. Я создаю один пакет, после этого я подтвердил информацию.
Уже половина сделана. Теперь слегка подредактируем служебные файлы. Настоятельно рекомендую прочесть «родную» Debian-овскую документацию, тем олее что есть она и на русском языке, и узнать там о назначении основных этих самых служебных файлов. (http://www.debian.org/doc/manuals/maint-g
Сначала редактируем файл ./debian/control :
его содержимое вначале представляет нечто вроде
1 Source: testname
2 Section: unknown
3 Priority: extra
4 Maintainer: saks <saks@unknown>
5 Build-Depends: debhelper (>= 5)
6 Standards-Version: 3.7.2
7
8 Package: testname
9 Architecture: any
10 Depends: ${shlibs:Depends}, ${misc:Depends}
11 Description: <insert up to 60 chars description>
12 <insert long description, indented with spaces>
Если Вам непонятно, что здесь к чему, то ОБЯЗАТЕЛЬНО прочтите «родную» документацию. Изменим это примерно так :
1 Source: testname
2 Section: unknown
3 Priority: extra
4 Maintainer: saks <saks@unknown>
5 Build-Depends: debhelper (>= 5)
6 Standards-Version: 3.7.2
7
8 Package: testname
9 Architecture: any
10 Depends: firefox
11 Description: some short info
12 long info
Я использую vim с нумерацией строк, так что должно быть более или менее понятно, что и где написано. Я добавил в качестве пакета от которого зависит наш тестовый пакет браузер firefox, это просто пример, раз мы запаковываем html файл, то нужно же его в чём то просмотреть :). Сохраняем и выходим.
Открываем и редактируем файл ./debian/rules
Умолчательное содержимое примерно такое:
1 #!/usr/bin/make -f
2 # -*- makefile -*-
3 # Sample debian/rules that uses debhelper.
4 # This file was originally written by Joey Hess and Craig Small.
5 # As a special exception, when this file is copied by dh-make into a
6 # dh-make output file, you may use that output file without restriction.
7 # This special exception was added by Craig Small in version 0.37 of dh-make.
8
9 # Uncomment this to turn on verbose mode.
10 #export DH_VERBOSE=1
11
12
13
14
15 configure: configure-stamp
16 configure-stamp:
17 dh_testdir
18 # Add here commands to configure the package.
19
20 touch configure-stamp
21
22
23 build: build-stamp
24
25 build-stamp: configure-stamp
26 dh_testdir
27
28 # Add here commands to compile the package.
29 $(MAKE)
30 #docbook-to-man debian/testname.sgml > testname.1
31
32 touch $@
33
34 clean:
35 dh_testdir
36 dh_testroot
37 rm -f build-stamp configure-stamp
38
39 # Add here commands to clean up after the build process.
40 -$(MAKE) clean
41
42 dh_clean
43
44 install: build
45 dh_testdir
46 dh_testroot
47 dh_clean -k
48 dh_installdirs
49
50 # Add here commands to install the package into debian/testname.
51 $(MAKE) DESTDIR=$(CURDIR)/debian/testname install
52
53
54 # Build architecture-independent files here.
55 binary-indep: build install
56 # We have nothing to do by default.
57
58 # Build architecture-dependent files here.
59 binary-arch: build install
60 dh_testdir
61 dh_testroot
62 dh_installchangelogs
63 dh_installdocs
64 dh_installexamples
65 # dh_install
66 # dh_installmenu
67 # dh_installdebconf
68 # dh_installlogrotate
69 # dh_installemacsen
70 # dh_installpam
71 # dh_installmime
72 # dh_python
73 # dh_installinit
74 # dh_installcron
75 # dh_installinfo
76 dh_installman
77 dh_link
78 dh_strip
79 dh_compress
80 dh_fixperms
81 # dh_perl
82 # dh_makeshlibs
83 dh_installdeb
84 dh_shlibdeps
85 dh_gencontrol
86 dh_md5sums
87 dh_builddeb
88
89 binary: binary-indep binary-arch
90 .PHONY: build clean binary-indep binary-arch binary install configure
Не вдаваясь в подробности сначала рекомендую его изменить к такому виду:
1 #!/usr/bin/make -f
2 build: build-stamp
3 build-stamp:
4 build: build-stamp
5 build-stamp:
6 dh_testdir
7 touch build-stamp
8 clean:
9 dh_testdir
10 dh_testroot
11 rm -f build-stamp configure-stamp
12 dh_clean
13 install: install-stamp
14 install-stamp: build-stamp
15 dh_testdir
16 dh_testroot
17 dh_clean -k
18 dh_installdirs
19 #my installation
20 cp -r src/books_index.html $(shell pwd)/debian/testname/usr/share/test
21 binary-indep: build install
22 binary-arch: build install
23 dh_testdir
24 dh_testroot
25 dh_installchangelogs
26 dh_installdocs
27 dh_installmenu
28 dh_installman
29 dh_link
30 dh_strip
31 dh_compress
32 dh_fixperms
33 dh_suidregister
34 dh_installdeb
35 dh_gencontrol
36 dh_md5sums
37 dh_builddeb
38 source diff:
39 @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
40 binary: binary-indep binary-arch
41 .PHONY: build clean binary-indep binary-arch binary
Если внимательно посмотреть, то станет понятно, что я просто убрал ненужное (по моему мнению). Внимательно следите за тем, что бы записи типа dh_gencontrol отставали от начала строки на TAB, иначе при сборке получите ошибку :
$ sudo dpkg-buildpackage -d -b
dpkg-buildpackage: set CPPFLAGS to default value:
dpkg-buildpackage: set CFLAGS to default value: -g -O2
dpkg-buildpackage: set CXXFLAGS to default value: -g -O2
dpkg-buildpackage: set FFLAGS to default value: -g -O2
dpkg-buildpackage: set LDFLAGS to default value: -Wl,-Bsymbolic-functions
dpkg-buildpackage: source package testname
dpkg-buildpackage: source version 0.001-1
dpkg-buildpackage: source changed by saks <saks@unknown>
dpkg-buildpackage: host architecture i386
debian/rules clean
debian/rules:28: *** missing separator. Stop.
Здесь 28 – номер строки, в котором нет правильного отступа.
После закоментированной записи #my installation будем писать то, что должен обычно делать makefile. Для данного случая подойдёт вот что:
19 #my installation
20 cp -r src/books_index.html $(shell pwd)/debian/testname/usr/share/test
На самом деле,я здесь просто исполняю некий необходимый мне код на языке bash - т.е. копирую откуда нада,
что наад, куда нада :) . Т.е. если принять во внимание, что здесь мы описываем установку пакета в директорию
$(shell pwd)/debian/testname , которая при распаковке станет корнем ("/") - то всё довольно таки логично.
Если непонятно, читать здесь http://www.ru.debian.org/doc/manuals/mai
Подредактирум файл ./debian/dirs . По умолчанию он такой:
1 usr/bin
2 usr/sbin
но в эти директории мы ничего «класть» при установке не собираемся, значит удалим это и напишем вот что:
1 /usr/share/test
~ это именно та папка, которая возможно не сужествует, но в которую нам нужно «сложить» наш контент. Она создастся сама.
Теперь проверим наше местонахождение:
$ pwd
/tmp/xxx/testname-0.001
И выполняем саму сборку:
$ sudo dpkg-buildpackage -d -b
dpkg-buildpackage: set CPPFLAGS to default value:
dpkg-buildpackage: set CFLAGS to default value: -g -O2
dpkg-buildpackage: set CXXFLAGS to default value: -g -O2
dpkg-buildpackage: set FFLAGS to default value: -g -O2
dpkg-buildpackage: set LDFLAGS to default value: -Wl,-Bsymbolic-functions
dpkg-buildpackage: source package testname
dpkg-buildpackage: source version 0.001-1
dpkg-buildpackage: source changed by saks <saks@unknown>
dpkg-buildpackage: host architecture i386
debian/rules clean
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp
# Add here commands to clean up after the build process.
#-/usr/bin/make clean
dh_clean
debian/rules build
dh_testdir
# Add here commands to compile the package.
#/usr/bin/make
#docbook-to-man debian/bi.sgml > bi.1
touch build-stamp
debian/rules binary
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
cp -r src/books_index.html /tmp/xxx/testname-0.001/debian/testname/u
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
dh_suidregister
dh_suidregister: This program is obsolete, does nothing, and may be safely removed from your rules file.
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: building package `testname' in `../testname_0.001-1_i386.deb'.
dpkg-genchanges -b >../testname_0.001-1_i386.changes
dpkg-genchanges: binary-only upload - not including any source code
signfile testname_0.001-1_i386.changes
gpg: WARNING: unsafe ownership on configuration file `/home/saks/.gnupg/gpg.conf'
gpg: skipped "saks <saks@unknown>": secret key not available
gpg: [stdin]: clearsign failed: secret key not available
dpkg-buildpackage: binary only upload (no source included)
dpkg-buildpackage: warning: Failed to sign .changes file
Проверим, собралась-ли deb-ка ?
$ ls -l ..
total 16
drwxr-xr-x 4 saks saks 4096 2008-08-22 13:01 testname-0.001
-rw-r--r-- 1 root root 481 2008-08-22 13:01 testname_0.001-1_i386.changes
-rw-r--r-- 1 root root 2780 2008-08-22 13:01 testname_0.001-1_i386.deb
drwxr-xr-x 3 saks saks 4096 2008-08-21 19:20 testname-0.001.orig
Так и есть, попробуем её установить. Для этого узнаем нет ли чего в указанной для установки директории:
$ ls -l /usr/share/test
ls: cannot access /usr/share/test: No such file or directory
Отлично, этой директории вовсе не существует. Теперь установим пакет:
/tmp/xxx/testname-0.001$ sudo dpkg -i ../testname_0.001-1_i386.deb
Selecting previously deselected package testname.
(Reading database ... 214557 files and directories currently installed.)
Unpacking testname (from ../testname_0.001-1_i386.deb) ...
Setting up testname (0.001-1) ...
И проверим установился ли:
$ /tmp/xxx/testname-0.001$ ls -l /usr/share/test
total 8
-rw-r--r-- 1 root root 7712 2008-08-22 13:01 books_index.html
Вроде всё есть.
А теперь немного о “граблях”, которые я встретил:
Я намеренно использовал опцию -d при сборке (sudo dpkg-buildpackage -d -b), т.к. Если Вы не установили рекомендовынный мной пакет build-essential – то тудностей у не возникло бы. А если он установлен, то можно и без него. Но об этом пакете ничего не было сказано в руководстве debian.
Вторые грабли заключались в том, что бы установить иконку в меню gnome. Это простая операция заключается просто в подготовке надлежащего файла и установке его в нужную директорию. т.е.: Нужно просто добавить файл меню в пакет(напрмер) и положить его в директорию $ ls -l /usr/share/applications/ - там уже лежит куча таких файлов. Сделать это можно так:
19 #my installation
20 cp -r src/books_index.html $(shell pwd)/debian/testname/usr/share/test
21 cp -f src/testname.desktop $(shell pwd)/debian/testname/usr/share/applicati
его сожержание можно подсмотреть в любом файле в этой директории. Там нет ничего сложного.
Если после прочтения вссей статьи у Вас возникли недопоимания или вопросы, то внимательно прочтите её ещё раз, а если вопросы остались, то читайте man-документацию или сообтветствующие страницы по ссылкам:
http://tigro.info/blog/index.php?id=375
http://www.debian.org/doc/manuals/maint-g
Надеюсь, что облегчил кому-то жизнь. :)

