ALT Linux RPM: особенности версии rpm-4.0.4-alt32

Дмитрий Левин

Преобразование оригинального текста в DocBook: Юрий Зотов

Новые тэги

BuildHost

С помощью этого тэга можно переопределить значение hostname, которое RPM помещает в заголовок каждого пакета. По умолчанию, как и ранее, используется значение, возвращаемое uname(2).

Устаревшие тэги

BuildRoot

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

Новые макросы

Встроенные макросы

%homedir

домашний каталог пользователя, вызывающего этот макрос;

%homedir{user}

домашний каталог пользователя user;

Макросы для часто используемых каталогов

manpages: %_man1dir, %_man2dir, %_man3dir, %_man4dir, %_man5dir, %_man6dir, %_man7dir, %_man8dir, %_man9dir;

X11R6: %_x11dir, %_x11bindir, %_x11libdir, %_x11includedir, %_x11mandir, %_x11datadir, %_x11fontsdir;

лицензии: %_licensedir;

меню: %_menudir, %_iconsdir, %_miconsdir, %_liconsdir;

service: %_initdir;

control: %_controldir;

emacs: %_emacslispdir;

pam: %_pam_modules_dir;

tcl: %_tcllibdir, %_tcldatadir;

kernel: %patches_dir, %kernel_srcdir;

ruby: %ruby_archdir, %ruby_libdir, %ruby_sitearchdir, %ruby_sitelibdir;

другие системные: %_cachedir, %_lockdir, %_logdir, %_spooldir.

Управление опциями компилятора gcc

%add_optflags options

добавить указанные параметры в стандартный набор %optflags;

%remove_optflags options

убрать указанные параметры из стандартного набора %optflags;

%optflags_core

базовые параметры;

%_optlevel

уровень оптимизации;

%optflags_optimization

параметры, отвечающие за оптимизацию, кроме архитектурно-зависимых;

%optflags_warnings

warning options;

%optflags_debug

debugging options;

%optflags_shared

параметры, применяемые для создания relocatable файлов;

%optflags_nocpp

параметры, отключающие поддержку C++ exceptions и C++ RTTI;

%optflags_notraceback

-fomit-frame-pointer;

%optflags_fastmath

-ffast-math;

%optflags_strict

-fstrict-aliasing;

%optflags_kernel

параметры, используемые при компиляции ядра и его модулей.

По умолчанию, стандартный набор %optflags состоит из %optflags_core %optflags_warnings %optflags_optimization.

Выбор версии используемых GCC

\%set\_gcc\_version

выбор версии GCC из множества установленных в системе.

По умолчанию используется /usr/bin/i586-alt-linux-gcc.

Выбор версии используемых GNU Autotools

\%set\_autoconf\_version

выбор версии autoconf из множества установленных в системе;

\%set\_automake\_version

выбор версии automake из множества установленных в системе;

\%set\_libtool\_version

выбор версии libtool из множества установленных в системе.

По умолчанию используется версия default.

Макросы-надстройки над утилитой make

%__nprocs

число процессоров, доступных для сборки с помощью %make_build;

%make_build

вызов make с параметром, обеспечивающим оптимальную параллельную сборку в данной среде;

%make_install

вызов make c инициализацией переменной INSTALL, что в случае корректной реализации Makefile-ов пакета позволяет сохранить дату последней модификации файлов, что особенно важно для документации;

%makeinstall

%make_install инициализация других переменных, используемых многими Makefile-ами install

Регистрация разделяемых библиотек

%post_ldconfig , %post_ldconfig_lib

регистрация новых/обновлённых библиотек;

%post_ldconfig_sys

