05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

Секция %files: макросы путей и атрибуты

Как указывать файлы пакета, атрибуты, %doc, %license, %config.

На этой странице

Секция %files определяет, какие файлы из %{buildroot} попадут в итоговый RPM-пакет.

Основы

%files
%{_bindir}/myapp
%{_libdir}/libmylib.so.1*
%{_datadir}/%{name}/
%{_mandir}/man1/myapp.1*

Правила:

  • Каждый файл на отдельной строке
  • Пути относительно корня (/)
  • Используйте макросы вместо жёстких путей
  • Можно использовать glob-паттерны (*, ?)

Макросы путей

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

МакросПутьНазначение
%{_bindir}/usr/binПользовательские программы
%{_sbindir}/usr/sbinСистемные программы
%{_libdir}/usr/lib64Библиотеки
%{_libexecdir}/usr/libexecВспомогательные программы
%{_includedir}/usr/includeЗаголовочные файлы
%{_datadir}/usr/shareДанные
%{_mandir}/usr/share/manMan-страницы
%{_infodir}/usr/share/infoInfo-страницы
%{_sysconfdir}/etcКонфигурации
%{_localstatedir}/varИзменяемые данные
%{_unitdir}/usr/lib/systemd/systemSystemd unit-файлы
# Посмотреть значение макроса
rpm --eval '%{_libdir}'

Специальные директивы

%doc — документация

%files
%doc README.md AUTHORS NEWS
%doc docs/manual.html

Файлы копируются в %{_docdir}/%{name}/. Могут указываться:

  • Относительно каталога сборки (без /)
  • Или абсолютно (из buildroot)

%license — лицензии

%files
%license LICENSE COPYING
%license LICENSES/MIT.txt

Аналогично %doc, но помечает файлы как лицензии. Важно для юридического соответствия.

%config — конфигурационные файлы

%files
%config %{_sysconfdir}/%{name}.conf
%config(noreplace) %{_sysconfdir}/%{name}.d/*.conf

Типы %config:

ДирективаПоведение при обновлении
%configНовая версия заменит файл. Если был изменён — сохранится как .rpmsave
%config(noreplace)Изменённый файл останется. Новая версия сохранится как .rpmnew
%config(missingok)Не ошибка, если файла нет

Рекомендации:

  • Для пользовательских конфигов: %config(noreplace)
  • Для внутренних конфигов: %config
  • Для опциональных: %config(noreplace,missingok)

%ghost — виртуальные файлы

Файлы, которые создаются во время работы, а не при установке:

%files
%ghost %{_localstatedir}/log/%{name}.log
%ghost %{_rundir}/%{name}.pid

RPM будет знать об этих файлах (для удаления), но не будет их создавать.

%dir — каталоги

%files
%dir %{_sysconfdir}/%{name}.d
%dir %{_datadir}/%{name}

Когда нужен %dir:

  • Пустой каталог должен быть создан
  • Каталог принадлежит именно этому пакету

Когда НЕ нужен:

  • Каталог содержит файлы (они сами создадут его)
  • Системный каталог (/usr/bin, /etc)

%attr — атрибуты файлов

%files
%attr(755, root, root) %{_bindir}/myapp
%attr(640, root, mygroup) %{_sysconfdir}/%{name}.conf
%attr(-, myuser, mygroup) %{_localstatedir}/lib/%{name}

Формат: %attr(mode, user, group)

- означает «использовать значение по умолчанию».

%defattr — атрибуты по умолчанию

%files
%defattr(644, root, root, 755)
%{_datadir}/%{name}/

Формат: %defattr(file_mode, user, group, dir_mode)

Устанавливает атрибуты по умолчанию для всех последующих файлов.

%verify — контроль проверки

%files
%verify(not md5 size mtime) %config(noreplace) %{_sysconfdir}/%{name}.conf

Отключает определённые проверки при rpm -V.

Glob-паттерны

%files
# Все файлы с расширением .so.1*
%{_libdir}/libfoo.so.1*

# Все файлы в каталоге
%{_datadir}/%{name}/*

# Рекурсивно весь каталог
%{_datadir}/%{name}/

# Все man-страницы (включая сжатые)
%{_mandir}/man1/myapp.1*

Важно: Слэш в конце %{_datadir}/%{name}/ означает «весь каталог рекурсивно».

Локализация

%find_lang %{name}

%files -f %{name}.lang
%{_bindir}/myapp

%find_lang создаёт файл со списком переводов, -f подключает его.

Подпакеты

%package libs
Summary:        Libraries for %{name}

%package devel
Summary:        Development files for %{name}
Requires:       %{name}-libs = %{version}-%{release}

%files
%{_bindir}/myapp
%doc README.md
%license LICENSE

%files libs
%{_libdir}/libmylib.so.1*

%files devel
%{_includedir}/mylib/
%{_libdir}/libmylib.so
%{_libdir}/pkgconfig/mylib.pc

Исключение файлов

%files
%{_datadir}/%{name}/
%exclude %{_datadir}/%{name}/test/

Исключённые файлы не попадут в пакет и должны быть удалены в %install или перечислены в %exclude.

Автоматические списки

%

%files
%doc README NEWS
# Автоматически создаст %{_docdir}/%{name}/README и т.д.

%

%files -n python3-%{name}
%{python3_sitelib}/%{name}/
%{python3_sitelib}/%{name}-%{version}.dist-info/

Типичные ошибки

Installed (but unpackaged) file(s)

RPM build errors:
   Installed (but unpackaged) file(s) found:
   /usr/lib64/libfoo.la

Решения:

  1. Добавить файл в %files
  2. Удалить в %install: rm -f %{buildroot}%{_libdir}/*.la
  3. Использовать %exclude (не рекомендуется)

File not found

File not found: /builddir/build/BUILDROOT/.../usr/bin/myapp

Причины:

  • Опечатка в имени
  • Файл не создан в %install
  • Неправильный макрос пути

Conflicting files

file /usr/bin/myapp conflicts between attempted installs

Два пакета устанавливают один файл. Решение:

  • Вынести общий файл в отдельный пакет
  • Использовать Conflicts:
  • Использовать альтернативы (update-alternatives)

Жёсткие пути вместо макросов

# Неправильно
%files
/usr/lib64/libfoo.so.1*

# Правильно
%files
%{_libdir}/libfoo.so.1*

На 32-битной системе /usr/lib64 не существует.

Проверка списка файлов

# Посмотреть, что попало в buildroot
ls -laR ~/rpmbuild/BUILDROOT/

# Посмотреть файлы в собранном пакете
rpm -qlp package.rpm

# Посмотреть с атрибутами
rpm -qlpv package.rpm

Проверьте понимание

  1. Зачем использовать макросы путей вместо жёстких путей?
  2. Чем отличается %config от %config(noreplace)?
  3. Когда нужна директива %dir?
  4. Как включить все файлы каталога рекурсивно?
  5. Что делать с ошибкой «Installed (but unpackaged) file(s)»?

Далее: Макросы: стандартные, системные, свои