Особенности написания спек файлов в ALT Linux

Материал из ALT Linux Wiki

Перейти к: навигация, поиск

Содержание

[править] Источник

Статья импортирована из ftp://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/doc/alt-packaging/rpm.tex Автор статьи Dmitry V. Levin <ldv@altlinux.ru> ALT Linux Team

На Wiki есть уже статья ALT_Packaging_HOWTO, которая актуально корректируется. Но я думаю, данная статья будет тоже интересна для прочтения. --HihinRuslan 10:44, 12 июня 2016 (MSK)

[править] Обоснование

При разработке изменений и дополнений к 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;
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_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
 : список каталогов, в которых производится поиск 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,perl_req}_method
изменить значение соответствующего макроса;
 %set_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_{topdir,skiplist}
изменить значение соответствующего макроса;
 %add_{cleanup,compress,fixup,strip,verify_elf,findreq,findprov}_skiplist
добавить значение в соответствующий список;
например %add_findreq_skiplist %_bindir/some*.sh добавляет в исключения для findreq все файлы .sh в каталоге /usr/bin
 %{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;
  • ненужные вспомогательные файлы 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-файлов;

Какой метод будет использован в каждом конкретном случае, зависит от значения макроса %_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 и 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.

[править] Автоматическое удаление отладочной информации из 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.

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


 
Личные инструменты