регистрация новых/обновлённых системных библиотек (которые могут быть использованы в chroot'ах);

%postun_ldconfig

отмена регистрации удалённых библиотек.

Регистрация документации в формате info

%install_info

регистрация новых/обновлённых info-страниц;

%uninstall_info

отмена регистрации удалённых info-страниц.

Регистрация меню

%update_menus

регистрация новых/обновлённых меню;

%clean_menus

отмена регистрации удалённых меню.

Регистрация оконных менеджеров

\%update\_wms

регистрация новых/обновлённых описаний оконных менеджеров;

\%clean\_wms

отмена регистрации удалённых описаний оконных менеджеров.

Регистрация каталогов scrollkeeper

%update_scrollkeeper

регистрация новых/обновлённых каталогов;

%clean_scrollkeeper

отмена регистрации удалённых каталогов.

Вспомогательные макросы %configure

%__libtoolize

путь к скрипту libtoolize;

%_configure_script

путь к скрипту configure;

%_configure_target

целевая платформа для configure;

%_configure_gettext

--without-included-gettext.

Серверные макросы

%post_service

регистрация нового сервиса при установке, перезапуск при обновлении;

%preun_service

отмена регистрации сервиса и его выключение при удалении.

Макросы, определяющие некоторые аспекты packaging policy

%buildroot

значение BuildRoot;

%_defattr

атрибуты файлов и каталогов по умолчанию для каждой секции %files и для каждого файла, включаемого в таких секциях;

%_cleanup_method

метод, используемый при удалении ненужных файлов в секции %install;

%_compress_method

метод, используемый при сжатии документации в секции %install;

%_findprov_default_method

метод, используемый по умолчанию при поиске предоставляемых зависимостей;

%_findreq_default_method

метод, используемый по умолчанию при поиске требуемых зависимостей;

%_fixup_method

метод, используемый при исправлении файлов в секции %install;

%_verify_elf_method

метод, используемый при проверке ELF-файлов в секции %install;

%_strip_method

метод, используемый при обработке ELF-файлов в секции %install;

%\_perl\_req\_method

метод, используемый при поиске зависимостей в perl-скриптах;

%\_findprov\_lib\_path

список каталогов, в которых производится поиск {\it ELF}-файлов на наличие предоставляемых зависимостей;

%_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_topdir

точка начала поиска файлов, обрабатываемых соответствующим методом;

%_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_skiplist

список шаблонов файлов, которые будут пропущены при обработке соответствующим методом;

%\_unpackaged\_files\_terminate\_build

параметр, определяющий влияние неупакованных файлов на результат сборки;

%set_{cleanup,compress,fixup,strip,verify_elf}_method

изменить значение соответствующего макроса;

%set_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_{topdir,skiplist}

изменить значение соответствующего макроса;

%add_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_skiplist

добавить значение в соответствующий список;

%\{add,set\}\_findprov\_lib\_path

добавить значение в список / изменить список каталогов, в которых производится поиск ELF-файлов на наличие предоставляемых зависимостей;

%\_keep\_libtool\_files

определяет, подлежат ли автоматическому удалению ненужные вспомогательные файлы libtool'а.

Вызов вспомогательных программ

%find_lang

вызов /usr/lib/rpm/find-lang

%strip_executable

вызов /usr/lib/rpm/brp-strip для обработки ELF executables;

%strip_relocatable

вызов /usr/lib/rpm/brp-strip для обработки ELF relocatables;

%strip_shared

вызов /usr/lib/rpm/brp-strip для обработки ELF shared objects;

%strip_static

вызов /usr/lib/rpm/brp-strip для обработки ELF ar archives;

%cleanup_build

вызов /usr/lib/rpm/brp-cleanup;

%compress_docs

вызов /usr/lib/rpm/brp-compress;

%strip_binaries

вызов /usr/lib/rpm/brp-strip;

%clean_buildroot

выполнение rm -rf %buildroot, если %buildroot не указывает на настоящий /.

Управление процессом сборки

%\_rpmbuild\_clean

управляет включённым по умолчанию для rpmbuild --rebuild и rpmbuild --recompile режимом удаления промежуточных файлов и каталогов.

%\_rpmbuild\_packagesource

управляет выключенным по умолчанию для rpmbuild --rebuild и rpmbuild --recompile режимом создания пакетов с исходным кодом.

%buildmulti

альтернативная директива %build для случая, когда в секции %build происходит заполнение %buildroot. Вообще говоря, такой техники стоит избегать во всех случаях, когда это возможно;

%\_deps\_optimization

управляет включённым по умолчанию режимом оптимизации зависимостей;

%_build_lang

значение переменных LANG, LANGUAGE и LC_ALL;

%_build_display

значение переменной DISPLAY;

%_build_xauthority

значение переменной XAUTHORITY;

%__ccache_cc

значение переменной CCACHE_CC;

%__ccache_dir

значение переменной CCACHE_DIR;

Версии некоторых установленных в системе пакетов

glibc: %__glibc_version, %__glibc_version_major, %__glibc_version_minor;

gcc: %__gcc_version, %__gcc_version_major, %__gcc_version_minor, %__gcc_version_base

python: %__python_version

%get_version

версия указанного пакета;

%get_release

релиз указанного пакета;

%get_serial

serial указанного пакета;

%add_serial

serial указанного пакета в виде, пригодном для включения в spec-файл;

%get_SVR

тройка значений serial:version-release указанного пакета;

%get_NSVR

четвёрка значений name-serial:version-release указанного пакета;

%get_dep

строка вида name >= serial:version-release, построенная по указанному пакету;

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

Управление процессом обработки spec-файлов

%def_with, %def_without, %def_enable, %def_disable

установка значения макросов условия с указанием значения по умолчанию;

%check_def

проверка макросов условия на непротиворечивость;

%subst_with, %subst_enable

подстановка значения макросов условия;

%defined, %undefined

проверка на существование макроса;

%with, %without, %enabled, %disabled

проверка значения макросов условия;

%ifdef, %ifndef

ветвление по факту существования макроса;

%if_with, %if_without, %if_enabled, %if_disabled

ветвление по значению макросов условия;

Прочие макросы

%intel

список архитектур Intel™, совместимых с i386;

%amd

список архитектур AMD™, совместимых с i386;

%ix86

список всех архитектур, совместимых с i386;

компоненты макроса %packager

%packagerName, %packagerAddress

%_internal_gpg_path

путь к связке ключей ALT Linux Team.

Новыe параметры rpm

-bE

новый режим работы RPM, при котором происходит только подстановка макросов;

-bM

новый режим работы RPM, при котором происходит только вывод списка использованных макросов;

--nowait-lock

не блокировать процесс, если база данных RPM занята;

--fancypercent

отображать дополнительную информацию о процентах проделанной работы при установке/обновлении пакетов;

--nopatch

не включать указанные патчи в исходный пакет;

--nosource

не включать указанные исходники в исходный пакет;

--lastchange

вывести информацию о последнем изменении пакета;

--changes-since

вывести информацию обо всех изменениях пакета, начиная с указанной версии.

Новые возможности rpm по сборке пакетов

По окончании выполнения секции %install RPM выполняет ряд действий:

  • удаление ненужных файлов и каталогов;

  • исправление прав доступа к файлам и каталогам;

  • упаковка документации;

  • удаление отладочной информации;

  • коррекция символических ссылок на разделяемые библиотеки;

  • перекомпиляция python-модулей.

Автоматическое удаление ненужных файлов

Все файлы и каталоги, подпадающие под правило определения ненужных файлов и каталогов, удаляются. В частности, по умолчанию подлежат удалению

  • файлы с именами DEADJOE, .SUMS, TAGS, core;

  • файлы, заканчивающиеся на ~, .orig, .rej, .bak;

  • каталоги с именем CVS.

Поддерживаются следующие методы определения файлов и каталогов, подлежащих удалению:

none, skip

поиска и удаления не производится;

auto

метод по умолчанию, определенный в файле /usr/lib/rpm/brp-cleanup;

*

специальный метод; переданное значение используется в качестве имени программы, которая будет вызвана для поиска и удаления ненужных файлов.

Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_cleanup_method; значение по умолчанию для этого макроса  — auto.

Автоматический поиск и исправление конфигурационных файлов, используемых прежде всего при разработке ПО

Поддерживаются следующие типы файлов, подлежащих проверке и исправлению:

none, skip

поиска и проверки не производится;

binconfig

поиск и обработка shell-скриптов по шаблону /usr/bin/*-config;

pkgconfig

поиск и обработка файлов по шаблону /usr/lib/pkgconfig/*.pc;

libtool

поиск и обработка .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-документации с поддержкой различных методов сжатия

Вся документация пакета, распознаваемая как man- или info-документация, по окончании работы секции %install, сжимается согласно выбранному методу. Поддерживаются следующие методы сжатия:

bzip2

сжатие с помощью bzip2 -9;

gzip

сжатие с помощью gzip -9n;

auto

сжатие с помощью gzip -9n либо bzip2 -9 в зависимости от того, какой вариант окажется эффективнее;

none

производится декомпрессия файлов вместо сжатия;

skip

процедура сжатия пропускается полностью.

Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_compress_method; значение по умолчанию для этого макроса  — auto. По окончании процедуры сжатия производится выравнивание ссылок, которые, возможно, требуют коррекции в связи с изменениями имён файлов в процессе их сжатия.

Автоматическая проверка ELF-файлов с поддержкой различных стратегий

Иногда в результате сборки пакета получаются ELF-файлы, содержащие неверную и/или недопустимую информацию в некоторых секциях, таких как RPATH. Поэтому по окончании работы секции %install проверяются все собранные ELF-файлы. Выбор типов файлов определяется значением макроса %_verify_elf_method, которое есть набор из следующих возможных значений:

none, skip

поиска и проверки не производится;

rpath=relaxed

проверка RPATH только на наличие недопустимых элементов в RPATH;

rpath=normal

relaxed + проверка на наличие более чем одного элемента в RPATH;

rpath=strict

проверка на наличие непустого RPATH.

textrel=relaxed

предупреждение о наличии записей типа TEXTREL;

textrel=normal, textrel=strict

проверка на наличие записей типа TEXTREL.

Значение по умолчанию для макроса %_verify_elf_method в данный момент равно normal, что эквивалентно rpath=normal,textrel=normal.

Автоматическое удаление отладочной информации из ELF-файлов с поддержкой различных стратегий выбора файлов, подлежащих обработке

Зачастую возможно уменьшить размер получаемых в результате сборки пакета ELF-файлов без потери качества за счёт удаления из них отладочной информации. Поэтому по окончании работы секции %install все ELF-файлы выбранных типов обрабатываются программой strip. Выбор типов файлов определяется значением макроса %_strip_method, которое есть набор из следующих возможных значений:

executable

ELF executable;

relocatable

ELF relocatable;

shared

ELF shared object;

static

ar archive.

Кроме того, есть возможность вызывать strip вручную, для этой цели предназначены макросы %strip_executable, %strip_relocatable, %strip_shared, %strip_static. Синтаксис этих макросов подробно изложен в /usr/lib/rpm/brp-strip --help.

Автоматическая перекомпиляция python-модулей

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

Автоматический поиск требуемых и предоставляемых зависимостей

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

Изменение семантики тэгов, управляющих поиском зависимостей

Новые возможности RPM по автоматическому поиску зависимостей при сборке пакетов управляются, как и прежде, значениями тэгов AutoReq, AutoProv и AutoReqProv. К стандартным значениям yes/no (true/false), таким образом, добавлены новые возможные значения, являющиеся именами методов поиска зависимостей:

lib/nolib

включение/выключение поиска зависимостей от/для разделяемых библиотек;

shell/noshell

включение/выключение поиска зависимостей в shell-скриптах;

perl/noperl

включение/выключение поиска зависимостей в perl-скриптах;

files/nofiles

включение/выключение поиска зависимостей, определяемых наличием специальных файлов в пакете;

default

то же, что и yes;

none, off

то же, что и no;

all

включение всех возможных методов поиска зависимостей.

Значением тэга может являться как один метод, так и перечисление методов. По умолчанию, для каждого подпакета собираемого пакета AutoReq = AutoProv = yes, что на практике означает использование макросов %_findreq_default_method и %_findprov_default_method для определения методов поиска зависимостей.

Автоматическая очистка BuildRoot

Перед выполнением секции %install и по окончании выполнения секции %clean RPM автоматически очищает BuildRoot с помощью макроса %clean_buildroot. Это значит, что больше не нужно использовать эти ужасные rm -rf $RPM_BUILD_ROOT. Секция %clean вообще может (и должна) быть опущена, если в ней не содержится ничего, кроме этого «rm». В тех редких случаях, когда в spec-файле производится заполнение BuildRoot не в секции %install, как это должно быть, а в секции %build, что в принципе неправильно, можно перенести точку очистки BuildRoot из начала секции %install в начало секции %build, если заменить директиву %build на макрос %buildmulti.

Упрощение секции %files

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

Сборка пакетов привилегированным пользователем

То, что когда-то было необходимостью, со временем стало излишним, а порой и просто опасным. Теперь, когда все без исключения пакеты можно (и нужно) собирать непривилегированным пользователем во избежание риска разрушения системы и некорректной сборки, сборка пакетов привилегированным пользователем по умолчанию запрещена. Этот запрет можно снять путём изменения значения макроса %_allow_root_build.

Литература

[wwwrpm] Официальный web-сайт rpm: http://www.rpm.org/ .

[mailrpm] Список рассылки для разработчиков rpm: rpm-list{@}redhat.com .

[maxrpm] Edward Bailey. February 17, 1997. Maximum RPM, (доступна также online-версия по адресу http://www.rpm.org/max-rpm/ и в формате PostScript по адресу http://www.rpm.org/local/maximum-rpm.ps.gz).