commit e2719bcce01ef537d40015e6497e48eeb736a168
parent 7fe85ba7b0dd4e56edae7a6934fc4aa3ff22cf5c
Author: Robin Bron <robin.bron@yourhosting.nl>
Date: Sun, 27 Sep 2026 22:52:00 +0200
Better dep resolve in sysroot
Diffstat:
2 files changed, 52 insertions(+), 10 deletions(-)
diff --git a/mk/deps.sh b/mk/deps.sh
@@ -113,6 +113,27 @@ cmd_vars() {
printf 'hostmakedepends: %s\n' "$(printf '%s' "${v}" | cut -d'|' -f3)"
}
+# Runtime depends of a package or subpackage, version pins intact. A
+# subpackage's depends live in depends_<name with - as _>, not in `depends`.
+cmd_rtdeps() {
+ name="${1:?usage: deps.sh rtdeps <name>}"
+ o=$(owner_of "${name}") || die "no such package: ${name}"
+ if [ "${o}" = "${name}" ]; then
+ field "${o}" 1
+ return 0
+ fi
+ u=$(printf '%s' "${name}" | tr '-' '_')
+ (
+ depends=; makedepends=; hostmakedepends=; subpackages=; version=; revision=0
+ SYSROOT=; DESTDIR=; WRKSRC=; FILESDIR=; WORK=; SRCDEST=
+ UNOS_MKDIR="${HERE}"
+ die() { :; } ; msg() { :; } ; vinstall() { :; } ; vmkdir() { :; }
+ # shellcheck disable=SC1090
+ . "${PKGDIR}/${o}/template" >/dev/null 2>&1 || true
+ eval "printf '%s\n' \"\${depends_${u}:-}\""
+ )
+}
+
cmd_graph() {
for p in $(list_pkgs); do
for d in $(makedeps_of "${p}"); do
@@ -292,6 +313,7 @@ case "${1:-}" in
seed) shift; cmd_seed "$@" ;;
owner) shift; owner_of "${1:?usage: deps.sh owner <name>}" ;;
subpkgs) shift; field "${1:?usage: deps.sh subpkgs <pkg>}" 4 ;;
+ rtdeps) shift; cmd_rtdeps "$@" ;;
# A subpackage carries its owning template's version.
pkgver) shift
_o=$(owner_of "${1:?usage: deps.sh pkgver <name>}") || die "no such package: $1"
diff --git a/mk/sysroot.sh b/mk/sysroot.sh
@@ -124,18 +124,38 @@ for r in ${REPOS}; do
command -v curl >/dev/null 2>&1 || break
mkdir -p "${STAGE}"
staged=0
- for n in ${PKGS_TO_INSTALL}; do
- pv=$("${ROOT}/mk/deps.sh" pkgver "${n}" 2>/dev/null) || continue
- apk_name="${n}-${pv}.apk"
- if [ -f "${STAGE}/${apk_name}" ]; then staged=$((staged + 1)); continue; fi
- url=$(printf '%s' "${r%/}/${ARCH}/${apk_name}" \
- | sed 's#://#___PROTO___#; s#//*#/#g; s#___PROTO___#://#')
- if curl -fsSL -o "${STAGE}/${apk_name}" "${url}" 2>/dev/null; then
+ queue="${PKGS_TO_INSTALL}"
+ seen=""
+ while [ -n "${queue}" ]; do
+ # shellcheck disable=SC2086
+ set -- ${queue}
+ n="$1"; shift; queue="$*"
+
+ # A dependency may carry a pin: linux-headers=6.18.51-r1
+ base="${n%%=*}"
+ case "${n}" in
+ *=*) pv="${n#*=}" ;;
+ *) pv=$("${ROOT}/mk/deps.sh" pkgver "${base}" 2>/dev/null) || continue ;;
+ esac
+
+ case " ${seen} " in *" ${base} "*) continue ;; esac
+ seen="${seen} ${base}"
+
+ apk_name="${base}-${pv}.apk"
+ if [ ! -f "${STAGE}/${apk_name}" ]; then
+ url=$(printf '%s' "${r%/}/${ARCH}/${apk_name}" \
+ | sed 's#://#___PROTO___#; s#//*#/#g; s#___PROTO___#://#')
+ curl -fsSL -o "${STAGE}/${apk_name}" "${url}" 2>/dev/null || {
+ rm -f "${STAGE}/${apk_name}"
+ continue
+ }
echo " staged ${apk_name}"
- staged=$((staged + 1))
- else
- rm -f "${STAGE}/${apk_name}"
fi
+ staged=$((staged + 1))
+
+ # Pull in what it needs at runtime; ambiguous names (a subpackage several
+ # kernel lines all provide) just fall through to APKINDEX.
+ queue="${queue} $("${ROOT}/mk/deps.sh" rtdeps "${base}" 2>/dev/null || true)"
done
if [ "${staged}" -gt 0 ]; then
( cd "${STAGE}" && "${APK}" index --allow-untrusted -o APKINDEX.tar.gz ./*.apk >/dev/null )