\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 \\ 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 :] добавить указанные параметры в стандартный набор \%optflags; \item[\%remove\_optflags :] убрать указанные параметры из стандартного набора \%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}