Типичные ошибки и их решение
Разбор частых проблем при сборке RPM с объяснениями и решениями.
На этой странице
При первых сборках вы обязательно столкнётесь с ошибками. Здесь собраны наиболее частые проблемы и способы их решения.
Ошибки на этапе %prep
«Source0 not found»
error: File /home/user/rpmbuild/SOURCES/myapp-1.0.tar.gz: No such file or directory
Причина: Архив исходников не скачан.
Решение:
# Скачать через spectool
spectool -g -C ~/rpmbuild/SOURCES/ myapp.spec
# Или вручную
cd ~/rpmbuild/SOURCES/
curl -LO https://example.com/myapp-1.0.tar.gz
«Patch does not apply»
Patch #0 (myapp-fix.patch):
+ /usr/bin/patch -p1 -s
patch: **** Can't find file to patch at input line 5
Причины:
- Неправильный уровень
-p - Патч для другой версии
- Изменилась структура каталогов
Диагностика:
# Посмотреть, что внутри патча
head -20 ~/rpmbuild/SOURCES/myapp-fix.patch
# --- a/src/main.c
# +++ b/src/main.c
# Попробовать разные уровни -p
cd ~/rpmbuild/BUILD/myapp-1.0
patch -p1 --dry-run < ~/rpmbuild/SOURCES/myapp-fix.patch
patch -p0 --dry-run < ~/rpmbuild/SOURCES/myapp-fix.patch
Решение:
# Указать правильный уровень
%prep
%autosetup -p1
# или
%setup -q
%patch0 -p0
«Archive extracts to unexpected directory»
error: Bad source: /home/user/rpmbuild/SOURCES/myapp-1.0.tar.gz:
Expected myapp-1.0, got myapp
Причина: Архив распаковывается в каталог с другим именем.
Решение:
%prep
%autosetup -n myapp
# или
%setup -q -n myapp
Ошибки на этапе %build
«Command not found: configure»
./configure: No such file or directory
Причина: Проект не использует Autotools, или нужно сгенерировать configure.
Решение:
# Если есть autogen.sh
%prep
%autosetup
./autogen.sh
# Или если проект использует CMake
%build
%cmake
%cmake_build
«Package requirements not met»
checking for LIBFOO... no
configure: error: Package requirements (libfoo >= 2.0) were not met
Причина: Не установлена библиотека для сборки.
Решение:
# Найти пакет
dnf provides 'pkgconfig(libfoo)'
# libfoo-devel-2.1-1.x86_64 : Development files for libfoo
# Добавить в SPEC
BuildRequires: pkgconfig(libfoo) >= 2.0
# или
BuildRequires: libfoo-devel >= 2.0
«Undefined reference»
/usr/bin/ld: main.o: undefined reference to `foo_init'
collect2: error: ld returned 1 exit status
Причина: Не линкуется библиотека.
Решение:
%build
%configure LDFLAGS="-lfoo"
# или проверить, что в проекте правильный порядок линковки
«fatal error: header.h: No such file or directory»
main.c:5:10: fatal error: foo/bar.h: No such file or directory
5 | #include <foo/bar.h>
Причина: Не установлены заголовочные файлы.
Решение:
# Найти пакет с заголовком
dnf provides '*/foo/bar.h'
# Добавить в SPEC
BuildRequires: libfoo-devel
Ошибки на этапе %install
«Installed (but unpackaged) file(s) found»
RPM build errors:
Installed (but unpackaged) file(s) found:
/usr/lib64/libfoo.la
/usr/share/doc/myapp/README
Причина: Файлы установлены в buildroot, но не перечислены в %files.
Решения:
-
Добавить файлы в %files:
%files %{_libdir}/libfoo.la %doc README -
Удалить ненужные файлы:
%install %make_install rm -f %{buildroot}%{_libdir}/*.la -
Использовать %exclude (не рекомендуется):
%files %exclude %{_libdir}/*.la
«File not found»
File not found: /home/user/rpmbuild/BUILDROOT/.../usr/bin/myapp
Причины:
- Опечатка в
%files - Файл не создан при
%install - Неправильный макрос пути
Диагностика:
# Посмотреть, что реально есть в buildroot
ls -laR ~/rpmbuild/BUILDROOT/
# Сравнить с %files в SPEC
«DESTDIR not honored»
Некоторые проекты игнорируют DESTDIR:
make install DESTDIR=%{buildroot}
# Файлы всё равно идут в /usr/bin вместо buildroot
Решение:
%install
# Ручная установка
install -d %{buildroot}%{_bindir}
install -m 755 myapp %{buildroot}%{_bindir}/
# Или исправить Makefile патчем
Ошибки в %files
«File listed twice»
File listed twice: /usr/share/myapp/data/file.txt
Причина: Файл указан и отдельно, и через wildcard.
Решение:
# Неправильно
%files
%{_datadir}/myapp/
%{_datadir}/myapp/data/file.txt
# Правильно — или каталог, или отдельные файлы
%files
%{_datadir}/myapp/
«Conflicting files»
file /usr/bin/common from install of pkg-A conflicts with
file from package pkg-B
Причина: Два пакета устанавливают один файл.
Решения:
- Вынести общий файл в отдельный пакет
- Использовать
Conflicts: - Использовать
update-alternatives
«Directory not owned by any package»
W: directory-not-owned /usr/share/myapp
Решение:
%files
%dir %{_datadir}/myapp
%{_datadir}/myapp/*
Ошибки rpmlint
«no-documentation»
W: no-documentation
Решение:
%files
%doc README.md AUTHORS
%license LICENSE
«no-manual-page-for-binary»
W: no-manual-page-for-binary myapp
Решения:
- Добавить man-страницу из upstream (если есть)
- Создать минимальную man-страницу
- Игнорировать (если программа простая)
«spelling-error»
W: spelling-error Summary(en_US) programm -> program
Решение: Исправить опечатку или добавить исключение в /etc/rpmlint/config.
«wrong-script-interpreter»
E: wrong-script-interpreter /usr/bin/myapp #!/usr/bin/env python
Причина: Shebang #!/usr/bin/env python нестандартен.
Решение:
%install
%make_install
# Исправить shebang
sed -i '1s|#!/usr/bin/env python|#!/usr/bin/python3|' \
%{buildroot}%{_bindir}/myapp
Или использовать макрос:
%py3_shebang_fix %{buildroot}%{_bindir}/myapp
«devel-file-in-non-devel-package»
W: devel-file-in-non-devel-package /usr/lib64/libfoo.so
Причина: Симлинк .so без версии попал в основной пакет.
Решение:
%package devel
Summary: Development files for %{name}
Requires: %{name}-libs = %{version}-%{release}
%files
%{_bindir}/myapp
%files libs
%{_libdir}/libfoo.so.1*
%files devel
%{_libdir}/libfoo.so
%{_includedir}/foo.h
%{_libdir}/pkgconfig/foo.pc
Системные ошибки
«Permission denied»
error: can't create %{buildroot}: Permission denied
Причина: Проблемы с правами или сборка от root.
Решение:
# Проверить владельца
ls -la ~/rpmbuild
# Исправить
sudo chown -R $USER:$USER ~/rpmbuild
«No space left on device»
error: No space left on device
Решение:
# Проверить место
df -h
# Очистить старые сборки
rm -rf ~/rpmbuild/BUILD/*
rm -rf ~/rpmbuild/BUILDROOT/*
«Out of memory»
При сборке больших проектов:
%build
# Ограничить параллельность
make -j2
Или в ~/.rpmmacros:
%_smp_mflags -j2
Быстрая диагностика
# Пошаговая сборка для отладки
rpmbuild -bp package.spec # Только %prep
rpmbuild -bc package.spec # До %build включительно
rpmbuild -bi package.spec # До %install включительно
# Сохранить buildroot
rpmbuild -bi --noclean package.spec
# Посмотреть, что создано
ls -laR ~/rpmbuild/BUILD/
ls -laR ~/rpmbuild/BUILDROOT/
Проверьте понимание
- Как скачать исходники, указанные в SPEC?
- Что делать, если патч не применяется?
- Как найти пакет, содержащий нужный заголовочный файл?
- Что означает ошибка «Installed (but unpackaged)»?
- Как выполнить только этап %prep для отладки?
Следующий модуль: Системы сборки