\documentclass[russian,notitlepage,a4paper]{article}
\usepackage[koi8-r]{inputenc}
\usepackage{babel}

\textwidth=18cm
\oddsidemargin=-1.04cm
%\headheight=0cm
%\textheight=28cm
%\headsep=0cm
%\topmargin=-1.54cm

\author{Dmitry~V.~Levin <ldv@altlinux.org>\\ ALT Linux Team}
\title{ALT Linux RPM:\\ особенности версии rpm-4.0.4-alt32}

%TODO:
% --enable debug
% contents indices
% rpmbuild -bM
% $RPM_SCRIPTS_DEBUG

\begin{document}
\maketitle

\section{Обоснование}

При разработке изменений и дополнений к {\it RPM} решались следующие задачи:
\begin{description}
	\item[Обеспечить желаемую функциональность:] наши пакеты должны отвечать
	определённым правилам, о которых пойдёт речь несколько позже. Для этого
	надо, чтобы {\it spec}-файлы обеспечивали выполнение этих правил.
	\item[Помочь разработчику:] так как {\it spec}-файлы все ещё пишут
	люди, то их работу нужно свести к тому минимуму, который, собственно, и
	требует участия человека. Разработчик не должен копировать блоки кода
	из файла в файл, ибо эта неинтеллектуальная работа отнимает массу сил и
	чревата ошибками. Для этого есть макросы. Если какой-то код появляется в
	разных {\it spec}-файлах более одного раза, то надо написать макрос(ы).
\end{description}

\section{Новые тэги.}
\subsection{BuildHost.}
С помощью этого тэга можно переопределить значение hostname, которое {\it RPM} помещает
в заголовок каждого пакета. По умолчанию, как и ранее, используется значение,
возвращаемое {\it uname(2)}.

\section{Устаревшие тэги.}
\subsection{BuildRoot.}
Времена, когда тэг {\it BuildRoot} в {\it spec}-файле определял, какой каталог {\it RPM} будет
использовать в качестве {\it BuildRoot}, прошли безвозвратно. Теперь этот тэг не несёт
никакой информации и может (и должен) быть опущен. Вместо этого используется значение макроса
{\it \%buildroot}, который определён как ``\%\{\_tmppath\}/\%\{name\}-buildroot'' в файле
{\it /usr/lib/rpm/macros} и может быть переопределён в любом месте, где допускается определять
макросы. В случае, если макрос {\it \%buildroot} не определён либо его значение представляет собой
недопустимое значение ``/'', сборка пакета не будет выполнена.

\section{Новые макросы.}

\subsection{Встроенные макросы.}
\begin{description}
	\item[\%homedir]: домашний каталог пользователя, вызывающего этот макрос;
	\item[\%\{homedir:{\it user}\}]: домашний каталог пользователя {\it user}.
\end{description}

\subsection{Макросы для часто используемых каталогов.}
\begin{description}
	\item[manpages:] \%\_man1dir, \%\_man2dir, \%\_man3dir, \%\_man4dir, \%\_man5dir, \%\_man6dir, \%\_man7dir, \%\_man8dir, \%\_man9dir;
	\item[X11R6:] \%\_x11dir, \%\_x11bindir, \%\_x11libdir, \%\_x11includedir, \%\_x11mandir, \%\_x11datadir, \%\_x11fontsdir;
	\item[альтернативы:] \%\_altdir;
	\item[лицензии:] \%\_licensedir;
	\item[меню:] \%\_menudir, \%\_iconsdir, \%\_miconsdir, \%\_liconsdir;
	\item[service:] \%\_initdir;
	\item[control:] \%\_controldir;
	\item[emacs:] \%\_emacslispdir;
	\item[pam:] \%\_pam\_modules\_dir;
	\item[tcl:] \%\_tcllibdir, \%\_tcldatadir;
	\item[kernel:] \%patches\_dir, \%kernel\_srcdir;
	\item[ruby:] \%ruby\_archdir, \%ruby\_libdir, \%ruby\_sitearchdir, \%ruby\_sitelibdir;
	\item[другие системные:] \%\_cachedir, \%\_lockdir, \%\_logdir, \%\_spooldir.
\end{description}

