RPM/kernel
%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.