[tools] refactor: reorganize, commonalities, moar tags, posix compat
All checks were successful
eden-license / license-header (pull_request) Successful in 24s

all scripts are fully posix compliant

Signed-off-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
crueter 2025-10-04 04:59:04 -04:00
parent 9c70334170
commit d9e641157e
Signed by: crueter
GPG key ID: 425ACD2D4830EBC6
18 changed files with 458 additions and 375 deletions

1
.shellcheckrc Normal file
View file

@ -0,0 +1 @@
shell=sh

View file

@ -26,9 +26,10 @@
}, },
"fmt": { "fmt": {
"repo": "fmtlib/fmt", "repo": "fmtlib/fmt",
"tag": "12.0.0", "tag": "%VERSION%",
"hash": "c4ab814c20fbad7e3f0ae169125a4988a2795631194703251481dc36b18da65c886c4faa9acd046b0a295005217b3689eb0126108a9ba5aac2ca909aae263c2f", "hash": "c4ab814c20fbad7e3f0ae169125a4988a2795631194703251481dc36b18da65c886c4faa9acd046b0a295005217b3689eb0126108a9ba5aac2ca909aae263c2f",
"version": "8" "version": "8",
"git_version": "12.0.0"
}, },
"lz4": { "lz4": {
"name": "lz4", "name": "lz4",

View file

@ -49,16 +49,18 @@
"xbyak": { "xbyak": {
"package": "xbyak", "package": "xbyak",
"repo": "herumi/xbyak", "repo": "herumi/xbyak",
"sha": "v7.22", "tag": "v%VERSION%",
"hash": "ff4a461b35ced007adbe9b388a90e4b53c46f9250260a559c04a757ad34ac482baf92700f113c106af6512d6894e849c4409efaf1c003207bf245a5910d848a1", "hash": "ff4a461b35ced007adbe9b388a90e4b53c46f9250260a559c04a757ad34ac482baf92700f113c106af6512d6894e849c4409efaf1c003207bf245a5910d848a1",
"git_version": "7.22",
"bundled": true, "bundled": true,
"skip_updates": true "skip_updates": true
}, },
"oaknut": { "oaknut": {
"repo": "eden-emulator/oaknut",
"version": "2.0.1", "version": "2.0.1",
"repo": "merryhime/oaknut", "git_version": "2.0.3",
"sha": "94c726ce03", "tag": "v%VERSION%",
"hash": "d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac" "hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856"
}, },
"libadrenotools": { "libadrenotools": {
"repo": "bylaws/libadrenotools", "repo": "bylaws/libadrenotools",
@ -70,8 +72,9 @@
}, },
"oboe": { "oboe": {
"repo": "google/oboe", "repo": "google/oboe",
"tag": "1.10.0", "tag": "%VERSION%",
"hash": "ce4011afe7345370d4ead3b891cd69a5ef224b129535783586c0ca75051d303ed446e6c7f10bde8da31fff58d6e307f1732a3ffd03b249f9ef1fd48fd4132715", "hash": "ce4011afe7345370d4ead3b891cd69a5ef224b129535783586c0ca75051d303ed446e6c7f10bde8da31fff58d6e307f1732a3ffd03b249f9ef1fd48fd4132715",
"git_version": "1.10.0",
"bundled": true "bundled": true
}, },
"unordered-dense": { "unordered-dense": {
@ -103,7 +106,8 @@
"vulkan-utility-headers": { "vulkan-utility-headers": {
"package": "VulkanUtilityLibraries", "package": "VulkanUtilityLibraries",
"repo": "scripts/VulkanUtilityHeaders", "repo": "scripts/VulkanUtilityHeaders",
"tag": "1.4.328", "tag": "%VERSION%",
"git_version": "1.4.328",
"artifact": "VulkanUtilityHeaders.tar.zst", "artifact": "VulkanUtilityHeaders.tar.zst",
"git_host": "git.crueter.xyz", "git_host": "git.crueter.xyz",
"hash": "9922217b39faf73cd4fc1510f2fdba14a49aa5c0d77f9ee24ee0512cef16b234d0cabc83c1fec861fa5df1d43e7f086ca9b6501753899119f39c5ca530cb0dae" "hash": "9922217b39faf73cd4fc1510f2fdba14a49aa5c0d77f9ee24ee0512cef16b234d0cabc83c1fec861fa5df1d43e7f086ca9b6501753899119f39c5ca530cb0dae"

View file

@ -1,14 +0,0 @@
#!/bin/bash -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
# shellcheck disable=SC2038
# shellcheck disable=SC2016
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
LIBS=$(echo "$PACKAGES" | jq -j 'keys_unsorted | join(" ")')
tools/cpm-fetch.sh $LIBS

1
tools/cpm-fetch-all.sh Symbolic link
View file

@ -0,0 +1 @@
cpm/fetch-all.sh

View file

@ -1,236 +0,0 @@
#!/bin/bash -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
[ -z "$CPM_SOURCE_CACHE" ] && CPM_SOURCE_CACHE=$PWD/.cache/cpm
mkdir -p $CPM_SOURCE_CACHE
# fetch json once to make lives easier
# shellcheck disable=SC2038
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
ROOTDIR="$PWD"
TMP=$(mktemp -d)
download_package() {
FILENAME=$(basename "$DOWNLOAD")
OUTFILE="$TMP/$FILENAME"
LOWER_PACKAGE=$(tr '[:upper:]' '[:lower:]' <<< "$PACKAGE_NAME")
OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
[ -d "$OUTDIR" ] && return
curl "$DOWNLOAD" -sS -L -o "$OUTFILE"
ACTUAL_HASH=$(${HASH_ALGO}sum "$OUTFILE" | cut -d" " -f1)
[ "$ACTUAL_HASH" != "$HASH" ] && echo "!! $FILENAME did not match expected hash; expected $HASH but got $ACTUAL_HASH" && exit 1
mkdir -p "$OUTDIR"
pushd "$OUTDIR" > /dev/null
case "$FILENAME" in
(*.7z)
7z x "$OUTFILE" > /dev/null
;;
(*.tar*)
tar xf "$OUTFILE" > /dev/null
;;
(*.zip)
unzip "$OUTFILE" > /dev/null
;;
esac
# basically if only one real item exists at the top we just move everything from there
# since github and some vendors hate me
DIRS=$(find -maxdepth 1 -type d -o -type f)
# thanks gnu
if [ "$(wc -l <<< "$DIRS")" -eq 2 ]; then
SUBDIR=$(find . -maxdepth 1 -type d -not -name ".")
mv "$SUBDIR"/* .
mv "$SUBDIR"/.* . 2>/dev/null || true
rmdir "$SUBDIR"
fi
if grep -e "patches" <<< "$JSON" > /dev/null; then
PATCHES=$(jq -r '.patches | join(" ")' <<< "$JSON")
for patch in $PATCHES; do
patch --binary -p1 < "$ROOTDIR"/.patch/$package/$patch
done
fi
popd > /dev/null
}
ci_package() {
EXT=$(jq -r '.extension' <<< "$JSON")
[ "$EXT" = null ] && EXT="tar.zst"
VERSION=$(jq -r ".version" <<< "$JSON")
NAME=$(jq -r ".name" <<< "$JSON")
[ "$NAME" = null ] && NAME="$PACKAGE"
PACKAGE=$(jq -r ".package | \"$package\"" <<< "$JSON")
DISABLED=$(jq -j '.disabled_platforms' <<< "$JSON")
[ "$REPO" = null ] && echo "No repo defined for CI package $package" && return
echo "-- CI package $PACKAGE"
for platform in windows-amd64 windows-arm64 android solaris-amd64 freebsd-amd64 linux-amd64 linux-aarch64 macos-universal; do
echo "-- * platform $platform"
case $DISABLED in
(*"$platform"*)
echo "-- * -- disabled"
continue
;;
(*) ;;
esac
FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
DOWNLOAD="https://$GIT_HOST/${REPO}/releases/download/v${VERSION}/${FILENAME}"
PACKAGE_NAME="$PACKAGE"
KEY=$platform
LOWER_PACKAGE=$(tr '[:upper:]' '[:lower:]' <<< "$PACKAGE_NAME")
OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
[ -d "$OUTDIR" ] && continue
HASH_ALGO=$(jq -r ".hash_algo" <<< "$JSON")
[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
HASH_SUFFIX="${HASH_ALGO}sum"
HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
HASH=$(curl "$HASH_URL" -sS -q -L -o -)
download_package
done
}
for package in "$@"
do
# prepare for cancer
JSON=$(echo "$PACKAGES" | jq -r ".\"$package\" | select( . != null )")
[ -z "$JSON" ] && echo "!! No cpmfile definition for $package" && continue
PACKAGE_NAME=$(jq -r ".package" <<< "$JSON")
[ "$PACKAGE_NAME" = null ] && PACKAGE_NAME="$package"
GIT_HOST=$(jq -r ".git_host" <<< "$JSON")
[ "$GIT_HOST" = null ] && GIT_HOST=github.com
REPO=$(jq -r ".repo" <<< "$JSON")
CI=$(jq -r ".ci" <<< "$JSON")
if [ "$CI" != null ]; then
ci_package
continue
fi
VERSION=$(jq -r ".version" <<< "$JSON")
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
[ "$GIT_VERSION" = null ] && GIT_VERSION="$VERSION"
# url parsing
URL=$(jq -r ".url" <<< "$JSON")
SHA=$(jq -r ".sha" <<< "$JSON")
VERSION=$(jq -r ".version" <<< "$JSON")
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
if [ "$GIT_VERSION" != null ]; then
VERSION_REPLACE="$GIT_VERSION"
else
VERSION_REPLACE="$VERSION"
fi
TAG=$(jq -r ".tag" <<< "$JSON")
TAG=$(sed "s/%VERSION%/$VERSION_REPLACE/" <<< $TAG)
ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
ARTIFACT=$(sed "s/%VERSION%/$VERSION_REPLACE/" <<< $ARTIFACT)
ARTIFACT=$(sed "s/%TAG%/$TAG/" <<< $ARTIFACT)
if [ "$URL" != "null" ]; then
DOWNLOAD="$URL"
elif [ "$REPO" != "null" ]; then
GIT_URL="https://$GIT_HOST/$REPO"
BRANCH=$(jq -r ".branch" <<< "$JSON")
if [ "$TAG" != "null" ]; then
if [ "$ARTIFACT" != "null" ]; then
DOWNLOAD="${GIT_URL}/releases/download/${TAG}/${ARTIFACT}"
else
DOWNLOAD="${GIT_URL}/archive/refs/tags/${TAG}.tar.gz"
fi
elif [ "$SHA" != "null" ]; then
DOWNLOAD="${GIT_URL}/archive/${SHA}.zip"
else
if [ "$BRANCH" = null ]; then
BRANCH=master
fi
DOWNLOAD="${GIT_URL}/archive/refs/heads/${BRANCH}.zip"
fi
else
echo "!! No repo or URL defined for $package"
continue
fi
# key parsing
KEY=$(jq -r ".key" <<< "$JSON")
if [ "$KEY" = null ]; then
if [ "$SHA" != null ]; then
KEY=$(cut -c1-4 - <<< "$SHA")
elif [ "$GIT_VERSION" != null ]; then
KEY="$GIT_VERSION"
elif [ "$TAG" != null ]; then
KEY="$TAG"
elif [ "$VERSION" != null ]; then
KEY="$VERSION"
else
echo "!! No valid key could be determined for $package. Must define one of: key, sha, tag, version, git_version"
continue
fi
fi
echo "-- Downloading regular package $package, with key $KEY, from $DOWNLOAD"
# hash parsing
HASH_ALGO=$(jq -r ".hash_algo" <<< "$JSON")
[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
HASH=$(jq -r ".hash" <<< "$JSON")
if [ "$HASH" = null ]; then
HASH_SUFFIX="${HASH_ALGO}sum"
HASH_URL=$(jq -r ".hash_url" <<< "$JSON")
if [ "$HASH_URL" = null ]; then
HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
fi
HASH=$(curl "$HASH_URL" -Ss -L -o -)
fi
download_package
done
rm -rf $TMP

View file

@ -6,9 +6,10 @@
# SPDX-FileCopyrightText: 2025 crueter # SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# shellcheck disable=SC2038 SCRIPT_DIR=$(dirname -- "$0")
# shellcheck disable=SC2016
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
LIBS=$(echo "$PACKAGES" | jq -j 'keys_unsorted | join(" ")')
tools/cpm/check-hash.sh $LIBS # shellcheck disable=SC1091
. tools/cpm/common.sh
# shellcheck disable=SC2086
"$SCRIPT_DIR"/check-hash.sh $LIBS

View file

@ -6,6 +6,10 @@
# SPDX-FileCopyrightText: 2025 crueter # SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
LIBS=$(find . src -maxdepth 3 -name cpmfile.json -exec jq -j 'keys_unsorted | join(" ")' {} \; -printf " ") SCRIPT_DIR=$(dirname -- "$0")
tools/cpm/check-updates.sh $LIBS # shellcheck disable=SC1091
. tools/cpm/common.sh
# shellcheck disable=SC2086
"$SCRIPT_DIR"/check-updates.sh $LIBS

View file

@ -1,4 +1,4 @@
#!/bin/bash -e #!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
@ -7,88 +7,26 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# env vars: # env vars:
# - UPDATE: update if available # - UPDATE: fix hashes if needed
# - FORCE: forcefully update
# shellcheck disable=SC2016 # shellcheck disable=SC1091
# shellcheck disable=SC2038 . tools/cpm/common.sh
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
for package in "$@" for package in "$@"
do do
JSON=$(echo "$PACKAGES" | jq -r ".\"$package\" | select( . != null )") export package
# shellcheck disable=SC1091
. tools/cpm/package.sh
[ -z "$JSON" ] && echo "!! No cpmfile definition for $package" && continue
GIT_HOST=$(jq -r ".git_host" <<< "$JSON")
[ "$GIT_HOST" = null ] && GIT_HOST=github.com
CI=$(jq -r ".ci" <<< "$JSON")
if [ "$CI" != null ]; then if [ "$CI" != null ]; then
continue continue
fi fi
HASH_URL=$(jq -r ".hash_url" <<< "$JSON")
[ "$HASH_URL" != null ] && continue [ "$HASH_URL" != null ] && continue
[ "$HASH_SUFFIX" != null ] && continue
REPO=$(jq -r ".repo" <<< "$JSON")
TAG=$(jq -r ".tag" <<< "$JSON")
URL=$(jq -r ".url" <<< "$JSON")
SHA=$(jq -r ".sha" <<< "$JSON")
echo "-- Package $package" echo "-- Package $package"
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
VERSION=$(jq -r ".version" <<< "$JSON")
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON")
if [ "$GIT_VERSION" != null ]; then
VERSION_REPLACE="$GIT_VERSION"
else
VERSION_REPLACE="$VERSION"
fi
TAG=${TAG//%VERSION%/$VERSION_REPLACE}
ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
ARTIFACT=${ARTIFACT//%VERSION%/$VERSION_REPLACE}
ARTIFACT=${ARTIFACT//%TAG%/$TAG}
if [ "$URL" != "null" ]; then
DOWNLOAD="$URL"
elif [ "$REPO" != "null" ]; then
GIT_URL="https://$GIT_HOST/$REPO"
BRANCH=$(jq -r ".branch" <<< "$JSON")
if [ "$TAG" != "null" ]; then
if [ "$ARTIFACT" != "null" ]; then
DOWNLOAD="${GIT_URL}/releases/download/${TAG}/${ARTIFACT}"
else
DOWNLOAD="${GIT_URL}/archive/refs/tags/${TAG}.tar.gz"
fi
elif [ "$SHA" != "null" ]; then
DOWNLOAD="${GIT_URL}/archive/${SHA}.zip"
else
if [ "$BRANCH" = null ]; then
BRANCH=master
fi
DOWNLOAD="${GIT_URL}/archive/refs/heads/${BRANCH}.zip"
fi
else
echo "!! No repo or URL defined for $package"
continue
fi
# hash parsing
HASH_ALGO=$(jq -r ".hash_algo" <<< "$JSON")
[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
HASH=$(jq -r ".hash" <<< "$JSON")
[ "$HASH" = null ] && echo "-- * Warning: no hash specified" && continue [ "$HASH" = null ] && echo "-- * Warning: no hash specified" && continue
export USE_TAG=true export USE_TAG=true

View file

@ -1,4 +1,4 @@
#!/bin/bash -e #!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
@ -10,42 +10,26 @@
# - UPDATE: update if available # - UPDATE: update if available
# - FORCE: forcefully update # - FORCE: forcefully update
# shellcheck disable=SC2016 # shellcheck disable=SC1091
# shellcheck disable=SC2038 . tools/cpm/common.sh
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
for package in "$@" for package in "$@"
do do
JSON=$(echo "$PACKAGES" | jq -r ".\"$package\" | select( . != null )") export package
# shellcheck disable=SC1091
. tools/cpm/package.sh
[ -z "$JSON" ] && echo "!! No cpmfile definition for $package" && continue SKIP=$(value "skip_updates")
GIT_HOST=$(jq -r ".git_host" <<< "$JSON")
[ "$GIT_HOST" = null ] && GIT_HOST=github.com
REPO=$(jq -r ".repo" <<< "$JSON")
TAG=$(jq -r ".tag" <<< "$JSON")
SKIP=$(jq -r ".skip_updates" <<< "$JSON")
[ "$SKIP" = "true" ] && continue [ "$SKIP" = "true" ] && continue
[ "$REPO" = null ] && continue # echo "No repo defined for $package, skipping" && continue [ "$REPO" = null ] && continue
[ "$GIT_HOST" != "github.com" ] && continue # echo "Unsupported host $GIT_HOST for $package, skipping" && continue [ "$GIT_HOST" != "github.com" ] && continue # TODO
[ "$TAG" = null ] && continue # echo "No tag defined for $package, skipping" && continue [ "$TAG" = null ] && continue
echo "-- Package $package" echo "-- Package $package"
GIT_VERSION=$(jq -r ".git_version" <<< "$JSON") # TODO(crueter): Support for Forgejo updates w/ forgejo_token
echo "$TAG" | grep -e "%VERSION%" > /dev/null && HAS_REPLACE=true || HAS_REPLACE=false
ORIGINAL_TAG="$TAG"
TAG=${TAG//%VERSION%/$GIT_VERSION}
ARTIFACT=$(jq -r ".artifact" <<< "$JSON")
ARTIFACT=${ARTIFACT//%VERSION%/$GIT_VERSION}
ARTIFACT=${ARTIFACT//%TAG%/$TAG}
# Use gh-cli to avoid ratelimits lmao # Use gh-cli to avoid ratelimits lmao
TAGS=$(gh api --method GET "/repos/$REPO/tags") TAGS=$(gh api --method GET "/repos/$REPO/tags")
@ -58,14 +42,6 @@ do
TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("beta"; "i") | not)]') TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("beta"; "i") | not)]')
TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("rc"; "i") | not)]') TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("rc"; "i") | not)]')
if [ "$HAS_REPLACE" = "true" ]; then
# this just extracts the tag prefix
VERSION_PREFIX=$(echo "$ORIGINAL_TAG" | cut -d"%" -f1)
# then we strip out the prefix from the new tag, and make that our new git_version
NEW_GIT_VERSION=${LATEST//$VERSION_PREFIX/}
fi
# thanks fmt # thanks fmt
[ "$package" = fmt ] && TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("v0.11"; "i") | not)]') [ "$package" = fmt ] && TAGS=$(echo "$TAGS" | jq '[.[] | select(.name | test("v0.11"; "i") | not)]')
@ -73,6 +49,14 @@ do
[ "$LATEST" = "$TAG" ] && [ "$FORCE" != "true" ] && echo "-- * Up-to-date" && continue [ "$LATEST" = "$TAG" ] && [ "$FORCE" != "true" ] && echo "-- * Up-to-date" && continue
if [ "$HAS_REPLACE" = "true" ]; then
# this just extracts the tag prefix
VERSION_PREFIX=$(echo "$ORIGINAL_TAG" | cut -d"%" -f1)
# then we strip out the prefix from the new tag, and make that our new git_version
NEW_GIT_VERSION=$(echo "$LATEST" | sed "s/$VERSION_PREFIX//g")
fi
echo "-- * Version $LATEST available, current is $TAG" echo "-- * Version $LATEST available, current is $TAG"
export USE_TAG=true export USE_TAG=true

19
tools/cpm/common.sh Executable file
View file

@ -0,0 +1,19 @@
#!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
# shellcheck disable=SC2038
# shellcheck disable=SC2016
[ -z "$PACKAGES" ] && PACKAGES=$(find . src -maxdepth 3 -name cpmfile.json | xargs jq -s 'reduce .[] as $item ({}; . * $item)')
LIBS=$(echo "$PACKAGES" | jq -j 'keys_unsorted | join(" ")')
export PACKAGES
export LIBS
value() {
echo "$JSON" | jq -r ".$1"
}

103
tools/cpm/download.sh Executable file
View file

@ -0,0 +1,103 @@
#!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
# env vars:
# - UPDATE: fix hashes if needed
# shellcheck disable=SC1091
. tools/cpm/common.sh
download_package() {
FILENAME=$(basename "$DOWNLOAD")
OUTFILE="$TMP/$FILENAME"
LOWER_PACKAGE=$(echo "$PACKAGE_NAME" | tr '[:upper:]' '[:lower:]')
OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
[ -d "$OUTDIR" ] && return
curl "$DOWNLOAD" -sS -L -o "$OUTFILE"
ACTUAL_HASH=$("${HASH_ALGO}"sum "$OUTFILE" | cut -d" " -f1)
[ "$ACTUAL_HASH" != "$HASH" ] && echo "!! $FILENAME did not match expected hash; expected $HASH but got $ACTUAL_HASH" && exit 1
mkdir -p "$OUTDIR"
PREVDIR="$PWD"
cd "$OUTDIR"
case "$FILENAME" in
(*.7z)
7z x "$OUTFILE" > /dev/null
;;
(*.tar*)
tar xf "$OUTFILE" > /dev/null
;;
(*.zip)
unzip "$OUTFILE" > /dev/null
;;
esac
# basically if only one real item exists at the top we just move everything from there
# since github and some vendors hate me
DIRS=$(find . -maxdepth 1 -type d -o -type f)
# thanks gnu
if [ "$(echo "$DIRS" | wc -l)" -eq 2 ]; then
SUBDIR=$(find . -maxdepth 1 -type d -not -name ".")
mv "$SUBDIR"/* .
mv "$SUBDIR"/.* . 2>/dev/null || true
rmdir "$SUBDIR"
fi
if echo "$JSON" | grep -e "patches" > /dev/null; then
PATCHES=$(echo "$JSON" | jq -r '.patches | join(" ")')
for patch in $PATCHES; do
# shellcheck disable=SC2154
patch --binary -p1 < "$ROOTDIR/.patch/$package/$patch"
done
fi
cd "$PREVDIR"
}
ci_package() {
[ "$REPO" = null ] && echo "-- ! No repo defined" && return
echo "-- CI package $PACKAGE_NAME"
for platform in windows-amd64 windows-arm64 android solaris-amd64 freebsd-amd64 linux-amd64 linux-aarch64 macos-universal; do
echo "-- * platform $platform"
case $DISABLED in
(*"$platform"*)
echo "-- * -- disabled"
continue
;;
(*) ;;
esac
FILENAME="${NAME}-${platform}-${VERSION}.${EXT}"
DOWNLOAD="https://$GIT_HOST/${REPO}/releases/download/v${VERSION}/${FILENAME}"
KEY=$platform
LOWER_PACKAGE=$(echo "$PACKAGE_NAME" | tr '[:upper:]' '[:lower:]')
OUTDIR="${CPM_SOURCE_CACHE}/${LOWER_PACKAGE}/${KEY}"
[ -d "$OUTDIR" ] && continue
HASH_ALGO=$(value "hash_algo")
[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
HASH_SUFFIX="${HASH_ALGO}sum"
HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
HASH=$(curl "$HASH_URL" -sS -q -L -o -)
download_package
done
}

13
tools/cpm/fetch-all.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
# shellcheck disable=SC1091
. tools/cpm/common.sh
# shellcheck disable=SC2086
tools/cpm/fetch.sh $LIBS

39
tools/cpm/fetch.sh Executable file
View file

@ -0,0 +1,39 @@
#!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
[ -z "$CPM_SOURCE_CACHE" ] && CPM_SOURCE_CACHE=$PWD/.cache/cpm
mkdir -p "$CPM_SOURCE_CACHE"
# shellcheck disable=SC1091
. tools/cpm/common.sh
# shellcheck disable=SC1091
. tools/cpm/download.sh
# shellcheck disable=SC2034
ROOTDIR="$PWD"
TMP=$(mktemp -d)
# shellcheck disable=SC2034
for package in "$@"
do
export package
# shellcheck disable=SC1091
. tools/cpm/package.sh
if [ "$CI" = "true" ]; then
ci_package
else
echo "-- Downloading regular package $package, with key $KEY, from $DOWNLOAD"
download_package
fi
done
rm -rf "$TMP"

View file

@ -6,6 +6,6 @@
FILES=$(find . src -maxdepth 3 -name cpmfile.json) FILES=$(find . src -maxdepth 3 -name cpmfile.json)
for file in $FILES; do for file in $FILES; do
jq --indent 4 < $file > $file.new jq --indent 4 < "$file" > "$file".new
mv $file.new $file mv "$file".new "$file"
done done

View file

@ -11,7 +11,7 @@ REPO="$1"
GIT_URL="https://$GIT_HOST/$REPO" GIT_URL="https://$GIT_HOST/$REPO"
if [ "$USE_TAG" = "true" ]; then if [ "$USE_TAG" = "true" ]; then
if [ -z "$ARTIFACT" ]; then if [ -z "$ARTIFACT" ] || [ "$ARTIFACT" = "null" ]; then
URL="${GIT_URL}/archive/refs/tags/$2.tar.gz" URL="${GIT_URL}/archive/refs/tags/$2.tar.gz"
else else
URL="${GIT_URL}/releases/download/$2/${ARTIFACT}" URL="${GIT_URL}/releases/download/$2/${ARTIFACT}"

225
tools/cpm/package.sh Executable file
View file

@ -0,0 +1,225 @@
#!/bin/sh -e
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later
# env vars:
# - UPDATE: fix hashes if needed
# shellcheck disable=SC1091
. tools/cpm/common.sh
[ -z "$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" && exit 1
# unset stuff
unset PACKAGE_NAME
unset REPO
unset CI
unset GIT_HOST
unset EXT
unset NAME
unset DISABLED
unset TAG
unset ARTIFACT
unset SHA
unset VERSION
unset GIT_VERSION
unset DOWNLOAD
unset URL
unset KEY
unset HASH
unset ORIGINAL_TAG
unset HAS_REPLACE
unset VERSION_REPLACE
unset HASH_URL
unset HASH_SUFFIX
unset HASH_ALGO
########
# Meta #
########
REPO=$(value "repo")
CI=$(value "ci")
PACKAGE_NAME=$(value "package")
[ "$PACKAGE_NAME" = null ] && PACKAGE_NAME="$package"
GIT_HOST=$(value "git_host")
[ "$GIT_HOST" = null ] && GIT_HOST=github.com
export PACKAGE_NAME
export REPO
export CI
export GIT_HOST
######################
# CI Package Parsing #
######################
VERSION=$(value "version")
if [ "$CI" = "true" ]; then
EXT=$(value "extension")
[ "$EXT" = null ] && EXT="tar.zst"
NAME=$(value "name")
DISABLED=$(echo "$JSON" | jq -j '.disabled_platforms')
[ "$NAME" = null ] && NAME="$PACKAGE"
export EXT
export NAME
export DISABLED
export VERSION
# slight annoyance
TAG=null
ARTIFACT=null
SHA=null
VERSION=null
GIT_VERSION=null
DOWNLOAD=null
URL=null
KEY=null
HASH=null
ORIGINAL_TAG=null
HAS_REPLACE=null
VERSION_REPLACE=null
HASH_URL=null
HASH_SUFFIX=null
HASH_ALGO=null
return 0
fi
##############
# Versioning #
##############
TAG=$(value "tag")
ARTIFACT=$(value "artifact")
SHA=$(value "sha")
GIT_VERSION=$(value "git_version")
[ "$GIT_VERSION" = null ] && GIT_VERSION="$VERSION"
if [ "$GIT_VERSION" != null ]; then
VERSION_REPLACE="$GIT_VERSION"
else
VERSION_REPLACE="$VERSION"
fi
echo "$TAG" | grep -e "%VERSION%" > /dev/null && HAS_REPLACE=true || HAS_REPLACE=false
ORIGINAL_TAG="$TAG"
TAG=$(echo "$TAG" | sed "s/%VERSION%/$VERSION_REPLACE/g")
ARTIFACT=$(echo "$ARTIFACT" | sed "s/%VERSION%/$VERSION_REPLACE/g")
ARTIFACT=$(echo "$ARTIFACT" | sed "s/%TAG%/$TAG/g")
export TAG
export ARTIFACT
export SHA
export VERSION
export GIT_VERSION
export ORIGINAL_TAG
export HAS_REPLACE
export VERSION_REPLACE
###############
# URL Parsing #
###############
URL=$(value "url")
if [ "$URL" != "null" ]; then
DOWNLOAD="$URL"
elif [ "$REPO" != "null" ]; then
GIT_URL="https://$GIT_HOST/$REPO"
BRANCH=$(value "branch")
if [ "$TAG" != "null" ]; then
if [ "$ARTIFACT" != "null" ]; then
DOWNLOAD="${GIT_URL}/releases/download/${TAG}/${ARTIFACT}"
else
DOWNLOAD="${GIT_URL}/archive/refs/tags/${TAG}.tar.gz"
fi
elif [ "$SHA" != "null" ]; then
DOWNLOAD="${GIT_URL}/archive/${SHA}.zip"
else
if [ "$BRANCH" = null ]; then
BRANCH=master
fi
DOWNLOAD="${GIT_URL}/archive/refs/heads/${BRANCH}.zip"
fi
else
echo "!! No repo or URL defined for $package"
exit 1
fi
export DOWNLOAD
export URL
###############
# Key Parsing #
###############
KEY=$(value "key")
if [ "$KEY" = null ]; then
if [ "$SHA" != null ]; then
KEY=$(echo "$SHA" | cut -c1-4)
elif [ "$GIT_VERSION" != null ]; then
KEY="$GIT_VERSION"
elif [ "$TAG" != null ]; then
KEY="$TAG"
elif [ "$VERSION" != null ]; then
KEY="$VERSION"
else
echo "!! No valid key could be determined for $package. Must define one of: key, sha, tag, version, git_version"
exit 1
fi
fi
export KEY
################
# Hash Parsing #
################
HASH_ALGO=$(value "hash_algo")
[ "$HASH_ALGO" = null ] && HASH_ALGO=sha512
HASH=$(value "hash")
if [ "$HASH" = null ]; then
HASH_SUFFIX="${HASH_ALGO}sum"
HASH_URL=$(value "hash_url")
if [ "$HASH_URL" = null ]; then
HASH_URL="${DOWNLOAD}.${HASH_SUFFIX}"
fi
HASH=$(curl "$HASH_URL" -Ss -L -o -)
else
HASH_URL=null
HASH_SUFFIX=null
fi
export HASH_URL
export HASH_SUFFIX
export HASH
export HASH_ALGO
export JSON

View file

@ -3,5 +3,5 @@
# SPDX-FileCopyrightText: 2025 crueter # SPDX-FileCopyrightText: 2025 crueter
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
SUM=$(wget -q $1 -O - | sha512sum) SUM=$(wget -q "$1" -O - | sha512sum)
echo "$SUM" | cut -d " " -f1 echo "$SUM" | cut -d " " -f1

View file

@ -9,4 +9,4 @@ JSON=$(find . src -maxdepth 3 -name cpmfile.json -exec grep -l "$1" {} \;)
[ -z "$JSON" ] && echo "!! No cpmfile definition for $1" [ -z "$JSON" ] && echo "!! No cpmfile definition for $1"
echo $JSON echo "$JSON"