aboutsummaryrefslogtreecommitdiff
path: root/tools/cpm
diff options
context:
space:
mode:
authorcrueter <crueter@eden-emu.dev>2026-01-14 19:29:13 +0100
committercrueter <crueter@eden-emu.dev>2026-01-14 19:29:13 +0100
commit89f72d286a85504ccf997bb8124e32d1f76d6c81 (patch)
treee71d20665bb7dd75c855d5caa2ee304d970f3215 /tools/cpm
parentecd01e13fd13b39bff0f2c7c7bc2387c3a2157f4 (diff)
[cmake, tools] update CPMUtil and add support for CPMUtil bundled Qt, module updates, cleanups (#3289)
Support for bundled Qt, not through aqtinstall but rather my CI. Multimedia is implemented too, works on both Windows and Linux, though we don't actually use it so it doesn't really matter. Contains Declarative and all that so the Quick frontend will work once it becomes a thing. Some options have changed, notably w.r.t LTO and faster linker, which are now handled directly in the modules. CPMUtil also has support for custom dirs (`PackageName_CUSTOM_DIR`) now. Probably most useful for adding external fragment shaders and whatnot. Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3289
Diffstat (limited to 'tools/cpm')
-rwxr-xr-xtools/cpm/common.sh10
-rwxr-xr-xtools/cpm/migrate.sh7
-rwxr-xr-xtools/cpm/package.sh44
-rwxr-xr-xtools/cpm/package/add.sh6
-rwxr-xr-xtools/cpm/package/download.sh6
-rwxr-xr-xtools/cpm/package/fetch.sh14
-rwxr-xr-xtools/cpm/package/hash.sh6
-rwxr-xr-xtools/cpm/package/rm.sh4
-rwxr-xr-xtools/cpm/package/update.sh31
-rwxr-xr-xtools/cpm/package/util/fix-hash.sh4
-rwxr-xr-xtools/cpm/package/util/interactive.sh18
-rwxr-xr-xtools/cpm/package/vars.sh28
-rwxr-xr-xtools/cpm/package/version.sh10
-rwxr-xr-xtools/cpm/package/which.sh4
-rwxr-xr-xtools/cpm/update.sh13
15 files changed, 94 insertions, 111 deletions
diff --git a/tools/cpm/common.sh b/tools/cpm/common.sh
index 436b2cedee..97a2fed003 100755
--- a/tools/cpm/common.sh
+++ b/tools/cpm/common.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
##################################
@@ -9,6 +9,14 @@
# TODO: cache cpmfile defs
+must_install() {
+ for cmd in "$@"; do
+ command -v "$cmd" >/dev/null 2>&1 || { echo "-- $cmd must be installed" && exit 1; }
+ done
+}
+
+must_install jq find mktemp tar 7z unzip sha512sum git patch curl xargs
+
# How many levels to go (3 is 2 subdirs max)
MAXDEPTH=3
diff --git a/tools/cpm/migrate.sh b/tools/cpm/migrate.sh
index adf72bd0bb..b24bbfbbbf 100755
--- a/tools/cpm/migrate.sh
+++ b/tools/cpm/migrate.sh
@@ -1,11 +1,10 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
SUBMODULES="$(git submodule status --recursive | cut -c2-)"
-
-[ -z "$SUBMODULES" ] && echo "No submodules defined!" && exit 0
+: "${SUBMODULES:?No submodules defined!}"
tmp=$(mktemp)
printf '{}' >"$tmp"
@@ -22,7 +21,7 @@ for i in $SUBMODULES; do
remote=$(git -C "$path" remote get-url origin)
host=$(echo "$remote" | cut -d"/" -f3)
- [ "$host" = github.com ] && host=
+ [ "$host" != github.com ] || host=
repo=$(echo "$remote" | cut -d"/" -f4-5 | cut -d'.' -f1)
diff --git a/tools/cpm/package.sh b/tools/cpm/package.sh
index f64f40a3d2..474a2f351e 100755
--- a/tools/cpm/package.sh
+++ b/tools/cpm/package.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
RETURN=0
@@ -31,48 +31,12 @@ export SCRIPTS
while :; do
case "$1" in
- hash)
+ hash | update | fetch | add | rm | version | which | download)
+ cmd="$1"
shift
- "$SCRIPTS"/hash.sh "$@"
+ "$SCRIPTS/$cmd".sh "$@"
break
;;
- update)
- shift
- "$SCRIPTS"/update.sh "$@"
- break
- ;;
- fetch)
- shift
- "$SCRIPTS"/fetch.sh "$@"
- break
- ;;
- add)
- shift
- "$SCRIPTS"/add.sh "$@"
- break
- ;;
- rm)
- shift
- "$SCRIPTS"/rm.sh "$@"
- break
- ;;
- version)
- shift
- "$SCRIPTS"/version.sh "$@"
- break
- ;;
- which)
- shift
- "$SCRIPTS"/which.sh "$@"
- break
- ;;
- download)
- shift
- "$SCRIPTS"/download.sh "$@"
- break
- ;;
- -h | --help) usage ;;
- "") usage ;;
*) usage ;;
esac
diff --git a/tools/cpm/package/add.sh b/tools/cpm/package/add.sh
index 975e6fbae2..f8071ee1bd 100755
--- a/tools/cpm/package/add.sh
+++ b/tools/cpm/package/add.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
RETURN=0
@@ -30,7 +30,7 @@ die() {
}
_cpmfile() {
- [ -z "$1" ] && die "You must specify a valid cpmfile."
+ [ -n "$1" ] || die "You must specify a valid cpmfile."
CPMFILE="$1"
}
@@ -70,7 +70,7 @@ done
: "${CPMFILE:=$PWD/cpmfile.json}"
-[ -z "$PKG" ] && die "You must specify a package name."
+[ -n "$PKG" ] || die "You must specify a package name."
export PKG
export CPMFILE
diff --git a/tools/cpm/package/download.sh b/tools/cpm/package/download.sh
index c541426084..2a6125e74d 100755
--- a/tools/cpm/package/download.sh
+++ b/tools/cpm/package/download.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
usage() {
@@ -29,8 +29,8 @@ while :; do
shift
done
-[ "$ALL" = 1 ] && packages="${LIBS:-$packages}"
-[ -z "$packages" ] && usage
+[ "$ALL" != 1 ] || packages="${LIBS:-$packages}"
+[ -n "$packages" ] || usage
for pkg in $packages; do
PACKAGE="$pkg"
diff --git a/tools/cpm/package/fetch.sh b/tools/cpm/package/fetch.sh
index a1f3dc0cf1..a846f34b88 100755
--- a/tools/cpm/package/fetch.sh
+++ b/tools/cpm/package/fetch.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
: "${CPM_SOURCE_CACHE:=$PWD/.cache/cpm}"
@@ -73,11 +73,12 @@ download_package() {
}
ci_package() {
- [ "$REPO" = null ] && echo "-- ! No repo defined" && return
+ [ "$REPO" != null ] || echo "-- ! No repo defined" && return
echo "-- CI package $PACKAGE_NAME"
- for platform in windows-amd64 windows-arm64 \
+ for platform in \
+ windows-amd64 windows-arm64 \
mingw-amd64 mingw-arm64 \
android-aarch64 android-x86_64 \
solaris-amd64 freebsd-amd64 openbsd-amd64 \
@@ -90,7 +91,6 @@ ci_package() {
echo "-- * -- disabled"
continue
;;
- *) ;;
esac
FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
@@ -102,7 +102,7 @@ ci_package() {
[ -d "$OUTDIR" ] && continue
HASH_ALGO=$(echo "$JSON" | jq -r ".hash_algo")
- [ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
+ [ "$HASH_ALGO" != null ] || HASH_ALGO=sha512
HASH_SUFFIX="${HASH_ALGO}sum"
HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
@@ -137,8 +137,8 @@ while :; do
shift
done
-[ "$ALL" = 1 ] && packages="${LIBS:-$packages}"
-[ -z "$packages" ] && usage
+[ "$ALL" != 1 ] || packages="${LIBS:-$packages}"
+[ -n "$packages" ] || usage
for PACKAGE in $packages; do
export PACKAGE
diff --git a/tools/cpm/package/hash.sh b/tools/cpm/package/hash.sh
index 8a23894617..57bc1fee10 100755
--- a/tools/cpm/package/hash.sh
+++ b/tools/cpm/package/hash.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
RETURN=0
@@ -52,9 +52,9 @@ while :; do
shift
done
-[ "$ALL" = 1 ] && packages="${LIBS:-$packages}"
+[ "$ALL" != 1 ] || packages="${LIBS:-$packages}"
[ "$DRY" = 1 ] && UPDATE=false || UPDATE=true
-[ -z "$packages" ] && usage
+[ -n "$packages" ] || usage
export UPDATE
diff --git a/tools/cpm/package/rm.sh b/tools/cpm/package/rm.sh
index 4af163492f..8b1ab94295 100755
--- a/tools/cpm/package/rm.sh
+++ b/tools/cpm/package/rm.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
RETURN=0
@@ -16,7 +16,7 @@ EOF
exit $RETURN
}
-[ $# -lt 1 ] && usage
+[ $# -ge 1 ] || usage
for pkg in "$@"; do
JSON=$("$SCRIPTS"/which.sh "$pkg") || {
diff --git a/tools/cpm/package/update.sh b/tools/cpm/package/update.sh
index 362d4c14e0..be6a0fbbef 100755
--- a/tools/cpm/package/update.sh
+++ b/tools/cpm/package/update.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
filter_out() {
@@ -37,13 +37,13 @@ while :; do
case "$char" in
a) ALL=1 ;;
- n) DRY=1 ;;
+ n) UPDATE=false ;;
h) usage ;;
*) die "Invalid option -$char" ;;
esac
done
;;
- --dry-run) DRY=1 ;;
+ --dry-run) UPDATE=false ;;
--all) ALL=1 ;;
--help) usage ;;
"$0") break ;;
@@ -54,9 +54,9 @@ while :; do
shift
done
-[ "$ALL" = 1 ] && packages="${LIBS:-$packages}"
-[ "$DRY" = 1 ] && UPDATE=false || UPDATE=true
-[ -z "$packages" ] && usage
+[ "$ALL" != 1 ] || packages="${LIBS:-$packages}"
+: "${UPDATE:=true}"
+[ -n "$packages" ] || usage
for pkg in $packages; do
PACKAGE="$pkg"
@@ -66,15 +66,15 @@ for pkg in $packages; do
SKIP=$(value "skip_updates")
- [ "$SKIP" = "true" ] && continue
+ [ "$SKIP" != "true" ] || continue
- [ "$REPO" = null ] && continue
- [ "$GIT_HOST" != "github.com" ] && continue # TODO
+ [ "$REPO" != null ] || continue
+ [ "$GIT_HOST" = "github.com" ] || continue # TODO
- [ "$CI" = "true" ] && continue
+ [ "$CI" != "true" ] || continue
# shellcheck disable=SC2153
- [ "$TAG" = null ] && continue
+ [ "$TAG" != null ] || continue
echo "-- Package $PACKAGE"
@@ -99,12 +99,15 @@ for pkg in $packages; do
filter_out rc
# Add package-specific overrides here, e.g. here for fmt:
- [ "$PACKAGE" = fmt ] && filter_out v0.11
+ [ "$PACKAGE" != fmt ] || filter_out v0.11
LATEST=$(echo "$TAGS" | jq -r '.[0].name')
- [ "$LATEST" = "null" ] && echo "-- * Up-to-date" && continue
- [ "$LATEST" = "$TAG" ] && [ "$FORCE" != "true" ] && echo "-- * Up-to-date" && continue
+ if [ "$LATEST" = "null" ] ||
+ { [ "$LATEST" = "$TAG" ] && [ "$FORCE" != "true" ]; }; then
+ echo "-- * Up-to-date"
+ continue
+ fi
if [ "$HAS_REPLACE" = "true" ]; then
# this just extracts the tag prefix
diff --git a/tools/cpm/package/util/fix-hash.sh b/tools/cpm/package/util/fix-hash.sh
index 5d8dd0e163..07b9d266dd 100755
--- a/tools/cpm/package/util/fix-hash.sh
+++ b/tools/cpm/package/util/fix-hash.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
: "${PACKAGE:=$1}"
@@ -13,7 +13,7 @@
[ "$HASH_URL" = null ] || exit 0
[ "$HASH_SUFFIX" = null ] || exit 0
-[ "$HASH" = null ] && echo "-- * Package has no hash specified" && exit 0
+[ "$HASH" != null ] || { echo "-- * Package has no hash specified" && exit 0; }
ACTUAL=$("$SCRIPTS"/util/url-hash.sh "$DOWNLOAD")
diff --git a/tools/cpm/package/util/interactive.sh b/tools/cpm/package/util/interactive.sh
index 974228488a..99db77e20d 100755
--- a/tools/cpm/package/util/interactive.sh
+++ b/tools/cpm/package/util/interactive.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
# This reads a single-line input from the user and also gives them
@@ -13,7 +13,7 @@
read_single() {
while :; do
printf -- "-- %s" "$1"
- [ -n "$2" ] && printf " (? for help, %s)" "$3"
+ [ -z "$2" ] || printf " (? for help, %s)" "$3"
printf ": "
if ! IFS= read -r reply; then
echo
@@ -113,7 +113,7 @@ tag v1.3.0, then set this to 1.3.0 and set the tag to v%VERSION%."
"Most commonly this will be something like v%VERSION% or release-%VERSION%, or just %VERSION%."
TAGNAME="$reply"
- [ -z "$TAGNAME" ] && TAGNAME="%VERSION%"
+ [ -n "$TAGNAME" ] || TAGNAME="%VERSION%"
optional "Name of the release artifact to download, if applicable.
-- %VERSION% is replaced by the numeric version and %TAG% is replaced by the tag name" \
@@ -160,9 +160,9 @@ fi
jq_input='{repo: "'"$REPO"'"}'
# common trivial fields
-[ -n "$PACKAGE" ] && jq_input="$jq_input + {package: \"$PACKAGE\"}"
-[ -n "$MIN_VERSION" ] && jq_input="$jq_input + {min_version: \"$MIN_VERSION\"}"
-[ -n "$FIND_ARGS" ] && jq_input="$jq_input + {find_args: \"$FIND_ARGS\"}"
+[ -z "$PACKAGE" ] || jq_input="$jq_input + {package: \"$PACKAGE\"}"
+[ -z "$MIN_VERSION" ] || jq_input="$jq_input + {min_version: \"$MIN_VERSION\"}"
+[ -z "$FIND_ARGS" ] || jq_input="$jq_input + {find_args: \"$FIND_ARGS\"}"
if [ "$CI" = "true" ]; then
jq_input="$jq_input + {
@@ -177,7 +177,7 @@ if [ "$CI" = "true" ]; then
jq_input="$jq_input + {disabled_platforms: $disabled_json}"
fi
else
- [ -n "$MIN_VERSION" ] && jq_input="$jq_input + {version: \"$MIN_VERSION\"}"
+ [ -z "$MIN_VERSION" ] || jq_input="$jq_input + {version: \"$MIN_VERSION\"}"
jq_input="$jq_input + {hash: \"\"}"
# options
@@ -194,8 +194,8 @@ else
# versioning stuff
if [ -n "$GIT_VERSION" ]; then
jq_input="$jq_input + {git_version: \"$GIT_VERSION\"}"
- [ -n "$TAGNAME" ] && jq_input="$jq_input + {tag: \"$TAGNAME\"}"
- [ -n "$ARTIFACT" ] && jq_input="$jq_input + {artifact: \"$ARTIFACT\"}"
+ [ -z "$TAGNAME" ] || jq_input="$jq_input + {tag: \"$TAGNAME\"}"
+ [ -z "$ARTIFACT" ] || jq_input="$jq_input + {artifact: \"$ARTIFACT\"}"
else
jq_input="$jq_input + {sha: \"$SHA\"}"
fi
diff --git a/tools/cpm/package/vars.sh b/tools/cpm/package/vars.sh
index 71bbb3e041..07f4883ddf 100755
--- a/tools/cpm/package/vars.sh
+++ b/tools/cpm/package/vars.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
# shellcheck disable=SC1091
@@ -9,12 +9,15 @@ value() {
echo "$JSON" | jq -r ".$1"
}
-[ -z "$PACKAGE" ] && echo "Package was not specified" && exit 0
+[ -n "$PACKAGE" ] || { echo "Package was not specified" && exit 0; }
# shellcheck disable=SC2153
JSON=$(echo "$PACKAGES" | jq -r ".\"$PACKAGE\" | select( . != null )")
-[ -z "$JSON" ] && echo "!! No cpmfile definition for $PACKAGE" >&2 && exit 1
+if [ -z "$JSON" ]; then
+ echo "!! No cpmfile definition for $PACKAGE" >&2
+ exit 1
+fi
# unset stuff
export PACKAGE_NAME="null"
@@ -48,10 +51,10 @@ REPO=$(value "repo")
CI=$(value "ci")
PACKAGE_NAME=$(value "package")
-[ "$PACKAGE_NAME" = null ] && PACKAGE_NAME="$PACKAGE"
+[ "$PACKAGE_NAME" != null ] || PACKAGE_NAME="$PACKAGE"
GIT_HOST=$(value "git_host")
-[ "$GIT_HOST" = null ] && GIT_HOST=github.com
+[ "$GIT_HOST" != null ] || GIT_HOST=github.com
export PACKAGE_NAME
export REPO
@@ -66,12 +69,12 @@ VERSION=$(value "version")
if [ "$CI" = "true" ]; then
EXT=$(value "extension")
- [ "$EXT" = null ] && EXT="tar.zst"
+ [ "$EXT" != null ] || EXT="tar.zst"
NAME=$(value "name")
DISABLED=$(echo "$JSON" | jq -j '.disabled_platforms')
- [ "$NAME" = null ] && NAME="$PACKAGE_NAME"
+ [ "$NAME" != null ] || NAME="$PACKAGE_NAME"
export EXT
export NAME
@@ -90,7 +93,7 @@ ARTIFACT=$(value "artifact")
SHA=$(value "sha")
GIT_VERSION=$(value "git_version")
-[ "$GIT_VERSION" = null ] && GIT_VERSION="$VERSION"
+[ "$GIT_VERSION" != null ] || GIT_VERSION="$VERSION"
if [ "$GIT_VERSION" != null ]; then
VERSION_REPLACE="$GIT_VERSION"
@@ -98,8 +101,11 @@ else
VERSION_REPLACE="$VERSION"
fi
-echo "$TAG" | grep -e "%VERSION%" >/dev/null &&
- HAS_REPLACE=true || HAS_REPLACE=false
+if echo "$TAG" | grep -e "%VERSION%" >/dev/null; then
+ HAS_REPLACE=true
+else
+ HAS_REPLACE=false
+fi
ORIGINAL_TAG="$TAG"
@@ -145,7 +151,7 @@ export KEY
################
HASH_ALGO=$(value "hash_algo")
-[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
+[ "$HASH_ALGO" != null ] || HASH_ALGO=sha512
HASH=$(value "hash")
diff --git a/tools/cpm/package/version.sh b/tools/cpm/package/version.sh
index b92098f532..fef78124a0 100755
--- a/tools/cpm/package/version.sh
+++ b/tools/cpm/package/version.sh
@@ -1,6 +1,6 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
# shellcheck disable=SC1091
@@ -20,14 +20,14 @@ EOF
PACKAGE="$1"
NEW_VERSION="$2"
-[ -z "$PACKAGE" ] && usage
-[ -z "$NEW_VERSION" ] && usage
+[ -n "$PACKAGE" ] || usage
+[ -n "$NEW_VERSION" ] || usage
export PACKAGE
. "$SCRIPTS"/vars.sh
-[ "$REPO" = null ] && exit 0
+[ "$REPO" != null ] || exit 0
if [ "$HAS_REPLACE" = "true" ]; then
# this just extracts the tag prefix
@@ -54,7 +54,7 @@ fi
echo "-- * -- Updating $PACKAGE to version $NEW_VERSION"
"$SCRIPTS"/util/replace.sh "$PACKAGE" "$NEW_JSON"
-[ "$CI" = "true" ] && exit 0
+[ "$CI" != "true" ] || exit 0
echo "-- * -- Fixing hash"
. "$ROOTDIR"/common.sh
UPDATE=true QUIET=true "$SCRIPTS"/util/fix-hash.sh
diff --git a/tools/cpm/package/which.sh b/tools/cpm/package/which.sh
index de3ca41c02..24c80760e3 100755
--- a/tools/cpm/package/which.sh
+++ b/tools/cpm/package/which.sh
@@ -1,12 +1,12 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
# check which file a package is in
JSON=$(echo "$CPMFILES" | xargs grep -l "\"$1\"")
-[ -z "$JSON" ] && echo "!! No cpmfile definition for $1" >&2 && exit 1
+[ -n "$JSON" ] || { echo "!! No cpmfile definition for $1" >&2 && exit 1; }
echo "$JSON"
diff --git a/tools/cpm/update.sh b/tools/cpm/update.sh
index 81bb84c80a..15fd937242 100755
--- a/tools/cpm/update.sh
+++ b/tools/cpm/update.sh
@@ -1,16 +1,19 @@
#!/bin/sh -e
-# SPDX-FileCopyrightText: Copyright 2025 crueter
+# SPDX-FileCopyrightText: Copyright 2026 crueter
# SPDX-License-Identifier: LGPL-3.0-or-later
# updates CPMUtil, its docs, and related tools from the latest release
-if command -v zstd >/dev/null; then
+if command -v zstd >/dev/null 2>&1; then
EXT=tar.zst
else
EXT=tar.gz
fi
-wget "https://git.crueter.xyz/CMake/CPMUtil/releases/download/continuous/CPMUtil.$EXT"
-tar xf "CPMUtil.$EXT"
-rm "CPMUtil.$EXT"
+file=CPMUtil.$EXT
+url="https://git.crueter.xyz/CMake/CPMUtil/releases/download/continuous/$file"
+
+curl -L "$url" -o "$file"
+tar xf "$file"
+rm "$file"