Etersoft-build-utils
Сборка пакетов
Образец того, как надо оформлять спек, вы можете посмотреть в пакете wcalc или gnubiff. Настоятельно рекомендуется обратиться к документации, а также смотреть "как это сделано в другом пакете". Получить src.rpm для установленного в систему пакета можно командой $ rpmgp название_пакета Также образцы спеков для разных типов пакетов доступны здесь.
Подготовка уже имеющегося src.rpm
Устанавливаем файл *.src.rpm, который хотим собирать (под пользователем):
$ rpm -i название*.src.rpm
Исходники пакета при этом разместятся в /RPM/SOURCES, а спек – в /RPM/SPECS.
Заходим в каталог /RPM/SPECS, и видим там спек для собираемого пакета. Если спек взят из другого дистрибутива, то сначала делаем
$ rpmcs название.spec
чтобы привести спек в пригодный для использования вид. Далее его нужно поправить вручную, используя взятый из ALT Linux пример спека в качестве образца.
Сборка пакета "с нуля"
Вы должны разместить исходники пакета (архивы) в /RPM/SOURCES, а шаблон будущего спека (скопированный из образца) – в /RPM/SPEC. Типовые действия
Находясь в каталоге SPEC:
$ rpmbb название.spec
- для сборки двоичного пакета (он будет создан в /RPM/RPMS)
$ rpmbb -r название.spec
- для того, чтобы в пакет автоматически прописались зависимости на пакеты, необходимые при сборке. Если пересобирается уже имеющийся пакет из Сизифа, то это не обязательно. (см. также
- Использование buildreq)
$ add_changelog название.spec
- для добавления строчки о данной сборке в секцию %changelog, в конце спека. После этого следует в спеке дописать комментарий, какие изменения были сделаны в данной сборке. Иногда также
- бывает удобно сразу указать список изменений:
- $ add_changelog example.spec -e 'Initial build'
- Более подробно об использовании этого скрипта вы можете узнать здесь.
Сформированные зависимости (строчка BuildRequires) нужно просмотреть, чтобы там не было ненужных пакетов. Правильность сборки проверяется пересборкой готового пакета в hasher (см. ниже).
Ошибки при сборке
Для начала, нужно локализовать проблему — определить, является ли она проблемой конкретного дистрибутива/системы (например: отсутствие или неверная версия необходимых для сборки библиотек, специфика дистрибутива) или более глобальной (например: несобираемость определенной версией компилятора, ошибки в коде, несоответствие кода новым стандартам). В первом случае, поможет осуществить поиск по дистрибутиву/репозиторию, поискать решение проблемы в архивах почтовых рассылок или непосредственно попросить помощи в тематических конференциях, посвещенных дистрибутиву (sisyphus, devel, community). ВНИМАНИЕ: порядок действий, для решения проблемы имеет значение (репозиторий -> поиск в архиве -> рассылки). Во втором случае, стоит начать с поиска готовых решений. В открытом сообществе, считается хорошим тоном публиковать решения найденных проблем. Зачастую, поисковики выдают море полезной информации по кратко описанной в трех-пяти словах проблеме конкретного софта или тексту ошибки, полученной при сборке. Например, запроса вида " gcc4.1 mysoftware patch" может быть достаточно для поиска патча, решающего проблему сборки с новым gcc4.1). Стоит также воспользоваться имеющимися репозиториями открытой разработки. Зачастую, мейнтейнеры этих репозиториев, уже сталкивались с такими же проблемами, и возможно у них есть решение (патч) для сложившейся ситуации. О том, как устранить отсутствие необходимых библиотек или заголовочных файлов, рассказано в следующем пункте.
Поиск пакетов
Возможно при сборке вам придётся доустанавливать недостающие библиотеки. Имейте в виду, что в ALT принято называть пакеты для разработки так: libX-devel, где X – название библиотеки. Пользуйтесь apt-cache search название для поиска недостающего пакета. Если пакета нет в вашей системе, поищите его в Сизифе. Если его нет и там, обратитесь к крупным собраниям информации о пакетах.
а также в репозитории открытой разработки.
Сборочная среда Hasher
Чтобы убедиться в том, что все зависимости правильны и сборка вашего пакета нормально пройдёт на сборочном сервере в ALT Linux, используется hasher — среда, которая позволяет осуществить сборку пакета в «чистой» системе, куда установлены только пакеты, указанные в сборочных зависимостях.
Настройте hasher согласно краткому руководству.
Для сборки пакета в hasher запустите
rpmbsh -i -u спек.spec
Эта команда соберёт пакет, установит его в тестовый hasher, после чего предложит отправить его в Incoming.
Если вы производите сборку на удалённом сервере, то рекомендуется воспользоваться командой screen:
$ screen
Далее, для отключения от сеанса: Ctrl-A, D Для подключения обратно:
$ screen -r
Лимиты на сборку у инкамингера
При сборке пакетов в сборочном окружении используются следующие лимиты: В терминах hasher-priv.conf(5):
rlimit_hard_as=1073741824 rlimit_soft_cpu=7200 rlimit_hard_cpu=7260 wlimit_time_elapsed=14400 wlimit_time_idle=3600 wlimit_bytes_written=268435456
ldv@ in devel
Команды
В параметрах скриптов обычно указываются названия файлов спеков.
Команда из etersoft-build-utils | Расшифровка названия | Обычный аналог | Где результат | Комментарий |
rpmbb | BB = Binary Build | rpm -bb | /RPM/RPMS | сборка бинарного пакета |
rpmbb -r|-R |
buildreq [-bi] | Спек, строка BuildRequires: | вычисление необходимых зависимостей сборки с занесением в спек | |
rpmbs -u | BS = Build Source | задание на сборку | собрать src.rpm, подписать его и выложить в Incoming; удалить buildroot | |
rpmbsh [ -r ] | BSH = Build Source with Hasher | /hasher/repo/i586/RPMS.hasher | собрать из спека src.rpm и отправить его на сборку в hasher (если сразу указан src.rpm, собираем его) | |
rpmcs спек | CS = cleanup spec | cleanup_spec | привести спек в соответствие с требованиями | |
rpmrb спек [версия] | RB = Release? Build | для указанного спека скачивает архив с исходниками новой (указанной) версии, собирает в hasher и устанавливает в тестовый hasher | ||
rpmgs спек | GS = Get Source | для указанного спека скачивает архив с исходниками | ||
rpmgp пакет | GP = Get Package | для указанного пакета скачивает src.rpm | ||
rpmbph [-M51] спек | BPH = BackPort and build with Hasher | выполняет бэкпорт указанного спека в указанный дистрибутив | ||
rpmbs | BS = Build Source | rpm -bs | /RPM/SRPMS | собрать src.rpm |
rpmbb -i | /RPM/RPMS | выполнить установку и упаковку пакета, пропустив компиляцию | ||
rpmbb -c | rpm -bc --short-circuit | /RPM/BUILD | компиляция без установки |
- Ключ -r указывает произвести сборку на удалённом сервере
- Ключ -u указывает отправить на сборку в girar после локальной сборки
Также есть команды loginhsh для входа в (тестовый) hasher.
Нужно перенести в более подходящее место:
Использование ccache
Для ускорения сборки программного кода (если он пересобирается более одного раза) предлагается использовать ccache. Алексей Турбин поделился своими настройками:
~/.zshrc: unset CCACHE_PATH export GCC_USE_CCACHE=1 export CCACHE_DIR=$TMPDIR/.ccache export CC=gcc CXX=g++ ~/.rpmmacros: %_tmppath /tmp/.private/at %__ccache_dir %_tmppath/.ccache
ccache в etersoft-build-utils
В etersoft-build-utils-1.6.7-alt1 добавлена поддержка ccache. ccache кэширует результат компиляции и позволяет серьёзно ускорить пересборку пакетов. По умолчанию выставлен размер кэша в 1Гб. Кэш располагается в $TMPDIR/ccache и индивидуален для каждого пользователя. Может быть изменено в конфиге (~/.config/eterbuild) в строке export CCACHE_DIR=$OURTMPDIR/ccache
Добавлена новая команда jmake, которая вызвает make с двумя дополнениями:
- включается ccache для сборки (если не задана переменная CCACHE_DISABLE в конф. файле)
- make запускается с параметром -j NPROCS, задействуются все незанятые ядра процессоров при сборке.
Количество незанятых ядер вычисляется как количество ядер минус средняя загрузка за последнюю минуту. Таким образом будут задействоваться незанятые ядра.
rpmbb использует ccache, если это включено переменной CCACHE_ENABLE=yes в конфигурационном файле (~/.config/eterbuild)