<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.rosa.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA</id>
	<title>Политика оформления библиотек - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.rosa.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9F%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA"/>
	<link rel="alternate" type="text/html" href="http://wiki.rosa.ru/index.php?title=%D0%9F%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA&amp;action=history"/>
	<updated>2026-05-09T21:47:13Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://wiki.rosa.ru/index.php?title=%D0%9F%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA&amp;diff=213&amp;oldid=prev</id>
		<title>Survolog: Создание для восстановления из предыдущей wiki</title>
		<link rel="alternate" type="text/html" href="http://wiki.rosa.ru/index.php?title=%D0%9F%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA&amp;diff=213&amp;oldid=prev"/>
		<updated>2025-04-09T13:36:17Z</updated>

		<summary type="html">&lt;p&gt;Создание для восстановления из предыдущей wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Правила составления имён ==&lt;br /&gt;
Библиотеки в &amp;lt;code&amp;gt;/usr/lib&amp;lt;/code&amp;gt; и в &amp;lt;code&amp;gt;file|/lib&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;должны быть упакованы отдельно&amp;#039;&amp;#039;&amp;#039; в специальный библиотечный пакет с именем, содержащим название основной библиотеки и major (или soname, см. далее). Эти пакеты &amp;lt;b&amp;gt;не должны содержать никаких бинарных файлов&amp;lt;/b&amp;gt;, которые должны быть в другом пакете. Пакеты могут содержать другие файлы (например, документацию или лицензию) при условии, что эти файлы установлены по адресу, специфичному для пакета (например, &amp;lt;code&amp;gt;libfoo2&amp;lt;/code&amp;gt; может установить что-то в &amp;lt;code&amp;gt;/usr/share/doc/libfoo2/&amp;lt;/code&amp;gt;). Цель состоит в том, чтобы установить &amp;lt;code&amp;gt;libfoo1&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;libfoo2&amp;lt;/code&amp;gt; в одну систему.&lt;br /&gt;
&lt;br /&gt;
Прежде всего фундаментально, что исходные rpm сохраняют одно имя без какого-либо major номера, так что git репозиторий содержит только одну ветку каждого пакета.&lt;br /&gt;
&lt;br /&gt;
Когда дистрибутив должен иметь две версии одной библиотеки одновременно (например, qt1 и qt2), то исходные rpm будут разделены, чтобы мы могли включить обе версии в дистрибутив в виде двух разных, независимо поддерживаемых пакетов.&lt;br /&gt;
&lt;br /&gt;
Вот общий пример: следующее происходит, когда библиотека идёт с бинарными или конфигурационными файлами или какими-либо ещё, которые не вписываются ни в основной пакет библиотеки (где должны быть только библиотеки), ни в devel пакет (где должны быть заголовочные и devel библиотеки, такие как &amp;lt;i&amp;gt;.so&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;.a&amp;lt;/i&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* Исходный пакет:&lt;br /&gt;
** foo-2.3.4-4-rosa2012.src.rpm&lt;br /&gt;
&lt;br /&gt;
* BБинарные пакеты:&lt;br /&gt;
** foo-2.3.4-4-rosa2012.arch.rpm &lt;br /&gt;
** libfoo2-2.3.4-4-rosa2012.arch.rpm&lt;br /&gt;
** libfoo-devel-2.3.4-4-rosa2012.arch.rpm&lt;br /&gt;
&lt;br /&gt;
Если foo-2.3.4-4-rosa2012.src.rpm создаёт несколько библиотек, то эти библиотеки должны быть упакованы в отдельные файлы: libfoo2-2.3.4-4-rosa2012.arch.rpm, libbar2-2.3.4-4-rosa2012.arch.rpm и т.д. Однако devel файлы могут быть собраны в один пакет. Имя такого пакета может начинаться с lib, однако для 32-битных и 64-битных пакетов желательно иметь разные имена (например, foo-devel и foo64-devel).&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Обоснование:&amp;#039;&amp;#039;&amp;#039; -devel пакеты не устанавливаются пользователем, поэтому разделение таких пакетов не влияет на пользователя, но может усложнить жизнь разработчику. Отдельные имена для 32-битных и 64-битных -devel пакетов позволяют устанавливать пакеты обеих архитектур в одной системе.&lt;br /&gt;
&lt;br /&gt;
Если апстримное имя само по себе начинается с lib (например, &amp;lt;code&amp;gt;libxml2&amp;lt;/code&amp;gt;), то пакет с бинарными файлами можно назвать &amp;lt;code&amp;gt;libfoo-utils&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;libfoo-tools&amp;lt;/code&amp;gt; или как-то похоже, чтобы можно было отличить его от пакета библиотеки.&lt;br /&gt;
&lt;br /&gt;
==== Названия для x86_64 ====&lt;br /&gt;
*  Бинарные пакеты:&lt;br /&gt;
** foo-2.3.4-4-rosa2012.x86_64.rpm &lt;br /&gt;
** lib64foo2-2.3.4-4-rosa2012.x86_64.rpm&lt;br /&gt;
** lib64foo-devel-2.3.4-4-rosa2012.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
Чтобы было проще, используйте &amp;lt;code&amp;gt;%mklibname&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
==== %mklibname ====&lt;br /&gt;
Макрос %mklibname используется для создания имён библиотечных пакетов:&lt;br /&gt;
* %mklibname [-d [-s]] name [[api] major]&lt;br /&gt;
** -d - создание имени для devel пакета&lt;br /&gt;
** -s - создание имени для static пакета (использовать вместе с -d)&lt;br /&gt;
** name - имя библиотеки (обратите внимание, что если именем библиотеки является libfoo, то надо вводить foo, а не libfoo)&lt;br /&gt;
** major - основное число, которое должно быть добавлено в имя (не использовать вместе с -d, кроме особых случаев, упомянутых отдельно ниже)&lt;br /&gt;
** api - если библиотека имеет, например, SONAME libfoo-1.2.so.4, то api будет 1.2, а major - 4. Результатом будет libfoo1.2_4&lt;br /&gt;
&lt;br /&gt;
Примеры использования:&lt;br /&gt;
* %mklibname foo 5 =&amp;gt; libfoo5&lt;br /&gt;
* %mklibname -d foo =&amp;gt; libfoo-devel&lt;br /&gt;
* %mklibname -d -s foo =&amp;gt; libfoo-static-devel&lt;br /&gt;
&lt;br /&gt;
=== Файлы *.la ===&lt;br /&gt;
Современные libtool отлично работают без *.la файлов, поэтому эти файлы по-умолчанию отбрасываются spec-helper во время сборки. В настоящее время известно несколько исключений, которые включены в код spec-helper. Если вы считаете, что нашли ещё одно исключение, свободно обращайтесь к мейнтейнерам rpmbuild.&lt;br /&gt;
&lt;br /&gt;
=== Особые случаи ===&lt;br /&gt;
Мы описали основную политику для пакетов библиотек, однако, могут произойти некоторые особые случаи, которые должны быть рассмотрены вдумчиво:&lt;br /&gt;
&lt;br /&gt;
* Не забывайте всегда проверять &amp;lt;i&amp;gt;soname&amp;lt;/i&amp;gt; библиотек &amp;lt;code&amp;gt;objdump -x libfoo.so.1 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; grep SONAME&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;patchelf --print-soname libfoo.so.1&amp;lt;/code&amp;gt;, потому что некоторые soname содержат номер версии библиотеки. Например, &amp;lt;code&amp;gt;libfoo-1.2.so.4&amp;lt;/code&amp;gt;. В этом случае пакет должен быть назван &amp;lt;code&amp;gt;libfoo1.2_4-1.2.4-rosa2012&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Пакеты, оканчивающиеся номером, должны быть снабжены &amp;quot;_&amp;quot; перед major. Например, &amp;lt;code&amp;gt;libfoo23_4-1.2-rosa2012&amp;lt;/code&amp;gt; (в этом случае soname будет &amp;lt;code&amp;gt;libfoo23.so.4&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Нет необходимости помещать каждую библиотеку в отдельный пакет: если пакет содержит несколько библиотек, имя можно взять из основной библиотеки пакета. Если есть проблемы с хранением библиотек в одном пакете (например, их major может отличаться), пакет должен быть разделён.&lt;br /&gt;
** При разбиении библиотек, которые ранее были в одном пакете, вам может потребоваться добавить Obsoletes/Conflicts в новые пакеты, чтобы попросить dnf поместить их в одну транзакцию.&lt;br /&gt;
* Если в дистрибутиве поддерживаются несколько версий пакета с разными major, или будущий релиз получится несовместимым по major (перестройка соответствующих pkgs не является достаточной, а требуемые изменения слишком велики) с текущей версией (например, QT3/QT4/QT5), то имя devel пакета должно содержать major. В предыдущем же случае devel субпакет новой версии обычно не содержит major, а только старые версии.&lt;br /&gt;
* Некоторые приложения (например, KDE ones) содержат динамически загружаемые модули, которые не являются библиотеками. Обычно эти модули помещают в основной субпакет приложения. Но иногда лучше включать такие модули в библиотечный пакет, если их установка обычно требуется при использовании библиотеки (чтобы каждое приложение, использующее библиотеку, не требовало добавить руководство по модулям). В целом, решения должны приниматься индивидуально. Однако, если модули включены в библиотечный пакет, они &amp;#039;&amp;#039;&amp;#039;must&amp;#039;&amp;#039;&amp;#039; попасть в каталог с версией (например, &amp;lt;code&amp;gt;/usr/lib/foo-2/module.so&amp;lt;/code&amp;gt; для пакета &amp;lt;code&amp;gt;libfoo2&amp;lt;/code&amp;gt;), чтобы установка нескольких версий библиотеки была возможной.&lt;br /&gt;
&lt;br /&gt;
=== Обновление пакета, который следовал предыдущим политикам оформления библиотек ===&lt;br /&gt;
Измените имя devel пакета с &amp;lt;code&amp;gt;%libname-devel&amp;lt;/code&amp;gt; на &amp;quot;&amp;lt;code&amp;gt;%mklibname %name -d&amp;lt;/code&amp;gt;&amp;quot; (без &amp;lt;code&amp;gt;%major&amp;lt;/code&amp;gt;, хотя обычно с &amp;lt;code&amp;gt;%api&amp;lt;/code&amp;gt; если есть), как показано выше, и добавьте &amp;lt;code&amp;gt;Obsoletes&amp;lt;/code&amp;gt; для предыдущего имени (&amp;quot;&amp;lt;code&amp;gt;%mklibname %name 2 -d&amp;lt;/code&amp;gt;&amp;quot; или &amp;quot;&amp;lt;code&amp;gt;%{_lib}%{name}2-devel&amp;lt;/code&amp;gt;&amp;quot;, где 2 - major заменяемого devel пакета).&lt;br /&gt;
Для static-devel пакетов надо произвести замену на &amp;lt;code&amp;gt;%mklibname %name -d -s&amp;lt;/code&amp;gt;. Если есть сомнения, свободно спрашивайте в списках рассылки ROSA.&lt;br /&gt;
&lt;br /&gt;
== Provides и Conflicts ==&lt;br /&gt;
Пакет -devel должен как минимум содержать &amp;lt;code&amp;gt;%name-devel &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; %version-%release&amp;lt;/code&amp;gt;. Если исходное имя тарбола отличается от %name, то вы также должны добавить &amp;lt;code&amp;gt;tarballname-devel &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; %version-%release&amp;lt;/code&amp;gt;, для совместимости с другими rpm-системами. Если в дистрибутиве содержится несколько версий библиотеки, только последняя должна называться %name-devel. Предыдущие версии должны иметь в названии, например, &amp;lt;code&amp;gt;%name%major-devel&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;%name%api-devel&amp;lt;/code&amp;gt;. Но мейнтейнер также может выбрать &amp;lt;code&amp;gt;%name%major-devel&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;%name%api-devel&amp;lt;/code&amp;gt; и для нового пакета, если следующий major по исходному коду окажется несовместимым (см. Особые случаи выше).&lt;br /&gt;
&lt;br /&gt;
Важно понимать, что включение &amp;lt;code&amp;gt;Provides&amp;lt;/code&amp;gt; без информации о версии делает невозможным последующее включение информации о версии. Например, &amp;quot;&amp;lt;code&amp;gt;Provides: foo-devel&amp;lt;/code&amp;gt;&amp;quot; - НЕ годится. Пожалуйста, используйте &amp;quot;&amp;lt;code&amp;gt;Provides: foo-devel &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 1.2.4-3-rosa2012&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Если в дистрибутиве содержится несколько версий библиотеки, и использовано исключение в виде добавления major в название lib -devel пакета, вам нужно добавить &amp;lt;code&amp;gt;Conflicts&amp;lt;/code&amp;gt; с другими devel пакетами, если их нельзя устанавливать параллельно. Это часто бывает, когда major изменился без переименования заголовочных файлов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление предыдущей мажорной версии в дистрибутив ==&lt;br /&gt;
Если пакет обновлён до нового major, и будет замечено, что он не совместим с исходным кодом предыдущего релиза, и пользователи библиотеки не смогут быть прямо пропатчены для использования нового API, то старая библиотека должна поддерживаться параллельно с новой. Процесс создания на примере пакета foo, который обновляется до major 3:&lt;br /&gt;
# Копируется git foo непосредственно перед обновлением foo2 до major 3. Также изменяется &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; на foo2 и имя спек-файла на &amp;lt;code&amp;gt;foo2.spec&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавляется 2 (major) к имени devel пакета, например, libfoo2-devel вместо libfoo-devel. Это можно осуществить добавлением параметра &amp;lt;code&amp;gt;%major&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;%mklibname&amp;lt;/code&amp;gt; для &amp;lt;code&amp;gt;%devname&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Редактируются все Provides, чтобы в них был major. Например, &amp;lt;code&amp;gt;%name-devel&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;foo%major-devel&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавляется Conflicts: &amp;lt;code&amp;gt;foo-devel&amp;lt;/code&amp;gt;, если пакет конфликтует с новым devel пакетом.&lt;br /&gt;
&lt;br /&gt;
Внесения каких-либо изменений в .spec для новой версии не требуется.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Вот пример спек-файла для рассматриваемого библиотечного пакета без бинарных и конфигурационных файлов. Обратите внимание, что спек-файл нерабочий. Это только пример для демонстрации разницы с обычным пакетом.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# api - это часть имени библиотеки перед .so&lt;br /&gt;
%define api 1.2&lt;br /&gt;
# major - это часть имени библиотеки после .so&lt;br /&gt;
%define major 1&lt;br /&gt;
%define libname %mklibname %{name} %{api} %{major}&lt;br /&gt;
%define devname %mklibname %{name} -d&lt;br /&gt;
&lt;br /&gt;
#(!) summary только для SRPM&lt;br /&gt;
Summary:        C++ interface for popular GUI library gtk+&lt;br /&gt;
Name:           gtkmm&lt;br /&gt;
Version:        1.2.4&lt;br /&gt;
Release:        1&lt;br /&gt;
&lt;br /&gt;
%description&lt;br /&gt;
#Полное и общее описание всего пакета. (Это будет только&lt;br /&gt;
#для SRPM)&lt;br /&gt;
&lt;br /&gt;
#----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
#Главный пакет (содержит только .so.[major].)&lt;br /&gt;
%package -n %{libname}&lt;br /&gt;
#(!) summary только для главной lib RPM&lt;br /&gt;
Summary:        Main library for gtkmm &lt;br /&gt;
Group:          System/Libraries&lt;br /&gt;
&lt;br /&gt;
%description -n %{libname}&lt;br /&gt;
This package contains the library needed to run programs dynamically&lt;br /&gt;
linked with gtkmm.&lt;br /&gt;
&lt;br /&gt;
%files -n %{libname}&lt;br /&gt;
# ..&lt;br /&gt;
# содержит major (и api, если есть) в списке файлов, чтобы захватить&lt;br /&gt;
# изменения при обновлении версии&lt;br /&gt;
%{_libdir}/lib-%{api}.so.%{major}*&lt;br /&gt;
&lt;br /&gt;
#----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
%package -n %{devname}&lt;br /&gt;
Summary:        Headers for developing programs that will use Gtk--&lt;br /&gt;
Group:          Development/GNOME and GTK+&lt;br /&gt;
Requires:       %{libname} = %{EVRD}&lt;br /&gt;
#(!) Не обязательно, так как мы предпочитаем использовать зависимости типа pkgconfig.&lt;br /&gt;
# Но если в библиотеке нет файлов pkgconfig, это необходимо&lt;br /&gt;
Provides:       %{name}-devel = %{EVRD}&lt;br /&gt;
&lt;br /&gt;
%description -n %{devname}&lt;br /&gt;
This package contains the headers that programmers will need to develop&lt;br /&gt;
applications which will use Gtk--, the C++ interface to the GTK+ (the Gimp&lt;br /&gt;
ToolKit) GUI library.&lt;br /&gt;
&lt;br /&gt;
%files -n %{devname}&lt;br /&gt;
# ..&lt;br /&gt;
%{_bindir}/gtkmm-config&lt;br /&gt;
%{_includedir}/*.h&lt;br /&gt;
%{_libdir}/*.so&lt;br /&gt;
&lt;br /&gt;
#----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Политики сборки пакетов]]&lt;/div&gt;</summary>
		<author><name>Survolog</name></author>
	</entry>
</feed>