\subsection{Управление опциями компилятора {\it gcc}.}
\begin{description}
	\item[\%add\_optflags <options>:] добавить указанные параметры в стандартный набор \%optflags;
	\item[\%remove\_optflags <options>:] убрать указанные параметры из стандартного набора \%optflags;
	\item[\%optflags\_core:] базовые параметры;
	\item[\%\_optlevel:] уровень оптимизации;
	\item[\%optflags\_optimization:] параметры, отвечающие за оптимизацию, кроме архитектурно-зависимых;
	\item[\%optflags\_warnings:] warning options;
	\item[\%optflags\_debug:] debugging options;
	\item[\%optflags\_shared:] параметры, применяемые для порождения корректного кода для DSO;
	\item[\%optflags\_nocpp:] параметры, отключающие поддержку C++ exceptions и C++ RTTI;
	\item[\%optflags\_notraceback:] -fomit-frame-pointer;
	\item[\%optflags\_fastmath:] -ffast-math;
	\item[\%optflags\_strict:] -fstrict-aliasing;
	\item[\%optflags\_kernel:] параметры, используемые при компиляции ядра и его модулей.
\end{description}
По умолчанию, стандартный набор \%optflags состоит из
``\%optflags\_core \%optflags\_warnings \%optflags\_optimization''.

\subsection{Выбор версии используемых GCC.}
\begin{description}
	\item[\%set\_gcc\_version:] выбор версии GCC из множества установленных в системе.
\end{description}
По умолчанию используется {\it /usr/bin/i586-alt-linux-gcc}.

\subsection{Выбор версии используемых {\it GNU Autotools}.}
\begin{description}
	\item[\%set\_autoconf\_version:] выбор версии autoconf из множества установленных в системе;
	\item[\%set\_automake\_version:] выбор версии automake из множества установленных в системе;
	\item[\%set\_libtool\_version:] выбор версии libtool из множества установленных в системе.
\end{description}
По умолчанию используется версия {\it default}.

\subsection{Макросы-надстройки над утилитой {\it make}.}
\begin{description}
	\item[\%\_\_nprocs:] число процессоров, доступных для сборки с помощью \%make\_build;
	\item[\%make\_build:] вызов make с параметром, обеспечивающим оптимальную параллельную сборку в данной среде;
	\item[\%make\_install:] вызов make c инициализацией переменной {\it INSTALL},
		что в случае корректной реализации {\it Makefile}ов пакета позволяет сохранить
		дату последней модификации файлов, что особенно важно для документации;
	\item[\%makeinstall:] ``{\it \%make\_install} <инициализация других переменных,
		используемых многими {\it Makefile}ами> {\it install}''.
\end{description}

