Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9496559875 | ||
|
|
ddab0d827f | ||
|
|
aacdf8eb4a | ||
|
|
a6c65ca973 | ||
|
|
19fd4b1ed4 |
@@ -0,0 +1,57 @@
|
|||||||
|
# XLibre Updater Design
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
Add a repository-managed workflow for updating and building the Stormux XLibre package set in the correct dependency order, while keeping `xlibre-video-dummy-with-vt` manually maintained and reviewed against upstream `xlibre-video-dummy`.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
This design covers:
|
||||||
|
- correcting the package build order in `scripts/upgrade-xlibre.sh`
|
||||||
|
- reviewing and updating `scripts/xlibre-video-dummy-with-vt/PKGBUILD`
|
||||||
|
- regenerating `.SRCINFO` after PKGBUILD changes
|
||||||
|
|
||||||
|
This design does not automate AUR publication or rewrite the downstream package from upstream sources.
|
||||||
|
|
||||||
|
## Current State
|
||||||
|
The updater script currently builds packages in an order that does not match the XLibre dependency chain. `xlibre-video-dummy-with-vt` is also version-skewed relative to the current AUR `xlibre-video-dummy` package and needs a manual rebase of relevant packaging changes.
|
||||||
|
|
||||||
|
## Dependency Order
|
||||||
|
The package build order will be:
|
||||||
|
|
||||||
|
1. `xlibre-xserver-common`
|
||||||
|
2. `xlibre-xserver-devel`
|
||||||
|
3. `xlibre-input-libinput`
|
||||||
|
4. `xlibre-xserver`
|
||||||
|
5. `xlibre-video-fbdev`
|
||||||
|
6. `xlibre-video-dummy-with-vt`
|
||||||
|
|
||||||
|
This order reflects current AUR dependencies: `xlibre-xserver` requires `xlibre-xserver-common` and `xlibre-input-libinput`, while the input and video driver packages require `xlibre-xserver-devel` to build.
|
||||||
|
|
||||||
|
## Downstream Package Policy
|
||||||
|
`xlibre-video-dummy-with-vt` remains a separate, manually maintained package because it has a different maintainer and should not be auto-derived from the upstream AUR package.
|
||||||
|
|
||||||
|
The maintenance rule is:
|
||||||
|
- treat AUR `xlibre-video-dummy` as the packaging baseline
|
||||||
|
- manually port relevant upstream PKGBUILD changes into `xlibre-video-dummy-with-vt`
|
||||||
|
- keep only the intentional downstream delta needed for VT behavior
|
||||||
|
|
||||||
|
## Implementation Shape
|
||||||
|
`scripts/upgrade-xlibre.sh` will continue cloning packages from AUR and building them locally, but with the corrected order.
|
||||||
|
|
||||||
|
`scripts/xlibre-video-dummy-with-vt/PKGBUILD` will be updated to match the current upstream package structure where appropriate:
|
||||||
|
- current version and release
|
||||||
|
- current `depends` and `makedepends`
|
||||||
|
- current build flags and source layout
|
||||||
|
- regenerated checksums
|
||||||
|
|
||||||
|
The VT-specific patch remains the only behavioral divergence.
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
The script should fail fast on clone or build errors and stop rather than continuing with a broken package chain. Because package order is intentional, partial success should be considered incomplete.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
Verification will be task-focused:
|
||||||
|
- confirm the updater script contains the corrected package order
|
||||||
|
- compare the downstream PKGBUILD against current upstream `xlibre-video-dummy`
|
||||||
|
- regenerate and verify `.SRCINFO`
|
||||||
|
- run `shellcheck` on the updater script
|
||||||
|
- run `makepkg --printsrcinfo` in the downstream package directory
|
||||||
Executable
+194
@@ -0,0 +1,194 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
# ---- Configurable Variables ----
|
||||||
|
repoDir="/var/www/packages.stormux.org"
|
||||||
|
keyId="52ADA49000F1FF0456F8AEEFB4CDE1CD56EF8E82"
|
||||||
|
repoName="stormux"
|
||||||
|
dbName="${repoName}.db.tar.gz"
|
||||||
|
filesName="${repoName}.files.tar.gz"
|
||||||
|
rebuildDb="${REBUILD_DB:-false}"
|
||||||
|
|
||||||
|
require_cmd() {
|
||||||
|
local cmd="$1"
|
||||||
|
|
||||||
|
if ! command -v "$cmd" >/dev/null 2>&1; then
|
||||||
|
echo "❌ Required command not found: $cmd"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---- Safety Checks ----
|
||||||
|
if [[ ! -d "$repoDir" ]]; then
|
||||||
|
echo "❌ Repo dir does not exist: $repoDir"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
require_cmd "gpg"
|
||||||
|
require_cmd "repo-add"
|
||||||
|
require_cmd "repo-remove"
|
||||||
|
|
||||||
|
# ---- Create Architecture Directories ----
|
||||||
|
mkdir -p "$repoDir/x86_64" "$repoDir/aarch64"
|
||||||
|
|
||||||
|
# ---- Process Each Architecture ----
|
||||||
|
process_arch() {
|
||||||
|
local arch="$1"
|
||||||
|
local archDir="$repoDir/$arch"
|
||||||
|
local pkgFiles=()
|
||||||
|
local selectedPkgFiles=()
|
||||||
|
local repoAddArgs=()
|
||||||
|
local -A currentPkgNames=()
|
||||||
|
local -A newestPkgByName=()
|
||||||
|
local repoPkgNames=()
|
||||||
|
local dbFile="$dbName"
|
||||||
|
local filesFile="$filesName"
|
||||||
|
local dbSig="${dbFile}.sig"
|
||||||
|
local filesSig="${filesFile}.sig"
|
||||||
|
local dbLink="${repoName}.db"
|
||||||
|
local filesLink="${repoName}.files"
|
||||||
|
|
||||||
|
echo "🏗️ Processing $arch packages..."
|
||||||
|
|
||||||
|
# Enter arch directory (packages should already be sorted by update.sh)
|
||||||
|
cd "$archDir" || return 1
|
||||||
|
|
||||||
|
# Select only the newest archive for each package name. repo-add cannot
|
||||||
|
# safely consume multiple versions of the same package in a single run.
|
||||||
|
pkgFiles=( *.pkg.tar.zst *.pkg.tar.xz )
|
||||||
|
for pkg in "${pkgFiles[@]}"; do
|
||||||
|
local pkgName pkgVersion existingPkg existingVersion
|
||||||
|
pkgName="$(bsdtar -xOqf "$pkg" .PKGINFO | sed -n 's/^pkgname = //p' | head -n1)"
|
||||||
|
pkgVersion="$(bsdtar -xOqf "$pkg" .PKGINFO | sed -n 's/^pkgver = //p' | head -n1)-$(bsdtar -xOqf "$pkg" .PKGINFO | sed -n 's/^pkgrel = //p' | head -n1)"
|
||||||
|
|
||||||
|
if [[ -z "$pkgName" || -z "$pkgVersion" ]]; then
|
||||||
|
echo "❌ Unable to determine package metadata for $pkg"
|
||||||
|
cd "$repoDir" || exit 1
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
existingPkg="${currentPkgNames[$pkgName]:-}"
|
||||||
|
if [[ -z "$existingPkg" ]]; then
|
||||||
|
currentPkgNames["$pkgName"]="$pkg"
|
||||||
|
else
|
||||||
|
existingVersion="$(bsdtar -xOqf "$existingPkg" .PKGINFO | sed -n 's/^pkgver = //p' | head -n1)-$(bsdtar -xOqf "$existingPkg" .PKGINFO | sed -n 's/^pkgrel = //p' | head -n1)"
|
||||||
|
if (( $(vercmp "$pkgVersion" "$existingVersion") > 0 )); then
|
||||||
|
currentPkgNames["$pkgName"]="$pkg"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for pkgName in "${!currentPkgNames[@]}"; do
|
||||||
|
newestPkgByName["$pkgName"]="${currentPkgNames[$pkgName]}"
|
||||||
|
selectedPkgFiles+=( "${currentPkgNames[$pkgName]}" )
|
||||||
|
done
|
||||||
|
|
||||||
|
pkgFiles=( "${selectedPkgFiles[@]}" )
|
||||||
|
|
||||||
|
# Sign all unsigned selected packages
|
||||||
|
echo "🔏 Signing $arch packages..."
|
||||||
|
for pkg in "${pkgFiles[@]}"; do
|
||||||
|
if [[ ! -f "$pkg.sig" ]]; then
|
||||||
|
echo " 📝 Signing $pkg"
|
||||||
|
gpg --default-key "$keyId" --detach-sign "$pkg"
|
||||||
|
else
|
||||||
|
echo " ✅ $pkg already signed"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Track which package names should remain in the repo after this run.
|
||||||
|
for pkg in "${pkgFiles[@]}"; do
|
||||||
|
local pkgName
|
||||||
|
pkgName="$(bsdtar -xOqf "$pkg" .PKGINFO | sed -n 's/^pkgname = //p' | head -n1)"
|
||||||
|
if [[ -n "$pkgName" ]]; then
|
||||||
|
currentPkgNames["$pkgName"]=1
|
||||||
|
else
|
||||||
|
echo "❌ Unable to determine package name for $pkg"
|
||||||
|
cd "$repoDir" || exit 1
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Rebuild database for this architecture
|
||||||
|
if [[ "$rebuildDb" == "true" ]]; then
|
||||||
|
echo "🗃️ Rebuilding $arch repo database..."
|
||||||
|
rm -f "$dbFile" "$dbSig" "$filesFile" "$filesSig" "$dbLink" "$filesLink"
|
||||||
|
elif [[ -f "$dbFile" ]]; then
|
||||||
|
echo "🗃️ Updating $arch repo database..."
|
||||||
|
else
|
||||||
|
echo "🆕 Creating new $arch repo database..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove packages that still exist in the repo database but are no longer
|
||||||
|
# present in the current directory. repo-remove with --remove also deletes
|
||||||
|
# the matching package archive and detached signature from disk.
|
||||||
|
if [[ -f "$dbFile" ]]; then
|
||||||
|
mapfile -t repoPkgNames < <(
|
||||||
|
bsdtar -tf "$dbFile" |
|
||||||
|
awk -F/ 'NF == 2 && $2 == "desc" {print $1}' |
|
||||||
|
while read -r entry; do
|
||||||
|
bsdtar -xOf "$dbFile" "${entry}/desc" |
|
||||||
|
awk 'found {print; exit} /^%NAME%$/ {found=1}'
|
||||||
|
done |
|
||||||
|
sort -u
|
||||||
|
)
|
||||||
|
|
||||||
|
for pkgName in "${repoPkgNames[@]}"; do
|
||||||
|
if [[ -z "${currentPkgNames[$pkgName]:-}" ]]; then
|
||||||
|
echo "🧹 Removing stale repo package $pkgName"
|
||||||
|
repo-remove --sign --key "$keyId" --remove "$dbFile" "$pkgName"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Only run repo-add if there are packages
|
||||||
|
if ((${#pkgFiles[@]} > 0)); then
|
||||||
|
repoAddArgs=(--sign --key "$keyId" --remove)
|
||||||
|
if [[ "$rebuildDb" != "true" && -f "$dbFile" ]]; then
|
||||||
|
repoAddArgs+=(--verify)
|
||||||
|
fi
|
||||||
|
|
||||||
|
repo-add "${repoAddArgs[@]}" "$dbFile" "${pkgFiles[@]}"
|
||||||
|
|
||||||
|
if [[ ! -f "$dbFile" ]]; then
|
||||||
|
echo "❌ repo-add did not create $dbFile"
|
||||||
|
cd "$repoDir" || exit 1
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -e "$dbLink" ]]; then
|
||||||
|
ln -s "$dbFile" "$dbLink"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f "$filesFile" && ! -e "$filesLink" ]]; then
|
||||||
|
ln -s "$filesFile" "$filesLink"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ $arch repo updated successfully"
|
||||||
|
else
|
||||||
|
echo "ℹ️ No $arch packages found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove orphaned package archives and detached signatures that are not part
|
||||||
|
# of the current package set. This keeps the on-disk repo contents aligned
|
||||||
|
# with the package database after rebuilds and package removals.
|
||||||
|
for pkg in *.pkg.tar.zst *.pkg.tar.xz; do
|
||||||
|
local pkgName
|
||||||
|
pkgName="$(bsdtar -xOqf "$pkg" .PKGINFO | sed -n 's/^pkgname = //p' | head -n1)"
|
||||||
|
if [[ -z "${newestPkgByName[$pkgName]:-}" || "${newestPkgByName[$pkgName]}" != "$pkg" ]]; then
|
||||||
|
echo "🧹 Removing orphaned package file $pkg"
|
||||||
|
rm -f "$pkg" "$pkg.sig"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
cd "$repoDir" || exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---- Process Both Architectures ----
|
||||||
|
process_arch "x86_64"
|
||||||
|
process_arch "aarch64"
|
||||||
|
|
||||||
|
# ---- Done ----
|
||||||
|
echo "✅ All repositories updated and signed successfully."
|
||||||
Executable
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
startDir="$(pwd)"
|
||||||
|
buildDir="${startDir}/xlibre-build"
|
||||||
|
|
||||||
|
packageList=(
|
||||||
|
xlibre-input-libinput
|
||||||
|
xlibre-xserver
|
||||||
|
xlibre-video-amdgpu
|
||||||
|
xlibre-video-ati
|
||||||
|
xlibre-video-fbdev
|
||||||
|
xlibre-video-intel
|
||||||
|
xlibre-video-nouveau
|
||||||
|
xlibre-video-vesa
|
||||||
|
xlibre-video-dummy-with-vt
|
||||||
|
)
|
||||||
|
|
||||||
|
mkdir -p "${buildDir}"
|
||||||
|
|
||||||
|
for i in "${packageList[@]}" ; do
|
||||||
|
yay -Ga "$i"
|
||||||
|
pushd "$i"
|
||||||
|
makepkg -Acrsf
|
||||||
|
cp -v ./*.pkg.tar.* "${buildDir}/"
|
||||||
|
popd
|
||||||
|
done
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
pkgbase = xlibre-video-dummy-with-vt
|
||||||
|
pkgdesc = XLibre dummy video driver with an allocated vt
|
||||||
|
pkgver = 25.0.0
|
||||||
|
pkgrel = 5
|
||||||
|
url = https://github.com/X11Libre/xf86-video-dummy
|
||||||
|
arch = x86_64
|
||||||
|
arch = aarch64
|
||||||
|
groups = xlibre-drivers
|
||||||
|
license = MIT
|
||||||
|
license = X11
|
||||||
|
makedepends = xlibre-xserver-devel>=25.0
|
||||||
|
makedepends = xorgproto
|
||||||
|
depends = xlibre-xserver>=25.0
|
||||||
|
depends = glibc
|
||||||
|
provides = xf86-video-dummy
|
||||||
|
provides = x11win-video-dummy
|
||||||
|
conflicts = xf86-video-dummy
|
||||||
|
source = https://github.com/X11Libre/xf86-video-dummy/archive/refs/tags/xlibre-xf86-video-dummy-25.0.0.tar.gz
|
||||||
|
source = dummy_driver.patch
|
||||||
|
sha256sums = b56e610705cd3d4d86422a11c6b0d93357e4d4749a05178a85fd250301d357b9
|
||||||
|
sha256sums = 68cdcf21e9b54a7fdb8e968292e1ef9ad154ddb1361b141a0a635c2a13c92bfa
|
||||||
|
|
||||||
|
pkgname = xlibre-video-dummy-with-vt
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
*
|
||||||
|
!PKGBUILD
|
||||||
|
!.SRCINFO
|
||||||
|
!.gitignore
|
||||||
|
!.nvchecker.toml
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
[xlibre-video-dummy]
|
||||||
|
source = "git"
|
||||||
|
git = "https://github.com/x11libre/xf86-video-dummy.git"
|
||||||
|
include_regex = "xlibre-xf86-video-dummy-.*"
|
||||||
|
prefix = "xlibre-xf86-video-dummy-"
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# Maintainer: Storm Dragon <storm_dragon@linux-a11y.org>
|
||||||
|
|
||||||
|
pkgname=xlibre-video-dummy-with-vt
|
||||||
|
pkgver=25.0.0
|
||||||
|
pkgrel=5
|
||||||
|
pkgdesc="XLibre dummy video driver with an allocated vt"
|
||||||
|
arch=(x86_64 aarch64)
|
||||||
|
_pkgname=xf86-video-dummy
|
||||||
|
url="https://github.com/X11Libre/${_pkgname}"
|
||||||
|
license=('MIT' 'X11')
|
||||||
|
depends=("xlibre-xserver>=${pkgver%.*}" 'glibc')
|
||||||
|
makedepends=("xlibre-xserver-devel>=${pkgver%.*}" 'xorgproto')
|
||||||
|
conflicts=("${_pkgname}")
|
||||||
|
provides=("${_pkgname}" 'x11win-video-dummy')
|
||||||
|
source=("${url}/archive/refs/tags/xlibre-${_pkgname}-${pkgver}.tar.gz"
|
||||||
|
"dummy_driver.patch")
|
||||||
|
groups=('xlibre-drivers')
|
||||||
|
sha256sums=('b56e610705cd3d4d86422a11c6b0d93357e4d4749a05178a85fd250301d357b9'
|
||||||
|
'68cdcf21e9b54a7fdb8e968292e1ef9ad154ddb1361b141a0a635c2a13c92bfa')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
cd "${srcdir}/${_pkgname}-xlibre-${_pkgname}-${pkgver}/src"
|
||||||
|
patch -i "${srcdir}/dummy_driver.patch"
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
case "$CARCH" in
|
||||||
|
"x86_64")
|
||||||
|
CFLAGS=" -march=x86-64"
|
||||||
|
;;
|
||||||
|
"aarch64")
|
||||||
|
CFLAGS=" -march=armv8-a"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
CFLAGS=" -march=native"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
CFLAGS+=" -mtune=generic -O2 -pipe -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security"
|
||||||
|
CFLAGS+=" -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
|
||||||
|
LDFLAGS=" -Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,lazy -Wl,-z,relro -Wl,-z,pack-relative-relocs"
|
||||||
|
if [[ $CARCH != 'aarch64' ]]; then
|
||||||
|
CFLAGS+=" -fcf-protection"
|
||||||
|
fi
|
||||||
|
CXXFLAGS="${CFLAGS} -Wp,-D_GLIBCXX_ASSERTIONS"
|
||||||
|
export CFLAGS="${CFLAGS}"
|
||||||
|
export CXXFLAGS="${CXXFLAGS}"
|
||||||
|
export LDFLAGS="${LDFLAGS}"
|
||||||
|
|
||||||
|
cd "${srcdir}/${_pkgname}-xlibre-${_pkgname}-${pkgver}"
|
||||||
|
./autogen.sh
|
||||||
|
./configure --prefix=/usr
|
||||||
|
make
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
cd "${srcdir}/${_pkgname}-xlibre-${_pkgname}-${pkgver}"
|
||||||
|
make DESTDIR="${pkgdir}" install
|
||||||
|
install -Dm644 COPYING "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
--- a/src/dummy_driver.c
|
||||||
|
+++ b/src/dummy_driver.c
|
||||||
|
@@ -1016,10 +1016,10 @@ dummyDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr)
|
||||||
|
CARD32 *flag;
|
||||||
|
|
||||||
|
switch (op) {
|
||||||
|
- case GET_REQUIRED_HW_INTERFACES:
|
||||||
|
- flag = (CARD32*)ptr;
|
||||||
|
- (*flag) = HW_SKIP_CONSOLE;
|
||||||
|
- return TRUE;
|
||||||
|
+ case GET_REQUIRED_HW_INTERFACES:
|
||||||
|
+ flag = (CARD32*)ptr;
|
||||||
|
+ /* Allow the driver to allocate a VT instead of skipping the console. */
|
||||||
|
+ return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user