ALT RPM: особенности версии rpm-4.0.4-alt32 Dmitry V. Levin 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 : добавить указанные параметры в стандартный набор %optflags; %remove_optflags : убрать указанные параметры из стандартного набора %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 и для каждого файла, включаемого в таких секциях; %_check_contents_method: метод, используемый при проверке содержимого файлов в секции %install; %_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-файлов на наличие предоставляемых зависимостей; %_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_topdir: точка начала поиска файлов, обрабатываемых соответствующим методом; %_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_skiplist: список шаблонов файлов, которые будут пропущены при обработке соответствующим методом; %_unpackaged_files_terminate_build: параметр, определяющий влияние неупакованных файлов на результат сборки; %set_{check_contents,cleanup,compress,fixup,verify_{elf,info},perl_req}_method: изменить значение соответствующего макроса; %set_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_{topdir,skiplist}: изменить значение соответствующего макроса; %add_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_skiplist: добавить значение в соответствующий список; %{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) _________________________________________________________________