Как в Debian/Ubuntu собрать пакет из исходников

Вот, подкинули задачку, да и самому стало интересно – под Ubuntu пока еще не ставил ни одного пакета из исходников. Не все идеально и не оптимально, но результат более чем устраивает. Пока устраивает. Ну а что делать, если возникла необходимость собрать пакет не со стандартными, а с оптимизированными под систему параметрами? Или переписать часть кода? Сразу оговорюсь – считается, что нам нужна модификация пакета, который уже есть в репозиториях. Итак..

Для начала установим необходимые для сборки пакеты:

$ sudo apt-get install build-essential fakeroot dpkg-dev

В домашнем каталоге создадим папку для пакета над которым будем работать:

$ mkdir ~/build && cd ~/build

Проверим, что репозитории с исходниками доступны:

$ grep deb-src /etc/apt/sources.list

И, если строки закомментированы, раскомментируем (только те, что необходимы) и обновим данные о репозиториях:

$ sudo nano /etc/apt/sources.list
$ sudo apt-get update

Скачаем исходники:

$ sudo apt-get source our_package

Установим зависимости:

$ sudo apt-get build-dep our_package

Распакуем исходники:

$ dpkg-source -x our_package_version-revision.dsc

Для того чтобы просто скомпилировать пакет, надо перейти в каталог our_package_version-revision и запустить сборку:

$ cd our_package_version-revision
$ dpkg-buildpackage -rfakeroot -b

Если же мы хотим передать дополнительные параметры для сборки (собственно, для чего всю возню и затеяли), например “–enable-gui –enable-ai”, определим переменную DEB_BUILD_OPTIONS:

$ DEB_BUILD_OPTIONS="--enable-gui --enable-ai" fakeroot debian/rules binary

По окончании компиляции можно будет установить полученный пакет:

$ sudo dpkg -i ../our_package_version-revision_arch.deb

Вот, собственно, и все.

Документация Debian: Работа с пакетами исходных текстов

Share/Bookmark

4 Comments

[…] что на машине уже установлены необходимые пакеты для разработки и сборки пакетов (понадобятся еще php5-dev и […]

ivanOctober 24th, 2017 at 22:16

Хотел обратиться с вопросом. У меня появляется ошибка ivan@bolvan:/media/files/tmp/srcdeb/webeater/webeater-0.2.1# dpkg-depcheck -d ./configure
Can’t exec “strace”: No such file or directory at /usr/bin/dpkg-depcheck line 392.
Running strace failed (command line:
strace -e trace=open,execve -f -q -o /tmp/depchzJDPrn ./configure

Вот фрагмент /usr/bin/dpkg-depcheck:

374 sub getusedfiles (@)
375 {
376 my $file;
377 if ($opts{“strace-input”}) {
378 $file=$opts{“strace-input”};
379 }
380 else {
381 my $old_preload = $ENV{‘LD_PRELOAD’} || undef;
382 my $old_locale = $ENV{‘LC_ALL’} || undef;
383 my $trace_preload = defined $old_preload ?
384 “$old_preload $vforklib” : $vforklib;
385 $file = $opts{“strace-output”} || `tempfile -p depcheck`;
386 chomp $file;
387 $file =~ s%^(\s)%./$1%;
388 my @strace_cmd=(‘strace’, ‘-e’, ‘trace=open,execve’, ‘-f’,
389 ‘-q’, ‘-o’, $file, @_);
390 $ENV{‘LD_PRELOAD’} = $trace_preload;
391 $ENV{‘LC_ALL’}=”C” if $opts{“C”};
392 system(@strace_cmd);
393 $? >> 8 == 0 or
394 die “Running strace failed (command line:\n@strace_cmd\n”;
395 if (defined $old_preload) { $ENV{‘LD_PRELOAD’} = $old_preload; }
396 else { delete $ENV{‘LD_PRELOAD’}; }
397 if (defined $old_locale) { $ENV{‘LC_ALL’} = $old_locale; }
398 else { delete $ENV{‘LC_ALL’}; }

В чём может быть проблема? Может есть какой-нибудь альтернативный способ узнать зависимости?

Плюшевый КрысOctober 24th, 2017 at 23:39

Пакет strace вообще установлен?

roNovember 3rd, 2017 at 14:04

Огромное спасибо за тщательно разжеванный мануал. Тема уже не нова для Хабра, но так подробно никто еще не описывал, материала реально достаточно, чтобы собрать deb пакет даже tar архиватором.

Leave a comment

Your comment