По окончании выполнения секции %install RPM выполняет ряд действий:
удаление ненужных файлов и каталогов;
исправление прав доступа к файлам и каталогам;
упаковка документации;
удаление отладочной информации;
коррекция символических ссылок на разделяемые библиотеки;
перекомпиляция python-модулей.
Все файлы и каталоги, подпадающие под правило определения ненужных файлов и каталогов, удаляются. В частности, по умолчанию подлежат удалению
файлы с именами DEADJOE, .SUMS, TAGS, core;
файлы, заканчивающиеся на ~, .orig, .rej, .bak;
каталоги с именем CVS.
Поддерживаются следующие методы определения файлов и каталогов, подлежащих удалению:
поиска и удаления не производится;
метод по умолчанию, определенный в файле /usr/lib/rpm/brp-cleanup;
специальный метод; переданное значение используется в качестве имени программы, которая будет вызвана для поиска и удаления ненужных файлов.
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_cleanup_method; значение по умолчанию для этого макроса — auto.
Поддерживаются следующие типы файлов, подлежащих проверке и исправлению:
поиска и проверки не производится;
поиск и обработка shell-скриптов по шаблону /usr/bin/*-config;
поиск и обработка файлов по шаблону /usr/lib/pkgconfig/*.pc;
поиск и обработка .la-файлов;
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_fixup_method; значение по умолчанию для этого макроса — binconfig pkgconfig libtool.
Права доступа ко всем файловым объектам, находящимся в $RPM_BUILD_ROOT, проверяются и корректируются согласно следующим правилам:
каталоги /usr/share, /usr/include, /usr/X11R6/share, /usr/X11R6/include, /usr/X11R6/man со всем содержимым должны быть доступны по чтению всем пользователям;
ничто из содержимого каталога /usr, за исключением /usr/src, не должно быть доступно по записи не-владельцу, за исключением владельца файлов.
никакие suid и/или sgid-файлы не должны быть доступны по чтению (и тем более по записи), за исключением владельца файлов.
Вся документация пакета, распознаваемая как man- или info-документация, по окончании работы секции %install, сжимается согласно выбранному методу. Поддерживаются следующие методы сжатия:
сжатие с помощью bzip2 -9;
сжатие с помощью gzip -9n;
сжатие с помощью gzip -9n либо bzip2 -9 в зависимости от того, какой вариант окажется эффективнее;
производится декомпрессия файлов вместо сжатия;
процедура сжатия пропускается полностью.
Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_compress_method; значение по умолчанию для этого макроса — auto. По окончании процедуры сжатия производится выравнивание ссылок, которые, возможно, требуют коррекции в связи с изменениями имён файлов в процессе их сжатия.
Иногда в результате сборки пакета получаются ELF-файлы, содержащие неверную и/или недопустимую информацию в некоторых секциях, таких как RPATH. Поэтому по окончании работы секции %install проверяются все собранные ELF-файлы. Выбор типов файлов определяется значением макроса %_verify_elf_method, которое есть набор из следующих возможных значений:
поиска и проверки не производится;
проверка только на наличие недопустимых элементов в RPATH;
relaxed + проверка на наличие более чем одного элемента в RPATH;
проверка на наличие непустого RPATH.
Значение по умолчанию для макроса %_verify_elf_method в данный момент равно normal.
Зачастую возможно уменьшить размер получаемых в результате сборки пакета ELF-файлов без потери качества за счёт удаления из них отладочной информации. Поэтому по окончании работы секции %install все ELF-файлы выбранных типов обрабатываются программой strip. Выбор типов файлов определяется значением макроса %_strip_method, которое есть набор из следующих возможных значений:
ELF executable;
ELF relocatable;
ELF shared object;
ar archive.
Кроме того, есть возможность вызывать strip вручную, для этой цели предназначены макросы %strip_executable, %strip_relocatable, %strip_shared, %strip_static. Синтаксис этих макросов подробно изложен в /usr/lib/rpm/brp-strip --help.
Как известно, python-модули обычно компилируют в байтовую форму для увеличения быстродействия при последующей работе с ними. Каждый такой модуль, помимо всего прочего, хранит время своего создания и полное имя файла, в котором должен находиться. В связи с последним обстоятельством скомпилированные модули, созданные в результате работы секции %install, непригодны, ибо не могут быть использованы после установки пакета. По этой причине теперь по окончании работы секции %install производится перекомпиляция всех python-модулей таким образом, чтобы их можно было использовать после установки пакета. В качестве байт-компилятора будет использоваться программа, имя которой хранится в макросе %__python. Обычно это /usr/bin/python, однако в некоторых случаях может потребоваться изменить это значение на другое (например, в случае сборки пакета python или если по какой-то причине перекомпиляция не нужна).
В дополнение к стандартному поиску зависимостей от/для разделяемых библиотек, реализована поддержка поиска требуемых зависимостей для shell- и perl-скриптов, поиска зависимостей, определяемых наличием специальных файлов в пакете, а также поддержка поиска предоставляемых зависимостей для perl-скриптов.
Новые возможности RPM по автоматическому поиску зависимостей при сборке пакетов управляются, как и прежде, значениями тэгов AutoReq, AutoProv и AutoReqProv. К стандартным значениям yes/no (true/false), таким образом, добавлены новые возможные значения, являющиеся именами методов поиска зависимостей:
включение/выключение поиска зависимостей от/для разделяемых библиотек;
включение/выключение поиска зависимостей в shell-скриптах;
включение/выключение поиска зависимостей в perl-скриптах;
включение/выключение поиска зависимостей, определяемых наличием специальных файлов в пакете;
то же, что и yes;
то же, что и no;
включение всех возможных методов поиска зависимостей.
Значением тэга может являться как один метод, так и перечисление методов. По умолчанию, для каждого подпакета собираемого пакета AutoReq = AutoProv = yes, что на практике означает использование макросов %_findreq_default_method и %_findprov_default_method для определения методов поиска зависимостей.
Перед выполнением секции %install и по окончании выполнения секции %clean RPM автоматически очищает BuildRoot с помощью макроса %clean_buildroot. Это значит, что больше не нужно использовать эти ужасные rm -rf $RPM_BUILD_ROOT. Секция %clean вообще может (и должна) быть опущена, если в ней не содержится ничего, кроме этого “rm”. В тех редких случаях, когда в spec-файле производится заполнение BuildRoot не в секции %install, как это должно быть, а в секции %build, что в принципе неправильно, можно перенести точку очистки BuildRoot из начала секции %install в начало секции %build, если заменить директиву %build на макрос %buildmulti.
Ранее в начале каждой секции %files было необходимо указывать атрибуты файлов и каталогов создаваемых пакетов с помощью довольно однообразно используемой директивы %defattr. Теперь это происходит автоматически в начале каждой секции %files, а также в начале каждого файла, включаемого в секцию %files с помощью опции -f. Точнее говоря, в качестве этой директивы используется значение макроса %_defattr. Таким образом, прежнее использование директивы %defattr в начале секций и файлов следует считать упразднённым.
То, что когда-то было необходимостью, со временем стало излишним, а порой и просто опасным. Теперь, когда все без исключения пакеты можно (и нужно) собирать непривилегированным пользователем во избежание риска разрушения системы и некорректной сборки, сборка пакетов привилегированным пользователем по умолчанию запрещена. Этот запрет можно снять путём изменения значения макроса %_allow_root_build.