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

                     Dmitry V. Levin <ldv@altlinux.org>

                               ALT Linux Team

                                  Обоснование

   При разработке изменений и дополнений к RPM решались следующие задачи:

   Обеспечить желаемую функциональность:
          наши  пакеты  должны  отвечать определённым правилам, о которых
          пойдёт  речь  несколько позже. Для этого надо, чтобы spec-файлы
          обеспечивали выполнение этих правил.

   Помочь разработчику:
          так  как  spec-файлы  все  ещё  пишут  люди, то их работу нужно
          свести  к тому минимуму, который, собственно, и требует участия
          человека.  Разработчик не должен копировать блоки кода из файла
          в  файл, ибо эта неинтеллектуальная работа отнимает массу сил и
          чревата  ошибками.  Для  этого  есть макросы. Если какой-то код
          появляется  в  разных  spec-файлах  более  одного раза, то надо
          написать макрос(ы).

                                  Новые тэги.

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;

   альтернативы:
          %_altdir;

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

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

   service:
          %_initdir;

   systemd:
          %systemd_unitdir;

   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:
          параметры, применяемые для порождения корректного кода для DSO;

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

   %optflags_notraceback:
          -fomit-frame-pointer;

   %optflags_fastmath:
          -ffast-math;

   %optflags_strict:
          -fstrict-aliasing.

   По  умолчанию, стандартный набор %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''.

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

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

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

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

   %_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;

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

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

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

   %_{cleanup,compress,fixup,verify_elf,findreq,findprov}_topdir:
          точка  начала  поиска  файлов,  обрабатываемых  соответствующим
          методом;

   %_{cleanup,compress,fixup,verify_elf,findreq,findprov}_skiplist:
          список  шаблонов  файлов, которые будут пропущены при обработке
          соответствующим методом;

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

   %set_{cleanup,compress,fixup,verify_{elf,info},perl_req}_method:
          изменить значение соответствующего макроса;

   %set_{cleanup,compress,fixup,verify_elf,findreq,findprov}_{topdi
          r,skiplist}:
          изменить значение соответствующего макроса;

   %add_{cleanup,compress,fixup,verify_elf,findreq,findprov}_skipli
          st:
          добавить значение в соответствующий список;

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

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

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

   %find_lang:
          вызов /usr/lib/rpm/find-lang

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

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

   %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;

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

   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, .cvsignore;
     * файлы, заканчивающиеся на  , .orig, .rej, .bak;
     * каталоги с именем CVS;
     * ненужные вспомогательные файлы libtool'а, заканчивающиеся на .la.

   Поддерживаются   следующие  методы  определения  файлов  и  каталогов,
   подлежащих удалению:
     * 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-файлов;
     * desktop: поиск и обработка .desktop-файлов;

   Какой  метод  будет использован в каждом конкретном случае, зависит от
   значения  макроса  %_fixup_method;  значение  по  умолчанию  для этого
   макроса - binconfig pkgconfig libtool desktop.

Автоматическое исправление прав доступа к файлам и каталогам.

   Права    доступа    ко   всем   файловым   объектам,   находящимся   в
   $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 и TEXTREL. Поэтому по окончании
   работы  секции  %install  проверяются  все  собранные ELF-файлы. Выбор
   методов  проверки  определяется значением макроса %_verify_elf_method,
   которое есть набор из следующих возможных значений:
     * none, skip: поиска и проверки не производится;
     * rpath=relaxed:  проверка  RPATH  только  на  наличие  недопустимых
       элементов;
     * rpath=normal:  relaxed  +  проверка  на  наличие  более чем одного
       элемента в RPATH;
     * rpath=strict: проверка на наличие непустого RPATH.
     * textrel=relaxed: предупреждение о наличии записей типа TEXTREL;
     * textrel=normal,  textrel=strict:  проверка на наличие записей типа
       TEXTREL;

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

Автоматическая перекомпиляция 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.

Bibliography

   1
          Официальный web-сайт rpm: http://www.rpm.org/
   2
          Список рассылки для разработчиков rpm: rpm-list@redhat.com
   3
          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)
     _________________________________________________________________
