Eigenständige Linux-Anwendung bereitstellen
Some checks failed
Tests / test (push) Has been cancelled
Some checks failed
Tests / test (push) Has been cancelled
This commit is contained in:
104
scripts/build-standalone.sh
Executable file
104
scripts/build-standalone.sh
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
||||
OUT=${1:-$ROOT/dist/csr-intake-x86_64.run}
|
||||
GUI="$ROOT/gui/target/release/intake-gui"
|
||||
SCANNER="$ROOT/scanner/target/release/pc-intake"
|
||||
MANIFEST="$ROOT/build/release.json"
|
||||
|
||||
for file in "$GUI" "$SCANNER" "$MANIFEST"; do
|
||||
[[ -f $file ]] || {
|
||||
echo 'Release files are missing. Run bash scripts/build-release.sh first.' >&2
|
||||
exit 2
|
||||
}
|
||||
done
|
||||
|
||||
BUILD_ID=$(python3 "$ROOT/scripts/release-manifest.py" --source-id)
|
||||
GUI_VERSION=$("$GUI" --version)
|
||||
grep -qF "$BUILD_ID" <<< "$GUI_VERSION" || {
|
||||
echo 'Release binaries are stale. Run bash scripts/build-release.sh first.' >&2
|
||||
exit 2
|
||||
}
|
||||
VERSION=$(sed -E 's/^CS-R Intake ([^ ]+).*/\1/' <<< "$GUI_VERSION")
|
||||
|
||||
TMP=$(mktemp -d)
|
||||
cleanup() {
|
||||
find "$TMP" -depth -delete 2>/dev/null || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
mkdir -p "$TMP/app" "$(dirname "$OUT")"
|
||||
install -m755 "$GUI" "$TMP/app/intake-gui"
|
||||
install -m755 "$SCANNER" "$TMP/app/pc-intake"
|
||||
install -m644 "$MANIFEST" "$TMP/app/release.json"
|
||||
(
|
||||
cd "$TMP/app"
|
||||
sha256sum intake-gui pc-intake release.json > SHA256SUMS
|
||||
)
|
||||
tar -C "$TMP/app" -czf "$TMP/payload.tar.gz" .
|
||||
|
||||
cat > "$TMP/launcher" <<EOF
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
BUILD_ID='$BUILD_ID'
|
||||
VERSION='$VERSION'
|
||||
PAYLOAD_LINE=__PAYLOAD_LINE__
|
||||
|
||||
cache_root=\${XDG_CACHE_HOME:-\${HOME:-\$PWD}/.cache}/csr-intake
|
||||
app_dir=\$cache_root/\$BUILD_ID
|
||||
|
||||
extract_bundle() {
|
||||
bundle_valid() {
|
||||
[ -x "\$app_dir/intake-gui" ] && [ -x "\$app_dir/pc-intake" ] &&
|
||||
(cd "\$app_dir" && sha256sum -c SHA256SUMS >/dev/null 2>&1)
|
||||
}
|
||||
if ! bundle_valid; then
|
||||
if [ -e "\$app_dir" ]; then
|
||||
find "\$app_dir" -depth -delete 2>/dev/null || true
|
||||
fi
|
||||
temp_dir=\$cache_root/.extract-\$BUILD_ID-\$\$
|
||||
mkdir -p "\$temp_dir"
|
||||
trap 'find "\$temp_dir" -depth -delete 2>/dev/null || true' EXIT HUP INT TERM
|
||||
tail -n +"\$PAYLOAD_LINE" "\$0" | gzip -dc | tar -xf - -C "\$temp_dir"
|
||||
(cd "\$temp_dir" && sha256sum -c SHA256SUMS >/dev/null)
|
||||
mkdir -p "\$cache_root"
|
||||
if ! mv -T "\$temp_dir" "\$app_dir" 2>/dev/null; then
|
||||
find "\$temp_dir" -depth -delete 2>/dev/null || true
|
||||
fi
|
||||
trap - EXIT HUP INT TERM
|
||||
fi
|
||||
bundle_valid
|
||||
}
|
||||
|
||||
case \${1:-} in
|
||||
--version)
|
||||
printf 'CS-R Intake %s · %s\n' "\$VERSION" "\$BUILD_ID"
|
||||
exit 0
|
||||
;;
|
||||
--check-bundle)
|
||||
extract_bundle
|
||||
printf 'Standalone bundle verified: %s\n' "\$BUILD_ID"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
extract_bundle
|
||||
data_dir=\${XDG_DATA_HOME:-\${HOME:-\$PWD}/.local/share}/csr-intake
|
||||
has_data=0
|
||||
for argument in "\$@"; do
|
||||
[ "\$argument" = '--data' ] && has_data=1
|
||||
done
|
||||
export CSR_SCANNER="\$app_dir/pc-intake"
|
||||
if [ "\$has_data" -eq 1 ]; then
|
||||
exec "\$app_dir/intake-gui" "\$@"
|
||||
fi
|
||||
exec "\$app_dir/intake-gui" "\$@" --data "\$data_dir"
|
||||
EOF
|
||||
|
||||
payload_line=$(( $(wc -l < "$TMP/launcher") + 1 ))
|
||||
sed -i "s/__PAYLOAD_LINE__/$payload_line/" "$TMP/launcher"
|
||||
cat "$TMP/launcher" "$TMP/payload.tar.gz" > "$OUT"
|
||||
chmod 755 "$OUT"
|
||||
"$OUT" --check-bundle
|
||||
echo "Standalone executable created: $OUT"
|
||||
Reference in New Issue
Block a user