logo

Как собрать deb-пакет из "чегоугодно"




saksmlz

Как собрать deb-пакет из "чегоугодно"


Tags: deb сборка пакетирование пакет

Published : 2 months, 4 weeks ago (Tue, 26 Aug 2008 03:05:28 PDT)
Searched:
http://saksmlz.livejournal.com/593.html  0 links
Related posts

В контексте изучения одного из скриптовых языков (Ruby), ко времени появления более или менее законченного проекта меня заинтересовал вопрос о том, как же опакетить данное творение.

В сети достаточно полно описан данный процесс, но «фишка» в том, что всё это «дело» касается того, как опакетить нечто компилируемое. Т.к. я уже говорил, что язык у меня был скриптовый – значит всё что говориться о том, как исправить makefile и тому подобное, стало для меня пустой информацией. Но всё же пришлось докапаться до истины.

Сразу расскажу о цветах и о том, как я пытался логически выделять текст:



Сразу оговорюсь, что вссё описанное здесь можно почерпнуть на других ресурсах:

http://tigro.info/blog/index.php?id=375

http://www.debian.org/doc/manuals/maint-guide/index.en.html#contents

http://library.gnome.org/


Но информация в них разбросана, попытаюсь её объединить.

$ 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.001$ ls -l ./src/

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-guide/ch-start.en.html


но на всякий случай приведу его для леивых:

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. (see file(1))

  • gcc - the GNU C compiler, necessary if your program like most others is written in the C programming language. (see gcc(1)) This package will also "pull in" several other packages such as binutils which includes programs used to assemble and link object files (see `info binutils` in the binutils-doc package) and cpp, the C preprocessor. (see cpp(1))

  • g++ - the GNU C++ compiler, necessary if your program is written in C++. (see g++(1))

  • libc6-dev - the C libraries and header files gcc needs to link with to create object files. (see `info libc` in the glibc-doc package)

  • 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. (see patch(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". (see perl(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. (see file(1))

  • gcc - the GNU C compiler, necessary if your program like most others is written in the C programming language. (see gcc(1)) This package will also "pull in" several other packages such as binutils which includes programs used to assemble and link object files (see `info binutils` in the binutils-doc package) and cpp, the C preprocessor. (see cpp(1))

  • g++ - the GNU C++ compiler, necessary if your program is written in C++. (see g++(1))

  • libc6-dev - the C libraries and header files gcc needs to link with to create object files. (see `info libc` in the glibc-doc package)

  • 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. (see patch(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". (see perl(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-essential_11.3ubuntu1_i386.deb

Size: 7066

MD5sum: dbf21241506cb04fc6f67a93aaaf991b

SHA1: aef5b9f76a05ea23c0370eab53ef0d20b4dac1f5

SHA256: 7d3b5efbd44c8e8186e33e3b0e9585fc8a86f4b1cd328f10e3c4a594e50f9da5

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.001$ dh_make -r


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-guide/index.ru.html#contents)


Сначала редактируем файл ./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/maint-guide/ch-modify.ru.html#s-destdir

Подредактирум файл ./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/usr/share/test

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/applications/


его сожержание можно подсмотреть в любом файле в этой директории. Там нет ничего сложного.



Если после прочтения вссей статьи у Вас возникли недопоимания или вопросы, то внимательно прочтите её ещё раз, а если вопросы остались, то читайте man-документацию или сообтветствующие страницы по ссылкам:

http://tigro.info/blog/index.php?id=375

http://www.debian.org/doc/manuals/maint-guide/index.en.html#contents

http://library.gnome.org/


Надеюсь, что облегчил кому-то жизнь. :)

saksmlz

More results for ""


This is cached version of livejournal post retrieved by LjSEEK on 2008-08-26 03:08:19 . Post may have changed since that time. Click here for actual post version. LjSEEK.COM is not affiliated with author of this post and is not responsible for its content.
These search terms have been highlighted:
Disable Highlighting
saksmlz's Search:
Get your own code!
Copyright © 2005,2006 ljseek.com This service is not affiliated with LiveJournal.com
Design by Steorra.com