\subsection{Регистрация разделяемых библиотек.}
\begin{description}
	\item[\%post\_ldconfig, \%post\_ldconfig\_lib:] регистрация новых/обновлённых библиотек;
	\item[\%post\_ldconfig\_sys:] регистрация новых/обновлённых системных библиотек (которые могут быть использованы в chroot'ах);
	\item[\%postun\_ldconfig:] отмена регистрации удалённых библиотек.
\end{description}

\subsection{Регистрация документации в формате {\it info}.}
\begin{description}
	\item[\%install\_info:] регистрация новых/обновлённых {\it info}-страниц;
	\item[\%uninstall\_info:] отмена регистрации удалённых {\it info}-страниц.
\end{description}

\subsection{Регистрация меню.}
\begin{description}
	\item[\%update\_menus:] регистрация новых/обновлённых меню;
	\item[\%clean\_menus:] отмена регистрации удалённых меню.
\end{description}

\subsection{Регистрация оконных менеджеров.}
\begin{description}
	\item[\%update\_wms:] регистрация новых/обновлённых описаний оконных менеджеров;
	\item[\%clean\_wms:] отмена регистрации удалённых описаний оконных менеджеров.
\end{description}

\subsection{Регистрация каталогов scrollkeeper.}
\begin{description}
	\item[\%update\_scrollkeeper:] регистрация новых/обновлённых каталогов;
	\item[\%clean\_scrollkeeper:] отмена регистрации удалённых каталогов.
\end{description}

\subsection{Вспомогательные макросы \%configure.}
\begin{description}
	\item[\%\_\_libtoolize:] путь к скрипту {\it libtoolize};
	\item[\%\_configure\_script:] путь к скрипту {\it configure};
	\item[\%\_configure\_target:] целевая платформа для {\it configure};
	\item[\%\_configure\_gettext:] --without-included-gettext.
\end{description}

\subsection{Серверные макросы.}
\begin{description}
	\item[\%post\_service:] регистрация нового сервиса при установке, перезапуск при обновлении;
	\item[\%preun\_service:] отмена регистрации сервиса и его выключение при удалении.
\end{description}

\subsection{Макросы, определяющие некоторые аспекты packaging policy.}
\begin{description}
	\item[\%buildroot:] значение {\it BuildRoot};
	\item[\%\_defattr:] атрибуты файлов и каталогов по умолчанию для каждой секции {\it \%files} и для каждого файла,
	включаемого в таких секциях;
	\item[\%\_cleanup\_method:] метод, используемый при удалении ненужных файлов в секции {\it \%install};
	\item[\%\_compress\_method:] метод, используемый при сжатии документации в секции {\it \%install};
	\item[\%\_findprov\_default\_method:] метод, используемый по умолчанию при поиске предоставляемых зависимостей;
	\item[\%\_findreq\_default\_method:] метод, используемый по умолчанию при поиске требуемых зависимостей;
	\item[\%\_fixup\_method:] метод, используемый при исправлении файлов в секции {\it \%install};
	\item[\%\_verify\_elf\_method:] метод, используемый при проверке {\it ELF}-файлов в секции {\it \%install};
	\item[\%\_strip\_method:] метод, используемый при обработке {\it ELF}-файлов в секции {\it \%install};
	\item[\%\_perl\_req\_method]: метод, используемый при поиске зависимостей в perl-скриптах;
	\item[\%\_findprov\_lib\_path]: список каталогов, в которых производится поиск {\it ELF}-файлов на
	наличие предоставляемых зависимостей;
	\item[\%\_\{cleanup,compress,fixup,strip,verify\_elf,findreq,findprov\}\_topdir:]
	точка начала поиска файлов, обрабатываемых соответствующим методом;
	\item[\%\_\{cleanup,compress,fixup,strip,verify\_elf,findreq,findprov\}\_skiplist:]
	список шаблонов файлов, которые будут пропущены при обработке соответствующим методом;
	\item[\%\_unpackaged\_files\_terminate\_build:]
	параметр, определяющий влияние неупакованных файлов на результат сборки;
	\item[\%set\_\{cleanup,compress,fixup,strip,verify\_elf,perl\_req\}\_method:]
	изменить значение соответствующего макроса;
	\item[\%set\_\{cleanup,compress,fixup,strip,verify\_elf,findreq,findprov\}\_\{topdir,skiplist\}:]
	изменить значение соответствующего макроса;
	\item[\%add\_\{cleanup,compress,fixup,strip,verify\_elf,findreq,findprov\}\_skiplist:]
	добавить значение в соответствующий список;
	\item[\%\{add,set\}\_findprov\_lib\_path:]
	добавить значение в список / изменить список каталогов, в которых производится поиск
	{\it ELF}-файлов на наличие предоставляемых зависимостей;
	\item[\%\_keep\_libtool\_files:]
	определяет, подлежат ли автоматическому удалению ненужные вспомогательные файлы libtool'а.

\end{description}

\subsection{Вызов вспомогательных программ.}
\begin{description}
	\item[\%find\_lang:] вызов {\it /usr/lib/rpm/find-lang}
	\item[\%strip\_executable:] вызов {\it /usr/lib/rpm/brp-strip} для обработки {\it ELF executables};
	\item[\%strip\_relocatable:] вызов {\it /usr/lib/rpm/brp-strip} для обработки {\it ELF relocatables};
	\item[\%strip\_shared:] вызов {\it /usr/lib/rpm/brp-strip} для обработки {\it ELF shared objects};
	\item[\%strip\_static:] вызов {\it /usr/lib/rpm/brp-strip} для обработки {\it ELF ar archives};
	\item[\%cleanup\_build:] вызов {\it /usr/lib/rpm/brp-cleanup};
	\item[\%compress\_docs:] вызов {\it /usr/lib/rpm/brp-compress};
	\item[\%strip\_binaries:] вызов {\it /usr/lib/rpm/brp-strip};
	\item[\%clean\_buildroot:] выполнение {\it rm -rf \%buildroot}, если {\it \%buildroot} не указывает на настоящий /.
\end{description}

\subsection{Управление процессом сборки.}
\begin{description}
	\item[\%\_rpmbuild\_clean:] управляет включённым по умолчанию для
		{\it rpmbuild --rebuild} и {\it rpmbuild --recompile} режимом удаления
		промежуточных файлов и каталогов.
	\item[\%\_rpmbuild\_packagesource:] управляет выключенным по умолчанию для
		{\it rpmbuild --rebuild} и {\it rpmbuild --recompile} режимом создания
		пакетов с исходным кодом.
	\item[\%buildmulti:] альтернативная директива {\it \%build} для случая,
		когда в секции {\it \%build} происходит заполнение {\it \%buildroot}.
		Вообще говоря, такой техники стоит избегать во всех случаях, когда
		это возможно;
	\item[\%\_deps\_optimization:] управляет включённым по умолчанию
		режимом оптимизации зависимостей;
	\item[\%\_build\_lang:] значение переменных LANG, LANGUAGE и LC\_ALL;
	\item[\%\_build\_display:] значение переменной DISPLAY;
	\item[\%\_build\_xauthority:] значение переменной XAUTHORITY;
	\item[\%\_\_ccache\_cc:] значение переменной CCACHE\_CC;
	\item[\%\_\_ccache\_dir:] значение переменной CCACHE\_DIR.
\end{description}

\subsection{Версии некоторых установленных в системе пакетов.}
\begin{description}
	\item[glibc:] {\it \%\_\_glibc\_version}, {\it \%\_\_glibc\_version\_major}, {\it \%\_\_glibc\_version\_minor};
	\item[gcc:] {\it \%\_\_gcc\_version}, {\it \%\_\_gcc\_version\_major}, {\it \%\_\_gcc\_version\_minor}, {\it \%\_\_gcc\_version\_base};
	\item[python:] {\it \%\_\_python\_version};
	\item[\%get\_version:] версия указанного пакета;
	\item[\%get\_release:] релиз указанного пакета;
	\item[\%get\_serial:] serial указанного пакета;
	\item[\%add\_serial:] serial указанного пакета в виде, пригодном для включения в {\it spec}-файл;
	\item[\%get\_SVR:] тройка значений {\it serial:version-release} указанного пакета;
	\item[\%get\_NSVR:] четвёрка значений {\it name-serial:version-release} указанного пакета;
	\item[\%get\_dep:] строка вида {\it name >= serial:version-release}, построенная по указанному пакету;

\end{description}
Эти макросы, как правило, используются в пакетах, сборка которых возможна
с различными версиями этих программ, если эти версии правильно учитывать.

\subsection{Управление процессом обработки {\it spec}-файлов.}
\begin{description}
	\item[\%def\_with, \%def\_without, \%def\_enable, \%def\_disable:] установка значения макросов условия
	с указанием значения по умолчанию;
	\item[\%check\_def:] проверка макросов условия на непротиворечивость;
	\item[\%subst\_with, \%subst\_enable:] подстановка значения макросов условия;

	\item[\%defined, \%undefined:] проверка на существование макроса;
	\item[\%with, \%without, \%enabled, \%disabled:] проверка значения макросов условия;

	\item[\%ifdef, \%ifndef:] ветвление по факту существования макроса;
	\item[\%if\_with, \%if\_without, \%if\_enabled, \%if\_disabled:] ветвление по значению макросов условия;
\end{description}

\subsection{Прочие макросы.}
\begin{description}
	\item[\%intel:] список архитектур {\it intel}, совместимых с {\it i386};
	\item[\%amd:] список архитектур {\it amd}, совместимых с {\it i386};
	\item[\%ix86:] список всех архитектур, совместимых с {\it i386};
	\item[компоненты макроса \%packager:] {\it \%packagerName}, {\it \%packagerAddress};
	\item[\%\_internal\_gpg\_path:] путь к связке ключей ALT Linux Team.
\end{description}

\section{Новыe параметры rpm.}
\begin{description}
	\item[-bE:] новый режим работы {\it RPM}, при котором происходит только подстановка макросов;
	\item[-bM:] новый режим работы {\it RPM}, при котором происходит только вывод списка использованных макросов;
	\item[--nowait-lock:] не блокировать процесс, если база данных {\it RPM} занята;
	\item[--fancypercent:] отображать дополнительную информацию
		о процентах проделанной работы при установке/обновлении пакетов;
	\item[--nopatch:] не включать указанные патчи в исходный пакет;
	\item[--nosource:] не включать указанные исходники в исходный пакет;
	\item[--lastchange:] вывести информацию о последнем изменении пакета;
	\item[--changes-since:]  вывести информацию обо всех изменениях пакета, начиная с указанной версии.
\end{description}

\section{Новые возможности rpm по сборке пакетов.}

По окончании выполнения секции {\it \%install} {\it RPM} выполняет ряд действий:
\begin{itemize}
	\item удаление ненужных файлов и каталогов;
	\item исправление прав доступа к файлам и каталогам;
	\item упаковка документации;
	\item удаление отладочной информации;
	\item коррекция символических ссылок на разделяемые библиотеки;
	\item перекомпиляция python-модулей.
\end{itemize}

\subsection{Автоматическое удаление ненужных файлов.}
Все файлы и каталоги, подпадающие под правило определения ненужных файлов и каталогов, удаляются.
В частности, по умолчанию подлежат удалению
\begin{itemize}
	\item файлы с именами {\it DEADJOE}, {\it .SUMS}, {\it TAGS}, {\it core};
	\item файлы, заканчивающиеся на {\it ~}, {\it .orig}, {\it .rej}, {\it .bak};
	\item каталоги с именем {\it CVS};
	\item ненужные вспомогательные файлы libtool'а, заканчивающиеся на {\it .la}.
\end{itemize}

Поддерживаются следующие методы определения файлов и каталогов, подлежащих удалению:
\begin{itemize}
	\item {\it none, skip}: поиска и удаления не производится;
	\item {\it auto}: метод по умолчанию, определённый в файле {\it /usr/lib/rpm/brp-cleanup};
	\item {\it *}: специальный метод; переданное значение используется в качестве имени программы,
	которая будет вызвана для поиска и удаления ненужных файлов.
\end{itemize}
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса
{\it \%\_cleanup\_method}; значение по умолчанию для этого макроса - {\it auto}.

\subsection{Автоматический поиск и исправление конфигурационных файлов, используемых прежде всего при разработке ПО.}
Поддерживаются следующие типы файлов, подлежащих проверке и исправлению:
\begin{itemize}
	\item {\it none, skip}: поиска и проверки не производится;
	\item {\it binconfig}: поиск и обработка shell-скриптов по шаблону {\it /usr/bin/*-config};
	\item {\it pkgconfig}: поиск и обработка файлов по шаблону {\it /usr/lib/pkgconfig/*.pc};
	\item {\it libtool}: поиск и обработка .la-файлов;
\end{itemize}
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса
{\it \%\_fixup\_method}; значение по умолчанию для этого макроса - {\it binconfig pkgconfig libtool}.

\subsection{Автоматическое исправление прав доступа к файлам и каталогам.}
Права доступа ко всем файловым объектам, находящимся в \$RPM\_BUILD\_ROOT, проверяются и корректируются
согласно следующим правилам:
\begin{itemize}
	\item каталоги {\it /usr/share}, {\it /usr/include}, {\it /usr/X11R6/share},
	{\it /usr/X11R6/include}, {\it /usr/X11R6/man}
	со всем содержимым должны быть доступны по чтению всем пользователям;
	\item ничто из содержимого каталога {\it /usr}, за исключением {\it /usr/src},
	не должно быть доступно по записи не-владельцу, за исключением владельца файлов.
	\item никакие suid и/или sgid-файлы не должны быть доступны по чтению (и тем более по записи),
	за исключением владельца файлов.
\end{itemize}

\subsection{Автоматическое сжатие {\it man} и {\it info}-документации с поддержкой различных
методов сжатия.}
Вся документация пакета, распознаваемая как {\it man} или {\it info}-документация, по окончании
работы секции {\it \%install}, сжимается согласно выбранному методу.
Поддерживаются следующие методы сжатия:
\begin{itemize}
	\item {\it bzip2}: сжатие с помощью ``{\it bzip2 -9}'';
	\item {\it gzip}: сжатие с помощью ``{\it gzip -9n}'';
	\item {\it auto}: сжатие с помощью ``{\it gzip -9n}'' либо ``{\it bzip2 -9}''
		в зависимости от того, какой вариант окажется эффективнее;
	\item {\it none}: производится декомпрессия файлов вместо сжатия;
	\item {\it skip}: процедура сжатия пропускается полностью.
\end{itemize}
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса
{\it \%\_compress\_method}; значение по умолчанию для этого макроса - {\it auto}.
По окончании процедуры сжатия производится выравнивание ссылок, которые, возможно,
требуют коррекции в связи с изменениями имён файлов в процессе их сжатия.

\subsection{Автоматическая проверка {\it ELF}-файлов с поддержкой различных стратегий.}
Иногда в результате сборки пакета получаются {\it ELF}-файлы, содержащие неверную и/или
недопустимую информацию в некоторых записях динамической секции, таких как {\it RPATH} и {\it TEXTREL}.
Поэтому по окончании работы секции {\it \%install} проверяются все собранные {\it ELF}-файлы.
Выбор методов проверки определяется значением макроса
{\it \%\_verify\_elf\_method}, которое есть набор из следующих возможных значений:
\begin{itemize}
	\item {\it none, skip}: поиска и проверки не производится;
	\item {\it rpath=relaxed}: проверка RPATH только на наличие недопустимых элементов;
	\item {\it rpath=normal}: {\it relaxed} + проверка на наличие более чем одного элемента в {\it RPATH};
	\item {\it rpath=strict}: проверка на наличие непустого {\it RPATH}.
	\item {\it textrel=relaxed}: предупреждение о наличии записей типа TEXTREL;
	\item {\it textrel=normal, textrel=strict}: проверка на наличие записей типа TEXTREL;
\end{itemize}
Значение по умолчанию для макроса {\it \%\_verify\_elf\_method} в данный момент равно {\it normal},
что эквивалентно {\it rpath=normal,textrel=normal}.

\subsection{Автоматическое удаление отладочной информации из {\it ELF}-файлов
с поддержкой различных стратегий выбора файлов, подлежащих обработке.}
Зачастую возможно уменьшить размер получаемых в результате сборки пакета
{\it ELF}-файлов без потери качества за счёт удаления из них отладочной информации.
Поэтому по окончании работы секции {\it \%install} все {\it ELF}-файлы выбранных типов
обрабатываются программой {\it strip}. Выбор типов файлов определяется значением макроса
{\it \%\_strip\_method}, которое есть набор из следующих возможных значений:
\begin{itemize}
	\item {\it executable}: ELF executable;
	\item {\it relocatable}: ELF relocatable;
	\item {\it shared}: ELF shared object;
	\item {\it static}: ar archive.
\end{itemize}
Кроме того, есть возможность вызывать {\it strip} вручную, для этой цели предназначены
макросы {\it \%strip\_executable}, {\it \%strip\_relocatable}, {\it \%strip\_shared}, {\it \%strip\_static}.
Синтаксис этих макросов подробно изложен в ``{\it /usr/lib/rpm/brp-strip --help}''.

\subsection{Автоматическая перекомпиляция python-модулей.}
Как известно, {\it python}-модули обычно компилируют в байтовую форму для увеличения
быстродействия при последующей работе с ними. Каждый такой модуль, помимо всего прочего,
хранит время своего создания и полное имя файла, в котором должен находиться. В связи с
последним обстоятельством скомпилированные модули, созданные в результате работы секции
{\it \%install}, непригодны, ибо не могут быть использованы после установки пакета.
По этой причине теперь по окончании работы секции {\it \%install} производится перекомпиляция
всех {\it python}-модулей таким образом, чтобы их можно было использовать после установки пакета.
В качестве байт-компилятора будет использоваться программа, имя которой хранится в макросе
{\it \%\_\_python}. Обычно это {\it /usr/bin/python}, однако в некоторых случаях может потребоваться
изменить это значение на другое (например, в случае сборки пакета {\it python} или если по какой-то
причине перекомпиляция не нужна).

\subsection{Автоматический поиск требуемых и предоставляемых зависимостей.}
В дополнение к стандартному поиску зависимостей от/для разделяемых библиотек,
реализована поддержка поиска требуемых зависимостей для {\it shell} и {\it perl}-скриптов,
поиска зависимостей, определяемых наличием специальных файлов в пакете,
а также поддержка поиска предоставляемых зависимостей для {\it perl}-скриптов.

\subsection{Изменение семантики тэгов, управляющих поиском зависимостей.}
Новые возможности {\it RPM} по автоматическому поиску зависимостей при сборке пакетов
управляются, как и прежде, значениями тэгов {\it AutoReq}, {\it AutoProv} и {\it AutoReqProv}.
К стандартным значениям {\it yes}/{\it no} ({\it true}/{\it false}), таким образом, добавлены новые
возможные значения, являющиеся именами методов поиска зависимостей:
\begin{itemize}
	\item {\it lib/nolib}: включение/выключение поиска зависимостей от/для разделяемых библиотек;
	\item {\it shell/noshell}: включение/выключение поиска зависимостей в {\it shell}-скриптах;
	\item {\it perl/noperl}: включение/выключение поиска зависимостей в {\it perl}-скриптах;
	\item {\it files/nofiles}: включение/выключение поиска зависимостей, определяемых наличием специальных файлов в пакете;
	\item {\it default}: то же, что и {\it yes};
	\item {\it none},{\it off}: то же, что и {\it no};
	\item {\it all}: включение всех возможных методов поиска зависимостей.
\end{itemize}
Значением тэга может являться как один метод, так и перечисление методов.
По умолчанию, для каждого под пакета собираемого пакета {\it AutoReq} = {\it AutoProv} = {\it yes},
что на практике означает использование макросов {\it \%\_findreq\_default\_method} и
{\it \%\_findprov\_default\_method} для определения методов поиска зависимостей.

\subsection{Автоматическая очистка BuildRoot.}
Перед выполнением секции {\it \%install} и по окончании выполнения секции {\it \%clean} {\it RPM}
автоматически очищает {\it BuildRoot} с помощью макроса {\it \%clean\_buildroot}. Это значит, что
больше не нужно использовать эти ужасные ``rm -rf \$RPM\_BUILD\_ROOT''. Секция {\it \%clean}
вообще может (и должна) быть опущена, если в ней не содержится ничего, кроме этого ``rm''.
В тех редких случаях, когда в {\it spec}-файле производится заполнение {\it BuildRoot} не в секции
{\it \%install}, как это должно быть, а в секции {\it \%build}, что в принципе неправильно, можно
перенести точку очистки {\it BuildRoot} из начала секции {\it \%install} в начало секции {\it \%build},
если заменить директиву {\it \%build} на макрос {\it \%buildmulti}.

\subsection{Упрощение секции \%files.}
Ранее в начале каждой секции {\it \%files} было необходимо указывать атрибуты файлов и
каталогов создаваемых пакетов с помощью довольно однообразно используемой
директивы {\it \%defattr}. Теперь это происходит автоматически в начале каждой секции {\it \%files},
а также в начале каждого файла, включаемого в секцию {\it \%files} с помощью опции {\it -f}.
Точнее говоря, в качестве этой директивы используется значение макроса {\it \%\_defattr}.
Таким образом, прежнее использование директивы {\it \%defattr} в начале секций и файлов
следует считать упразднённым.

\subsection{Сборка пакетов привилегированным пользователем.}
То, что когда-то было необходимостью, со временем стало излишним, а порой и просто опасным.
Теперь, когда все без исключения пакеты можно (и нужно) собирать непривилегированным
пользователем во избежание риска разрушения системы и некорректной сборки,
сборка пакетов привилегированным пользователем по умолчанию запрещена. Этот запрет
можно снять путём изменения значения макроса {\it \%\_allow\_root\_build}.

\begin{thebibliography}{9}
\bibitem{wwwrpm} Официальный web-сайт rpm: http://www.rpm.org/
\bibitem{mailrpm} Список рассылки для разработчиков rpm: rpm-list{@}redhat.com
\bibitem{maxrpm} Edward C. Bailey ``Maximum RPM'' February 17, 1997.
(доступна также online-версия по адресу http://www.rpm.org/max-rpm/
и в формате PostScript по адресу http://www.rpm.org/local/maximum-rpm.ps.gz)
\end{thebibliography}

\end{document}
