merge AppImage builder into main repo with revised linux guide (#78)
Tested as working.
It is self-contained with no dependencies, uses relative paths, downloads what it needs on the fly, requires the main repo to already be cloned and built for native linux, so it doesn't need to be a separate repo.
- Copied the `build.sh` file and `assets` folder into a new `AppImageBuilder` folder on the torzu repo root.
- Created a `AppImage-build.sh` shortcut on the repo root that checks if an executable is already in `build/bin`. If it doesn't find one, it prompts the user to build a native version first. If it does find one:
- enters the `AppImageBuilder` folder
- runs the command `./build.sh ../build ./torzu.AppImage`, using the correct relative path to the build folder (if they followed the build instructions as directed)
- moves the resulting `torzu.AppImage` executable back into the main `torzu` folder
- returns back to the main folder and shows current directory contents
- Added relevant entries to `.gitignore`
- Added AppImage section to linux build guide, with some clarifying explanation for Flatpaks, and section separators
Co-authored-by: anon <anon@no.reply>
Reviewed-on: http://vub63vv26q6v27xzv2dtcd25xumubshogm67yrpaz2rculqxs7jlfqad.onion/torzu-emu/torzu/pulls/78
Co-authored-by: anon <anon@noreply.localhost>
Co-committed-by: anon <anon@noreply.localhost>
This commit is contained in:
BIN
AppImageBuilder/assets/bwrap
Executable file
BIN
AppImageBuilder/assets/bwrap
Executable file
Binary file not shown.
1
AppImageBuilder/assets/bwrap-info.txt
Normal file
1
AppImageBuilder/assets/bwrap-info.txt
Normal file
@@ -0,0 +1 @@
|
||||
This is a statically compiled bubblewrap 0.9.0 executable.
|
||||
6
AppImageBuilder/assets/torzu.desktop
Normal file
6
AppImageBuilder/assets/torzu.desktop
Normal file
@@ -0,0 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=torzu
|
||||
Icon=torzu
|
||||
Exec=AppRun
|
||||
Categories=Game;
|
||||
2
AppImageBuilder/assets/torzu.svg
Normal file
2
AppImageBuilder/assets/torzu.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 152 152" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><circle cx="75.585" cy="75.585" r="75.585" fill="url(#_Radial1)"/><clipPath id="_clip2"></clipPath><g clip-path="url(#_clip2)"><path d="m75.585 17.097c11.94-0 21.635 9.694 21.635 21.635s-9.695 21.635-21.635 21.635c-11.941 0-21.635-9.694-21.635-21.635s9.694-21.635 21.635-21.635zm-0 5.21c-9.066 0-16.425 7.36-16.425 16.425s7.359 16.425 16.425 16.425c9.065-0 16.424-7.36 16.424-16.425s-7.359-16.425-16.424-16.425z"/><path d="m75.585 27.343c6.285 0 11.388 5.103 11.388 11.389s-5.103 11.389-11.388 11.389c-6.286-0-11.389-5.103-11.389-11.389s5.103-11.389 11.389-11.389zm-0 5.21c-3.41 0-6.179 2.769-6.179 6.179s2.769 6.179 6.179 6.179 6.178-2.769 6.178-6.179-2.768-6.179-6.178-6.179z"/><path d="m112.44 53.95c11.941-0 21.635 9.694 21.635 21.635 0 11.94-9.694 21.635-21.635 21.635s-21.635-9.695-21.635-21.635c0-11.941 9.694-21.635 21.635-21.635zm0 5.21c-9.065-0-16.425 7.359-16.425 16.425 0 9.065 7.36 16.424 16.425 16.424s16.425-7.359 16.425-16.424c-0-9.066-7.36-16.425-16.425-16.425z"/><path d="m112.44 64.196c6.286-0 11.389 5.103 11.389 11.389-0 6.285-5.103 11.388-11.389 11.388s-11.389-5.103-11.389-11.388c0-6.286 5.103-11.389 11.389-11.389zm0 5.21c-3.41-0-6.178 2.769-6.178 6.179s2.768 6.178 6.178 6.178 6.179-2.768 6.179-6.178-2.769-6.179-6.179-6.179z"/><path d="m75.585 90.802c11.94 0 21.635 9.694 21.635 21.635s-9.695 21.635-21.635 21.635c-11.941 0-21.635-9.694-21.635-21.635s9.694-21.635 21.635-21.635zm-0 5.21c-9.066 0-16.425 7.36-16.425 16.425s7.359 16.425 16.425 16.425c9.065-0 16.424-7.36 16.424-16.425s-7.359-16.425-16.424-16.425z"/><path d="m75.585 101.05c6.285 0 11.388 5.103 11.388 11.389s-5.103 11.389-11.388 11.389c-6.286-0-11.389-5.103-11.389-11.389s5.103-11.389 11.389-11.389zm-0 5.211c-3.41-0-6.179 2.768-6.179 6.178s2.769 6.179 6.179 6.179 6.178-2.769 6.178-6.179-2.768-6.178-6.178-6.178z"/><path d="m38.732 53.95c11.941-0 21.635 9.694 21.635 21.635 0 11.94-9.694 21.635-21.635 21.635s-21.635-9.695-21.635-21.635c-0-11.941 9.694-21.635 21.635-21.635zm-0 5.21c-9.065-0-16.425 7.359-16.425 16.425 0 9.065 7.36 16.424 16.425 16.424s16.425-7.359 16.425-16.424c-0-9.066-7.36-16.425-16.425-16.425z"/><path d="m38.732 64.196c6.286-0 11.389 5.103 11.389 11.389-0 6.285-5.103 11.388-11.389 11.388s-11.389-5.103-11.389-11.388c0-6.286 5.103-11.389 11.389-11.389zm-0 5.21c-3.41-0-6.179 2.769-6.179 6.179s2.769 6.178 6.179 6.178 6.179-2.768 6.179-6.178-2.769-6.179-6.179-6.179z"/></g><defs><radialGradient id="_Radial1" cx="0" cy="0" r="1" gradientTransform="matrix(-81.196 -81.196 81.196 -81.196 114.32 116.87)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff2088" offset="0"/><stop stop-color="#c24bac" offset=".44"/><stop stop-color="#37aeff" offset="1"/></radialGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
13
AppImageBuilder/assets_aarch64/AppRun
Executable file
13
AppImageBuilder/assets_aarch64/AppRun
Executable file
@@ -0,0 +1,13 @@
|
||||
#! /bin/bash
|
||||
|
||||
cd "$APPDIR"
|
||||
|
||||
if [ -d /usr/lib/aarch64-linux-gnu/qt5 ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
if [ -d /usr/lib/aarch64-linux-gnu/qt6 ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
exec ./yuzu.sh
|
||||
fi
|
||||
fi
|
||||
8
AppImageBuilder/assets_aarch64/yuzu-bwrap.sh
Executable file
8
AppImageBuilder/assets_aarch64/yuzu-bwrap.sh
Executable file
@@ -0,0 +1,8 @@
|
||||
#! /bin/sh
|
||||
if [ -d /usr/lib/aarch64-linux-gnu/qt5 ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/aarch64-linux-gnu/qt5 ./yuzu.sh
|
||||
else
|
||||
if [ -d /usr/lib/aarch64-linux-gnu/qt6 ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/aarch64-linux-gnu/qt6 ./yuzu.sh
|
||||
fi
|
||||
fi
|
||||
6
AppImageBuilder/assets_aarch64/yuzu.sh
Executable file
6
AppImageBuilder/assets_aarch64/yuzu.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#! /bin/sh
|
||||
|
||||
# NOTE: the `ld-linux-aarch64.so.1` filename came from a pi debian 11 installation,
|
||||
# this may be incorrect for a different or more up-to-date system.
|
||||
# Can find out the correct filename using command "ldd yuzu" on the non-AppImage app
|
||||
QT_QPA_PLATFORM=xcb QT_PLUGIN_PATH=. exec ./ld-linux-aarch64.so.1 --library-path . ./yuzu
|
||||
25
AppImageBuilder/assets_x86_64/AppRun
Executable file
25
AppImageBuilder/assets_x86_64/AppRun
Executable file
@@ -0,0 +1,25 @@
|
||||
#! /bin/bash
|
||||
|
||||
cd "$APPDIR"
|
||||
|
||||
# default qt5 location
|
||||
if [ -d /usr/lib/x86_64-linux-gnu/qt5 ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
# qt5 on Steam Deck (as qt)
|
||||
if [ -d /usr/lib/qt ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
# default qt6 location
|
||||
if [ -d /usr/lib/x86_64-linux-gnu/qt6 ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
# qt6 on Steam Deck
|
||||
if [ -d /usr/lib/qt6 ]; then
|
||||
exec ./yuzu-bwrap.sh
|
||||
else
|
||||
exec ./yuzu.sh
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
21
AppImageBuilder/assets_x86_64/yuzu-bwrap.sh
Executable file
21
AppImageBuilder/assets_x86_64/yuzu-bwrap.sh
Executable file
@@ -0,0 +1,21 @@
|
||||
#! /bin/sh
|
||||
|
||||
# default qt5 location
|
||||
if [ -d /usr/lib/x86_64-linux-gnu/qt5 ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/x86_64-linux-gnu/qt5 ./yuzu.sh
|
||||
else
|
||||
# qt5 on Steam Deck (as qt)
|
||||
if [ -d /usr/lib/qt ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/qt ./yuzu.sh
|
||||
else
|
||||
# default qt6 location
|
||||
if [ -d /usr/lib/x86_64-linux-gnu/qt6 ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/x86_64-linux-gnu/qt6 ./yuzu.sh
|
||||
else
|
||||
# qt6 on Steam Deck
|
||||
if [ -d /usr/lib/qt6 ]; then
|
||||
exec ./bwrap --dev-bind / / --tmpfs /usr/lib/qt6 ./yuzu.sh
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
2
AppImageBuilder/assets_x86_64/yuzu.sh
Executable file
2
AppImageBuilder/assets_x86_64/yuzu.sh
Executable file
@@ -0,0 +1,2 @@
|
||||
#! /bin/sh
|
||||
QT_QPA_PLATFORM=xcb QT_PLUGIN_PATH=. exec ./ld-linux-x86-64.so.2 --library-path . ./yuzu
|
||||
136
AppImageBuilder/build.sh
Executable file
136
AppImageBuilder/build.sh
Executable file
@@ -0,0 +1,136 @@
|
||||
#! /bin/bash
|
||||
set -e
|
||||
|
||||
# Check arguments
|
||||
if [[ $# != 2 ]]; then
|
||||
>&2 echo "Bad usage!"
|
||||
echo "Usage: $0 <build dir> <output file>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get paths
|
||||
ARCH="$(uname -m)"
|
||||
SYSTEM_LIBS="/usr/lib"
|
||||
YUZU_BIN="${1}/bin"
|
||||
YUZU_BIN_GUI="${YUZU_BIN}/yuzu"
|
||||
|
||||
# Make sure executable exists
|
||||
if [[ $(file -b --mime-type "$YUZU_BIN_GUI") != application/x-pie-executable ]]; then
|
||||
>&2 echo "Invalid yuzu executable!"
|
||||
fi
|
||||
|
||||
# Clean up build dir
|
||||
rm -rf build
|
||||
mkdir build
|
||||
|
||||
# NOTE: some of these aren't used now, but can be reordered in priority when torzu is converted to QT6
|
||||
# Find QT folder (Steam Deck fix), check for default qt5 first
|
||||
QTFOUND="true"
|
||||
QTDIR="$SYSTEM_LIBS"/${ARCH}-linux-gnu/qt5/plugins
|
||||
if [ ! -d "$QTDIR" ]; then
|
||||
# default qt5 folder not found, check for Steam Deck qt (qt5) folder
|
||||
QTDIR="$SYSTEM_LIBS"/qt/plugins
|
||||
if [ ! -d "$QTDIR" ]; then
|
||||
# Steam Deck qt (qt5) folder not found, check for regular qt6 folder
|
||||
QTDIR="$SYSTEM_LIBS"/${ARCH}-linux-gnu/qt6/plugins
|
||||
if [ ! -d "$QTDIR" ]; then
|
||||
# regular qt6 folder not found, check for Steam Deck qt6 folder
|
||||
QTDIR="$SYSTEM_LIBS"/qt6/plugins
|
||||
if [ ! -d "$QTDIR" ]; then
|
||||
QTFOUND="false"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ $QTFOUND == "true" ]; then
|
||||
echo "QT plugins from $QTDIR will be used."
|
||||
|
||||
# Copy system dependencies used to build and required by the yuzu binary
|
||||
# includes:
|
||||
# - '/lib64/ld-linux-x86-64.so.2' or `/lib/ld-linux-aarch64.so.1` file per architecture
|
||||
# - required files from `/usr/lib/x86_64-linux-gnu` or `/usr/lib/aarch64-linux-gnu`
|
||||
# - different for SteamDeck, but still does it automatically
|
||||
for lib in $(ldd "$YUZU_BIN_GUI"); do
|
||||
(cp -v "$lib" ./build/ 2> /dev/null) || true
|
||||
done
|
||||
|
||||
# Copy QT dependency folders, path determined above
|
||||
cp -rv "$QTDIR"/{imageformats,platforms,platformthemes,xcbglintegrations} ./build/
|
||||
|
||||
# Copy executable
|
||||
cp -v "$YUZU_BIN_GUI" ./build/
|
||||
|
||||
# Copy assets for the appropriate arch
|
||||
cp -v ./assets_"${ARCH}"/* ./build/
|
||||
# Copy common assets
|
||||
cp -v ./assets/* ./build/
|
||||
|
||||
# Strip all libraries and executables
|
||||
for file in $(find ./build -type f); do
|
||||
(strip -v "$file" 2> /dev/null) || true
|
||||
done
|
||||
|
||||
PASSED_CHECKSUM="false"
|
||||
FILE=appimagetool.AppImage
|
||||
# total number of times to try downloading if a checksum doesn't match
|
||||
DL_TRIES=3
|
||||
while [ $PASSED_CHECKSUM == "false" ] && [ "$DL_TRIES" -gt 0 ]; do
|
||||
case $ARCH in
|
||||
x86_64)
|
||||
# Static copy from the 'ext-linux-bin' repo.
|
||||
# Checksum will need to be changed when/if this file in the repo is updated.
|
||||
if ! test -f "$FILE"; then
|
||||
echo "Downloading appimagetool for architecture '$ARCH'"
|
||||
wget -O appimagetool.AppImage https://github.com/litucks/ext-linux-bin/raw/refs/heads/main/appimage/appimagetool-x86_64.AppImage
|
||||
fi
|
||||
if [ $(shasum -a 256 appimagetool.AppImage | cut -d' ' -f1) = "110751478abece165a18460acbd7fd1398701f74a9405ad8ac053427d937bd5d" ] ; then
|
||||
PASSED_CHECKSUM="true"
|
||||
fi
|
||||
# DISABLED TO USE THE ABOVE
|
||||
# The current continuous release channel option, until a static copy is put in 'ext-linux-bin'.
|
||||
# The checksum will pass until the continuous release is updated, then a new one needs to be
|
||||
# generated to update this script.
|
||||
#if ! test -f "$FILE"; then
|
||||
# echo "Downloading appimagetool for architecture '$ARCH'"
|
||||
# wget -O appimagetool.AppImage https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage
|
||||
#fi
|
||||
#if [ $(shasum -a 256 appimagetool.AppImage | cut -d' ' -f1) = "46fdd785094c7f6e545b61afcfb0f3d98d8eab243f644b4b17698c01d06083d1" ] ; then
|
||||
# PASSED_CHECKSUM="true"
|
||||
#fi
|
||||
;;
|
||||
aarch64)
|
||||
# Currently set to the continuous release channel until a static copy is put in 'ext-linux-bin'.
|
||||
# The checksum will pass until the continuous release is updated, then a new one needs to be
|
||||
# generated to update this script.
|
||||
if ! test -f "$FILE"; then
|
||||
echo "Downloading appimagetool for architecture '$ARCH'"
|
||||
wget -O appimagetool.AppImage https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-aarch64.AppImage
|
||||
fi
|
||||
if [ $(shasum -a 256 appimagetool.AppImage | cut -d' ' -f1) = "04f45ea45b5aa07bb2b071aed9dbf7a5185d3953b11b47358c1311f11ea94a96" ] ; then
|
||||
PASSED_CHECKSUM="true"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
PASSED_CHECKSUM="invalid_arch"
|
||||
;;
|
||||
esac
|
||||
# delete the appimagetool downloaded if the checksum doesn't match.
|
||||
if [ ! $PASSED_CHECKSUM == "true" ]; then
|
||||
rm -f appimagetool.AppImage
|
||||
fi
|
||||
((DL_TRIES-=1))
|
||||
done
|
||||
if [ $PASSED_CHECKSUM == "true" ]; then
|
||||
echo "Checksum passed. Proceeding to build image."
|
||||
# Build AppImage
|
||||
chmod a+x appimagetool.AppImage
|
||||
./appimagetool.AppImage ./build "$2"
|
||||
elif [ $PASSED_CHECKSUM == "invalid_arch" ]; then
|
||||
echo "No download found for architecture '$ARCH'. Building halted."
|
||||
else
|
||||
echo "Checksum for appimagetool does not match. Building halted."
|
||||
echo "If the file to be downloaded has been changed, a new checksum will need to be generated for this script."
|
||||
fi
|
||||
else
|
||||
echo "QT not found, aborting AppImage build."
|
||||
fi
|
||||
Reference in New Issue
Block a user