build / build (push) Successful in 30m42s
- build-packages.sh rebuilds a package only when its srcpkgs/ directory changed, its binary package is missing, or a dry-run install finds a shared library Void no longer provides; DASOS_REBUILD=1 rebuilds all. An unchanged `make packages` takes 20 s instead of 17 min on the CI host - ci/release.sh publishes both ISOs and SHA256SUMS as a Gitea release when the workflow runs for a v* tag matching VERSION - README and TODO updated Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
99 lines
3.7 KiB
Bash
Executable File
99 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Builds every template in srcpkgs/ with xbps-src into the local repository
|
|
# out/hostdir/binpkgs. Runs inside the builder container, see scripts/builder.sh.
|
|
#
|
|
# xbps-src needs the whole void-packages tree (build styles, shared hooks), so our
|
|
# templates are overlaid onto a shallow clone of it in out/void-packages.
|
|
set -euo pipefail
|
|
|
|
vp=/work/out/void-packages
|
|
hostdir=/work/out/hostdir
|
|
|
|
# xbps-src refuses to run as root. Like Void's own CI, build as an unprivileged
|
|
# member of xbuilder (allowed to use xbps-uchroot); the host's UID keeps out/ owned by the user.
|
|
useradd --uid "$HOST_UID" --groups xbuilder --no-create-home builder
|
|
as_builder() {
|
|
sudo --preserve-env=HOME -u builder "$@"
|
|
}
|
|
export HOME=/tmp
|
|
mkdir -p "$hostdir"
|
|
chown "$HOST_UID:$HOST_GID" /work/out "$hostdir"
|
|
|
|
if [[ -d $vp/.git ]]; then
|
|
echo "==> Updating void-packages"
|
|
as_builder git -C "$vp" fetch --quiet --depth 1 origin master
|
|
as_builder git -C "$vp" reset --quiet --hard FETCH_HEAD
|
|
as_builder git -C "$vp" clean --quiet -fd srcpkgs
|
|
else
|
|
echo "==> Cloning void-packages"
|
|
as_builder git clone --quiet --depth 1 https://github.com/void-linux/void-packages "$vp"
|
|
fi
|
|
|
|
cat > "$vp/etc/conf" <<CONF
|
|
XBPS_CHROOT_CMD=uchroot
|
|
XBPS_MAKEJOBS=$(nproc)
|
|
CONF
|
|
|
|
# A package is rebuilt only when its directory in srcpkgs/ changed since the last
|
|
# build, its binary package is gone, or Void no longer provides a shared library
|
|
# it links to (a soname bump there needs a rebuild here). DASOS_REBUILD=1 rebuilds all.
|
|
stamps=$hostdir/stamps
|
|
mkdir -p "$stamps"
|
|
srchash() {
|
|
(cd "$vp/srcpkgs/$1" && find . -type f -print0 | sort -z | xargs -0 sha256sum) | sha256sum | cut -d' ' -f1
|
|
}
|
|
# An empty root to dry-run installs into: xbps refuses unresolved shared libraries
|
|
checkroot=$(mktemp -d)
|
|
mkdir -p "$checkroot/var/db/xbps/keys"
|
|
cp -a /var/db/xbps/keys/. "$checkroot/var/db/xbps/keys/"
|
|
voidrepo=$(sed -n 's/^repository=//p' /usr/share/xbps.d/*-repository-main.conf | head -1)
|
|
xbps-install -S -r "$checkroot" -R "$voidrepo" >/dev/null
|
|
up_to_date() {
|
|
local info version revision
|
|
[[ ${DASOS_REBUILD:-} != 1 && -f $stamps/$1 && $(< "$stamps/$1") == "$(srchash "$1")" ]] || return 1
|
|
info=$(as_builder ./xbps-src show "$1")
|
|
version=$(sed -n 's/^version:[[:space:]]*//p' <<<"$info")
|
|
revision=$(sed -n 's/^revision:[[:space:]]*//p' <<<"$info")
|
|
compgen -G "$hostdir/binpkgs/$1-${version}_$revision.*.xbps" >/dev/null || return 1
|
|
xbps-install -n -y -r "$checkroot" -R "$hostdir/binpkgs" -R "$voidrepo" "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
names=()
|
|
for dir in /work/srcpkgs/*/; do
|
|
name=$(basename "$dir")
|
|
if git -C "$vp" cat-file -e "HEAD:srcpkgs/$name/template" 2>/dev/null; then
|
|
echo "warning: $name is now in void-packages, consider dropping our template" >&2
|
|
fi
|
|
rm -rf "$vp/srcpkgs/$name"
|
|
# A subpackage is a link to its source package's directory and is built with it
|
|
if [[ -L ${dir%/} ]]; then
|
|
as_builder ln -s "$(readlink "${dir%/}")" "$vp/srcpkgs/$name"
|
|
continue
|
|
fi
|
|
as_builder cp -rL "$dir" "$vp/srcpkgs/$name"
|
|
names+=("$name")
|
|
done
|
|
|
|
cd "$vp"
|
|
# The bootstrapped masterdir stays in out/void-packages, so later builds skip this step
|
|
if [[ ! -f masterdir-x86_64/.xbps_chroot_init ]]; then
|
|
as_builder ./xbps-src -H "$hostdir" binary-bootstrap
|
|
fi
|
|
# A failed build leaves its destdir behind, and the next build of that package
|
|
# (also as a dependency of another one) would package the stale files
|
|
rm -rf masterdir-x86_64/destdir/*
|
|
for name in "${names[@]}"; do
|
|
if up_to_date "$name"; then
|
|
echo "==> $name is up to date"
|
|
continue
|
|
fi
|
|
echo "==> Building $name"
|
|
as_builder ./xbps-src -H "$hostdir" -f pkg "$name"
|
|
srchash "$name" >"$stamps/$name"
|
|
done
|
|
rm -rf "$checkroot"
|
|
chown -R "$HOST_UID:$HOST_GID" "$stamps"
|
|
|
|
echo "==> Repository: $hostdir/binpkgs"
|
|
ls -1 "$hostdir"/binpkgs/*.xbps
|