unos-repository

APK repository for unos
git clone git://git.finwo.net/misc/unos-repository
Log | Files | Refs | README

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:
Mmk/deps.sh | 22++++++++++++++++++++++
Mmk/sysroot.sh | 40++++++++++++++++++++++++++++++----------
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 )