2016-11-28 22:42:49 +03:00
ALT RPM:
2009-12-01 16:06:10 +03:00
особенности версии 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;
2011-04-05 00:28:42 +04:00
systemd:
%systemd_unitdir;
2009-12-01 16:06:10 +03:00
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 и для каждого файла, включаемого в таких секциях;
2017-10-25 06:16:59 +03:00
%_check_contents_method:
метод, используемый при проверке содержимого файлов в секции %install;
2009-12-01 16:06:10 +03:00
%_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-файлов на
наличие предоставляемых зависимостей;
2017-10-25 06:16:59 +03:00
%_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_topdir:
2009-12-01 16:06:10 +03:00
точка начала поиска файлов, обрабатываемых соответствующим
методом;
2017-10-25 06:16:59 +03:00
%_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_skiplist:
2009-12-01 16:06:10 +03:00
список шаблонов файлов, которые будут пропущены при обработке
соответствующим методом;
%_unpackaged_files_terminate_build:
параметр, определяющий влияние неупакованных файлов на
результат сборки;
2020-08-22 17:18:10 +03:00
%_stripped_files_terminate_build:
параметр, определяющий влияние стрипнутых файлов на
результат сборки;
2017-10-25 06:16:59 +03:00
%set_{check_contents,cleanup,compress,fixup,verify_{elf,info},perl_req}_method:
2009-12-01 16:06:10 +03:00
изменить значение соответствующего макроса;
2017-10-25 06:16:59 +03:00
%set_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_{topdir,skiplist}:
2009-12-01 16:06:10 +03:00
изменить значение соответствующего макроса;
2017-10-25 06:16:59 +03:00
%add_{check_contents,cleanup,compress,fixup,verify_elf,findreq,findprov}_skiplist:
2009-12-01 16:06:10 +03:00
добавить значение в соответствующий список;
%{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-файлов;
2011-05-14 01:43:39 +04:00
* desktop: поиск и обработка .desktop-файлов;
2020-12-21 11:00:00 +03:00
* gnuconfig: замена файлов config.guess и config.sub на ссылки.
2009-12-01 16:06:10 +03:00
Какой метод будет использован в каждом конкретном случае, зависит от
значения макроса %_fixup_method; значение по умолчанию для этого
2020-12-21 11:00:00 +03:00
макроса - binconfig pkgconfig libtool desktop gnuconfig.
2009-12-01 16:06:10 +03:00
Автоматическое исправление прав доступа к файлам и каталогам.
Права доступа ко всем файловым объектам, находящимся в
$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)
_________________________________________________________________