RPM/kernel

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

%kernel_latest

Как известно, в BuildRequires (у обычных пакетов) запрещено (средствами sisyphus_check) указывать конкретное ядро (например: kernel-image-std-def), но можно указать BuildRequires: kernel.

Примечание: Собирающим новые ядра желательно, не делать этот провайдс на своих (т.е. не основных) ядрах, так как этот провайдс нужен для сборки и тестирования чего-то ядерно-зависимого, а на других ядрах, скорее всего, что-то пойдет не так из-за их специфики.


Так как несколько ядер имеют этот провайдс, то установить в систему (apt-get install) его нельзя и он работает только в спеке. Но, в спеке, из-за особенностей в apt, он не гарантирует, что приедет наибольшая версия пакета с ядром - как правило, приедет лексикографически больший пакет даже если он меньшей версии. (Например, флейвор "6.12" < "6.6", а "xenomai" > "un-def"). Особенно это является проблемой если в одном бранче std-def сопровождаемое ядро, а приезжать будет всегда un-def или xenomai. Ранее это частично решалось добавлением требования версии, например, чтоб не приезжал xenomai, про который мы знаем, что он версии 4.19 сделали BuildRequires: kernel > 5.0. В силу этих сложностей невозможно делать универсальный BuildRequires, чтоб пакет мог копироваться между бренчами и получать при сборке сопровождаемое ядро последней версии.

Сейчас пакет rpm-build-kernel предоставляет макрос %kernel_latest, который можно использовать так:

 %if 0%{?kernel_latest:1}
 Requires: kernel-%kernel_latest
 Requires: kernel-headers-modules-%kernel_latest
 %else
 Requires: kernel > 5.7
 Requires: kernel-headers-modules-un-def
 %endif

Если макрос не определен, то будет старая схема, если определен, то новая. Макрос определен в сопровождаемый в бранче [псевдо]флейвор ядра с проверкой на версию. Например, latest > 6.6. Проверка на версию нужна, чтобы при наличии 6.12 (который лексикографически меньше 6.6) приезжало 6.12.

При этом, основные ядра предоставляют следующие псевдо-флейворы:

  • Stable (и longterm) ядра провайдят kernel-latest. Этот провайдс полезен только в спеке так как установить его в систему нельзя из-за многочисленных провайдсов в репозитории.
  • Mainline ядро провайдит kernel-mainline. Если возникает ситуация, что ещё нет нового mainline, ядра, но уже есть stable ядро x.y.1, то оно провайдит kernel-latest1. Таким образом, из-за отсутствия многочисленных провайдсов его можно установить в систему обычным apt-get install:
 apt-get install -y kernel-mainline || apt-get install -y kernel-latest1

Что может быть полезно для внешних CI.