From fddebb2279640e62943d9ac503ae25dc86b5dba7 Mon Sep 17 00:00:00 2001 From: Aelin Date: Fri, 19 Jun 2026 03:46:49 +0200 Subject: [PATCH] systemd/systemd: fix the provider mess This fixes two issues: 1. I was investigating why currently, pmbootstrap build --force libcamera would fail. It turns out that the problem was possible to reduce down to apk add eudev-dev resulting in installing eudev-dev instead of systemd-dev, even with the systemd repository enabled. This is because apk actually thinks it has a higher version: name selected from selectable list select_package: eudev-dev (requirers=1, autosel=1, iif=0, order_id=0x40005807) consider systemd-dev-261_rc4-r0 iif_triggered=0, tag_ok=1, selectable=1, available=1, flags=0x0, provider_priority=100, installed=0 prefer existing package choose as new provider consider eudev-dev-3.2.14-r6 iif_triggered=0, tag_ok=1, selectable=1, available=1, flags=0x0, provider_priority=100, installed=0 select latest by requested name (greater) choose as new provider consider libudev-zero-dev-1.0.4-r0 iif_triggered=0, tag_ok=1, selectable=1, available=1, flags=0x0, provider_priority=20, installed=0 select latest by requested name (less) selecting: eudev-dev-3.2.14-r6, available: 1 assign eudev-dev to eudev-dev-3.2.14-r6 disqualify_package: systemd-dev-261_rc4-r0 (conflicting provides) disqualify_package: libudev-zero-dev-1.0.4-r0 (conflicting provides) And why is that? It's because we have two providers here: One is eudev-dev with a provider version of 3.2.14-r6, and the other is systemd-dev with a provider version that is empty. This then results in apk thinking the version number is greater, as seen above in the verbose output. An unversioned provides= for an exact package name match will never, ever, ever have any effect, even if the priority is set super high, because the version number comparison is before apk even starts looking at provider priorities. Therefore, we should not have unversioned provides for eudev, eudev-dev, eudev-libs and udev. Since those have fairly low version numbers, we can just provide them with systemd's version number and we'll be fine. This will now result in apk actually installing systemd-dev when eudev-dev is prompted for installation. 2. After fixing the aforementioned issue, I noticed that I couldn't build anything anymore. This is because my dependency tree would pull in systemd and systemd-udev - completely normal. However, both systemd and systemd-udev were providing eudev, and apk will refuse to install two packages that provide the same thing at the same time. The fix for this is to just not provide eudev in the top-level systemd package and rather let systemd-udev do that. With this, I can now finally build libcamera again! Part-of: --- extra-repos/systemd/systemd-stage0/APKBUILD | 2 +- extra-repos/systemd/systemd/APKBUILD | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extra-repos/systemd/systemd-stage0/APKBUILD b/extra-repos/systemd/systemd-stage0/APKBUILD index f444c539d..5c33f3572 100644 --- a/extra-repos/systemd/systemd-stage0/APKBUILD +++ b/extra-repos/systemd/systemd-stage0/APKBUILD @@ -6,7 +6,7 @@ pkgname=systemd-stage0 pkgver=261_rc4 _pkgver="${pkgver/_/-}" # pkgrel must match systemd! -pkgrel=0 +pkgrel=1 pkgdesc="Minimal systemd bootstrap package" url="https://github.com/systemd/systemd" # armhf: pmb#2618 diff --git a/extra-repos/systemd/systemd/APKBUILD b/extra-repos/systemd/systemd/APKBUILD index bdadb135e..cecb91b75 100644 --- a/extra-repos/systemd/systemd/APKBUILD +++ b/extra-repos/systemd/systemd/APKBUILD @@ -17,7 +17,7 @@ pkgname=systemd pkgver=261_rc4 _pkgver="${pkgver/_/-}" # pkgrel must match systemd-stage0! -pkgrel=0 +pkgrel=1 pkgdesc="System and service manager" url="https://github.com/systemd/systemd" # armhf: no linux-stable @@ -160,7 +160,7 @@ depends=" # provides=openrc and openrc-settingsd to prevent those packages # getting pulled in, as there are some conflicts (dbus) -provides="busctl eudev openrc-settingsd=$pkgver-r$pkgrel systemd-stage0=$pkgver-r$pkgrel" +provides="busctl openrc-settingsd=$pkgver-r$pkgrel systemd-stage0=$pkgver-r$pkgrel" provider_priority=100 install="$pkgname.pre-install" @@ -369,7 +369,7 @@ udevd() { depends="kmod-libs" # NOTE: should only be udev, but packages hardcode eudev - provides="eudev udev eudev-libs" + provides="eudev=$pkgver-r$pkgrel udev=$pkgver-r$pkgrel eudev-libs=$pkgver-r$pkgrel" provider_priority=100 amove usr/bin/udevadm @@ -550,7 +550,7 @@ x11() { } dev() { - provides="eudev-dev udev-dev systemd-stage0-dev=$pkgver-r$pkgrel" + provides="eudev-dev=$pkgver-r$pkgrel udev-dev=$pkgver-r$pkgrel systemd-stage0-dev=$pkgver-r$pkgrel" provider_priority=100 default_dev