Apt-build, и пусть все пересоберется!
Взял с одного поста . Вот адресок . http://itruns.ru/post/398609989/apt-build
Проверено , верить .
Apt-build — мощный инструмент Debian, позволяющий в духе FreeBSD (ну, или Gentoo например) одной командой устанавливать пакеты из исходных текстов (вместо унылого ./configure — make — sudo make install), пересобирать уже установленные пакеты с оптимизацией под используемую архитектуру а также, при наличии желания, пересобрать систему целиком. Ставится сие добро самым обычным образом:
sudo apt-get install apt-build
В процессе установки будет задано несколько вопросов:
- Каталог, в который будут качаться исходники и где будут собираться пакеты. По умолчанию это /var/cache/apt-build/build
- Локальный репозиторий, в который сохраняются собранные пакеты. По умолчанию /var/cache/apt-build/repository
- Уровень оптимизации. Лёгкая, средняя, усиленная (CFLAGS −01, −02, −03). По умолчанию предлагается −02
- Прочие параметры для компиляции. Их в общем случаем можно оставить без изменения.
- Затем будет предложено добавить строку
в /etc/apt/sources.list Не стоит от этого отказываться. Более того, строка должна быть первой в списке репозиториев (критично!).deb file:/var/cache/apt-build/repository apt-build main
- Тип используемого процессора. Думаю, с этим всё понятно.
На этом конфигурирование apt-build закончено. Если в чём-то неуверены, можно просмотреть настройки в файле /etc/apt/apt-build.conf
build-dir = /var/cache/apt-build/build
repository-dir = /var/cache/apt-build/repository
Olevel = -O2
mtune = -mtune=k8
options = “-pipe -fomit-frame-pointer”
make_options = “-j4”
И либо изменить вручную, либо запустить конфигурирование повторно, используя команду:
sudo dpkg-reconfigure apt-build
Далее устанавливаем всё необходимое для сборки (на всякий случай, вдруг чего-либо недостаёт):
sudo apt-get install libc6-dev g++ gcc
Кроме этого не помешает установить и запустить pbuilder (он может пригодится в ряде случаев, о чём apt-build скажет сам):
sudo apt-get install pbuilder && /usr/lib/pbuilder/pbuilder-satisfydepends
Несколько операций с apt-build требуют root-полномочий. Именно root, а не sudoers. Например, при попытке построить индекс пакетов можно наблюдать такую картину:
sudo dpkg —get-selections | awk ’{if ($2 == «install») print $1}’ > /etc/apt/apt-build.list
bash: /etc/apt/apt-build.list: Permission denied
Поэтому тем пользователям Ubuntu, у которых отключена учётная запись root (а по-умолчанию она отключена) рекомендуется включить её и задать пароль. Всё это можно сделать одной командой:
sudo passwd root
Введите новый пароль UNIX:
После этого логинимся под root:
su
Пароль:
И строим индекс пакетов:
# dpkg —get-selections | awk ’{if ($2 == «install») print $1}’ > /etc/apt/apt-build.list
Использование apt-build в общем и целом идентично использованию apt-get:
apt-build [options] [command]
Commands:
update — Update package lists
upgrade — Perform an upgrade
install — Build and install new packages
source — Download and extract source in build directory
build-source — Download, extract and build source package
update-source — Update all sources and rebuild them
remove — Remove packages
build-repository — Rebuild the repository
clean-sources — Clean up all object files in source directories
clean-build — Erase downloaded packages and temporary build files
clean-repository — Erase downloaded packages and temporary build files
world — Rebuild and reinstall all packages on your system
info — Build-related package information
Поэтому первым делом нужно обновиться:
sudo apt-build update && sudo apt-build upgrade
Само собой, в /etc/apt/sources.list должны быть подключены репозитории с исходными текстами (те, которые «deb-src http://и т.д.»). В Ubuntu они уже присутствуют и их необходимо лишь раскомментировать. В Debian нужно прописать репозитории:
deb-src http://security.debian.org/ etch/updates main contrib
deb-src http://mirror.yandex.ru/debian stable main
deb-src http://mirror.yandex.ru/debian/ lenny main
deb-src http://mirror.yandex.ru/debian lenny main non-free contrib
deb-src http://mirror.yandex.ru/debian-security etch/updates main non-free contrib
В 99,9% случаев основные команды apt-build требуют дополнительных опций:
Options:
—reinstall — Re-build and install already installed package
—rebuild — Rebuild package
—remove-builddep — Remove build-dependencies installed by apt-build
—nowrapper — Do not use gcc/g++ wrapper
—purge — Use purge instead of remove
—noupdate — Do not run ’apt-get update’ before package installation
—build-command — Use to build package
—patch — Apply patch s before the build
—patch-strip — Striplevel for the patch files
—yes -y — Assume yes
—version -v — Show version and exit
—force-yes — Force yes
—source — Do not download source (sources are extracted already)
—build-only — Do not install any of build dependencies
—build-dir — Specify build dir
—repository-dir — Specify the repository directory
—target-release — Distribution to fetch packages from
—sources-list — Specify sources.list file
—apt-get — Specify an alternative apt-get application to use
—apt-cache — Specify an alternative apt-cache application to use
—config — Specify an alternative configuration file
Например, чтобы переустановить из исходников уже установленный пакет, нам понадобится следующая директива:
sudo apt-build —rebuild —reinstall —force-yes —yes install mc
—-—> Installing build dependencies (for mc) <—-—
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
(Вывод опущен)
—-—> Building mc <—-—
dpkg-buildpackage: установка CFLAGS в значение по умолчанию: -g -O2
dpkg-buildpackage: установка CPPFLAGS в значение по умолчанию:
dpkg-buildpackage: установка LDFLAGS в значение по умолчанию: -Wl,-Bsymbolic-functions
dpkg-buildpackage: установка FFLAGS в значение по умолчанию: -g -O2
dpkg-buildpackage: установка CXXFLAGS в значение по умолчанию: -g -O2
dpkg-buildpackage: пакет исходных текстов mc
dpkg-buildpackage: версия исходных текстов 2:4.6.2~git20080311-2
dpkg-buildpackage: исходные тексты изменены root
dpkg-buildpackage: архитектура хоста i386
debian/rules clean
(И т.д.)
В процессе установки/пересборки apt-build сам скачивает нужные ему для компиляции пакеты, поэтому не удивляемся, увидев нечто подобное этому:
—-—> Installing build dependencies (for kdesdk) <—-—
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
НОВЫЕ пакеты, которые будут установлены:
automoc binutils-dev cdbs cmake fdupes hspell kdelibs5-dev kdepimlibs5-dev kdesdk-scripts libacl1-dev libapr1-dev libaprutil1-dev
libasound2-dev libattr1-dev libboost-date-time-dev libboost-date-time1.34.1 libboost-dev libboost-doc libboost-filesystem-dev
libboost-filesystem1.34.1 libboost-graph-dev libboost-graph1.34.1 libboost-iostreams-dev libboost-program-options-dev
libboost-program-options1.34.1 libboost-python-dev libboost-regex-dev libboost-serialization-dev libboost-serialization1.34.1
libboost-signals-dev libboost-signals1.34.1 libboost-test-dev libboost-test1.34.1 libboost-thread-dev libboost-thread1.34.1
libboost-wave-dev libboost-wave1.34.1 libbz2-dev libcups2-dev libdb4.6-dev libgif-dev libgpgme11-dev libicu-dev libilmbase-dev
libjasper-dev libkeyutils-dev libldap2-dev libmysqlclient15-dev libopenexr-dev libphonon-dev libplasma-dev libpth-dev libsasl2-dev
libsoprano-dev libsqlite3-dev libstreamanalyzer-dev libstreams-dev libsvn-dev libtiff4-dev libtiffxx0c2 libxslt1-dev python-dev
python2.5-dev quilt uuid-dev
В конце установки/пересборки apt-build напомнит, что нужно удалить пакеты, использовавшиеся для сборки, для их удаления нужно использовать
apt-get autoremove
Для установки пакета:
sudo apt-build install —yes —force-yes gpicview
Вообще, ключи «—yes —force-yes» — это то, что нужно использовать постоянно.
Для того, чтобы собранные нами пакеты не были заменены обычными версиями при первом же обновлении, необходимо их «заморозить».
Для этого существует два способа. Первый из них описан в документации к apt-build и заключается в внесении в файл /etc/apt/preferences сведений о «замороженных» пакетах в таком формате:
Package: * (обязательно в формате «имя-версия»)
Pin: release o=apt-build
Pin-Priority: 990
Второй способ — специально для любителей «экстрима». Особенно пригодится для тех пакетов, пересобирать которые мы не планируем ещё долго.
- С помощью apt-build source качаем исходники нужного пакета
- Перемещаемся в каталог с исходниками
- Набираем:
# dch -i
- Меняем версию на бОльшую.
- Сохраняемся
- Собираем/ставим пакет
- После этого «морозим» версию:
sudo aptitude hold gpicview
Теперь самое интересное: apt-build позволяет целиком пересобрать систему:
apt-build world
Однако ньюанс заключается в том, что во-первых, не всё ПО, установленное на машине является свободным, и во-вторых, даже будучи свободным, для того или иного пакета могут отсутствовать прописанные в /etc/apt/sources.list репозитории с исходниками. В этом случае весь процесс пересборки остановится на таком пакете. Чтобы этого не случилось, нужно отредактировать файл /etc/apt/apt-build.list, исключив из него проприетарное ПО и ПО с отсутствующими в пределах досягаемости apt-build репозиториями исходных текстов. Ну а после этого запускать apt-build world и ждать. Долго и мучительно. Как отфильтровать пакеты без исходников? Признаться, не знаю. На момент написания этих строк у меня уже более полутора суток пересобирается система. Каждый раз, когда процесс пересборки ругается на отсутствие исходников, я удаляю строку с именем этого пакета в apt-build.list, а также все вышележащие строки, чтобы не пересобирать тучу программ заново.
По окончании процесса перезагружаемся и делаем:
apt-build upgrade
Затем стоит почистит соответствующие каталоги от исходников и собранных пакетов, т. к. при постоянном использовании apt-build они отъедают значительный объём дискового пространства:
sudo apt-build clean-sources && apt-build clean-repository
Apt-build на мой взгляд является полезной и интересной утилитой.
В качестве заключения опишу несколько важных моментов, связанных с её использованием.
Плюсы: Поскольку при установке/пересборке пакеты компилируются под конкретную архитектуру, увеличение быстродействия видно невооружённым глазом (точных замеров производительности не делал, извините уж :-)
Минусы: Компиляция занимает гораздо больше времени, нежели чем обычная установка через apt-get install. Тоже самое можно сказать и о пересборке, поэтому следует запастись терпением.
Система, собранная из исходных кодов требует гораздо больше внимания. Тем более, изначально для этого не предназначенная (такая как Ubuntu).
Обычное обновление системы через apt-get upgrade порушит все наши труды по сборке и оптимизации. Поэтому во-первых не забудьте о «заморозке» пакетов и, во-вторых, следует выработать собственный график оптимизации системы (например, через некоторое время после очередного релиза).
Возможные проблемы: Несмотря на то, что по идее apt-build сам скачивает и устанавливает всё необходимое для компиляции, иногда при сборке можно увидеть ошибку, связанную с неудовлетворёнными зависимостями. В общем и целом удаётся просто установить нужное через apt-build install. В «сложных» случаях пригодится команда:
apt-get build-dep package_name
Также в некоторых случаях apt-build по неизвестным мне причинам отказывается видеть в /etc/apt/sources.list строчку с собственным локальным репозиторием, вследствие чего отказывается устанавливать только что собранный пакет. Что интересно, если в случае с пересборкой уже установленного пакета запустить
apt-get update && apt-get upgrade
— свежесобранный пакет будет предложен к обновлению. Как раз из локального репозитория. Это все проблемы, с которыми я столкнулся в процессе использования apt-build.
И в заключение самое главное: если кто-то надумает попробовать apt-build — помните: ВСЕ ДЕЙСТВИЯ ВЫ ПРОИЗВОДИТЕ НА ВАШ СТРАХ И РИСК :-) Но на мой взгляд, оно того стоит. Главное — понимать что ты делаешь.