rpm-build/README.ALT-ru_RU.UTF-8
Dmitry V. Levin 5e710ba046 Add fixup method: gnuconfig
Replaces all config.guess and config.sub files outside gnu-config
to symlinks leading to /usr/share/gnu-config/{config.guess,config.sub}.
2020-12-21 08:00:00 +00:00

647 lines
34 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ALT 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 и для каждого файла, включаемого в таких секциях;
%_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:
параметр, определяющий влияние неупакованных файлов на
результат сборки;
%_stripped_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-файлов;
* gnuconfig: замена файлов config.guess и config.sub на ссылки.
Какой метод будет использован в каждом конкретном случае, зависит от
значения макроса %_fixup_method; значение по умолчанию для этого
макроса - binconfig pkgconfig libtool desktop gnuconfig.
Автоматическое исправление прав доступа к файлам и каталогам.
Права доступа ко всем файловым объектам, находящимся в
$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)
_________________________________________________________________