Tags: deb сборка пакетирование пакет
Published : 2 months, 4 weeks ago (Tue, 26 Aug 2008 03:08:10 PDT) Searched: http://saksmlz.livejournal.com/773.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/ Но информация в них разбросана, попытаюсь её объединить. Начинается всё с того что перед вами данные, которые должны перекачевать на свои места после запуска и установки .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)) 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)) 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`) dpkg-dev - this package contains the tools needed to unpack, build and upload Debian source packages. (see dpkg-source(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)) 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`) И ещё кое-что рекомендую установить, позже объясню зачем. 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/ Надеюсь, что облегчил кому-то жизнь. :) |