Разбор ошибок сборки
Типичные ошибки на ABF и способы их исправления.
На этой странице
Сборка на ABF часто выявляет ошибки, которые не проявлялись локально. Здесь разберём типичные проблемы.
Принципы отладки
- Скачайте и прочитайте лог — ошибка обычно в конце
- Ищите строку «error:» — rpmbuild явно указывает проблему
- Сравните с локальной сборкой — что отличается?
- Проверьте BuildRequires — на ABF только то, что указано
Ошибки на этапе подготовки
«Source0 not found»
error: File /home/omv/rpmbuild/SOURCES/mypackage-1.0.0.tar.gz: No such file or directory
Причины:
- Файл не добавлен в git-репозиторий
- Имя файла не совпадает с Source0 в SPEC
- URL недоступен
Решение:
# Проверить, что файл есть
ls -la mypackage-1.0.0.tar.gz
# Добавить в git
git add mypackage-1.0.0.tar.gz
git commit -m "Add source tarball"
git push
«Patch does not apply»
error: patch mypackage-fix.patch does not apply
Причины:
- Патч для другой версии исходников
- Патч уже применён в новой версии
- Неправильный уровень
-p
Решение:
# Скачать исходники и проверить патч
tar xf mypackage-1.0.0.tar.gz
cd mypackage-1.0.0
patch -p1 --dry-run < ../mypackage-fix.patch
Если патч устарел — удалите его или создайте новый.
Ошибки зависимостей
«No package X available»
No match for argument: libfoo-devel
Error: Unable to find a match: libfoo-devel
Причины:
- Пакет называется по-другому в ROSA
- Пакет не существует в репозитории
- Опечатка в имени
Решение:
# Поиск правильного имени
dnf search libfoo
dnf provides '*/libfoo.h'
dnf provides 'pkgconfig(libfoo)'
«Nothing provides X needed by Y»
Error: Package: mypackage-1.0.0-1 requires libfoo.so.1()(64bit)
No available provider: libfoo.so.1()(64bit)
Причины:
- Библиотека не в репозитории
- Версия библиотеки отличается
Решение:
- Добавить пакет с библиотекой в репозиторий
- Или собрать с bundled-версией
Ошибки компиляции
«error: ‘function’ was not declared»
main.c:10:5: error: 'new_function' was not declared in this scope
Причины:
- Новая версия компилятора строже
- Не подключён заголовочный файл
- API библиотеки изменился
Решение: Создать патч:
# В исходниках
echo '#include <missing_header.h>' >> src/main.c
diff -u src/main.c.orig src/main.c > fix-include.patch
«undefined reference to»
/usr/bin/ld: main.o: undefined reference to 'foo_init'
Причины:
- Не линкуется библиотека
- Неправильный порядок линковки
Решение:
%build
%configure LDFLAGS="-lfoo"
Или добавить BuildRequires с нужной библиотекой.
Ошибки установки
«Installed (but unpackaged) file(s)»
RPM build errors:
Installed (but unpackaged) file(s) found:
/usr/lib64/libfoo.la
/usr/share/doc/mypackage/CHANGELOG
Причина: Файлы созданы в buildroot, но не указаны в %files.
Решение:
# Вариант 1: Добавить файлы
%files
%{_libdir}/libfoo.la
%doc CHANGELOG
# Вариант 2: Удалить ненужные
%install
%make_install
rm -f %{buildroot}%{_libdir}/*.la
«File not found»
File not found: /buildroot/.../usr/bin/myapp
Причины:
- Опечатка в
%files - Файл не создан при установке
- Неправильный макрос пути
Решение:
# Посмотреть, что реально создано
# (запустить локально с --noclean)
ls -laR ~/rpmbuild/BUILDROOT/
Ошибки тестов
«%check failed»
FAILED tests/test_main.py::test_function
error: Bad exit status from /var/tmp/rpm-tmp.xxxxx (%check)
Причины:
- Тесты требуют сеть (недоступна на ABF)
- Тесты требуют специфичное окружение
- Баг в коде
Решение:
%check
# Пропустить сетевые тесты
%pytest -k "not network"
# Или временно отключить (с комментарием!)
# Tests disabled: require network access
# %%pytest
Ошибки окружения
«Cannot allocate memory»
Сборка требует много RAM.
Решение:
%build
# Ограничить параллельность
make -j2
«No space left on device»
Проект создаёт слишком много временных файлов.
Решение:
- Упростить сборку
- Отключить генерацию документации
- Обратиться к администраторам ABF
Отличия ABF от локальной сборки
| Аспект | Локально | ABF |
|---|---|---|
| Установленные пакеты | Много | Только BuildRequires |
| Сеть | Обычно есть | Обычно нет (или сильно ограничена) |
| Окружение | Может быть «грязным» | Чистый chroot |
| Архитектура | Одна | Несколько |
| Время | Не ограничено | Таймаут |
Чеклист перед отправкой на ABF
- ✅ Сборка проходит локально
- ✅
rpmlintне показывает ошибок - ✅ Все файлы добавлены в git
- ✅ Все BuildRequires указаны явно
- ✅ Тесты не требуют сеть
Отладка с mock
Mock эмулирует окружение ABF (имя профиля смотрите в /etc/mock):
# Установить mock
sudo dnf install mock
sudo usermod -aG mock $USER
# Собрать в чистом окружении
mock -r rosa-13.1-x86_64 --rebuild mypackage.src.rpm
# Посмотреть лог
less /var/lib/mock/rosa-13.1-x86_64/result/build.log
Получение помощи
Если не можете разобраться:
- Прочитайте лог ещё раз
- Поищите ошибку в интернете
- Спросите в Telegram t.me/rosalinux
- Напишите на форум с логом и описанием
Проверьте понимание
- Где искать причину ошибки в логе?
- Почему пакет собирается локально, но падает на ABF?
- Как исправить ошибку «No package X available»?
- Что делать с «Installed (but unpackaged)»?
- Как проверить сборку в чистом окружении без ABF?
Далее: Публикация в community