Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create new appimage workflow #278

Merged
merged 26 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5388759
Create new appimage workflow
Jammyjamjamman Sep 21, 2024
790a981
Don't use 'out' directory (#279)
andy5995 Sep 24, 2024
dd76ad7
remove "cd out" from appimage.yml
Jammyjamjamman Sep 24, 2024
34c4d75
Generate multiple checksums (#280)
andy5995 Sep 25, 2024
81a1c37
Fix artifact naming bug in appimage.yml
Jammyjamjamman Sep 25, 2024
ec37f15
Use curl, and more variables (#281)
andy5995 Sep 26, 2024
b6e698e
Set install prefix, prevent duplicates (#282)
andy5995 Oct 4, 2024
e83c31b
Use andy5995/linuxdeploy:v2 instead of ':latest'
andy5995 Oct 9, 2024
82f0245
Add data to megaglest-game appimages
Jammyjamjamman Oct 12, 2024
f2463c7
appimage.yml: Use v2-focal instead of v2
andy5995 Oct 16, 2024
0aac2f2
appimage.yml: Assign version based on workflow dispatch input
andy5995 Oct 16, 2024
65db7bf
Package all 3 binaries
andy5995 Oct 16, 2024
cd2a1c7
build-appimage.sh: Edit test instructions [skip ci]
andy5995 Oct 17, 2024
3682850
Remove SOURCE_ROOT variable and experimental shared library arg
andy5995 Nov 27, 2024
750f078
Actually use the docker-compose.yml added in previous commit
andy5995 Nov 27, 2024
21448f0
Add comments to compose yml and .env, move vars from .env to compose
andy5995 Nov 27, 2024
058396e
Don't bother setting WORKSPACE in the script
andy5995 Nov 27, 2024
a20e385
Don't build on arm/v7
andy5995 Dec 29, 2024
c1409ac
Install far few packages with --no-install-recommends
andy5995 Dec 29, 2024
e1abda7
Use v3 instead of v2, remove entrypoint
andy5995 Dec 29, 2024
cb3bbcc
Specify v3.2.0 for qemu action
andy5995 Jan 24, 2025
9a965a5
Revert cb3bbcc
andy5995 Jan 24, 2025
f40e4da
Add CC and CXX variables docker-compose
Jammyjamjamman Jan 25, 2025
b31b0ae
Use jammy image instead of focal
andy5995 Jan 25, 2025
4fd0364
Use native arm64 runner
andy5995 Jan 25, 2025
162b85d
New workflows for the AppImage
Jammyjamjamman Jan 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions .github/workflows/appimage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Build MG AppImage
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true

on:
workflow_dispatch:
inputs:
version:
description: 'version number'
required: false
type: string
push:
branches: develop
pull_request:
branches: develop
paths:
- '**appimage.yml'

jobs:
build-mg-appimage:
runs-on: ubuntu-latest
env:
VERSION: ${{ inputs.version }}
strategy:
matrix:
platform:
- linux/amd64
- linux/arm64

steps:
- name: Checkout MegaGlest
uses: actions/checkout@v4

- name: Checkout Data
uses: actions/checkout@v4
with:
repository: "megaglest/megaglest-data"
path: "data/glest_game"


- if: ${{ ! contains(matrix.platform, 'amd64') }}
uses: docker/setup-qemu-action@v3
andy5995 marked this conversation as resolved.
Show resolved Hide resolved

- name: Build AppImage
run: |
export HOSTUID=$(id -u) HOSTGID=$(id -g)
docker compose -f mk/linux/docker/docker-compose.yml run --rm build
env:
PLATFORM: ${{ matrix.platform }}
CC: clang
CXX: clang++

- name: Create sha256sum
run: |
for file in *.AppImage; do
sha256sum "$file" > "$file.sha256sum";
done

- name: Artifact Filename
run: |
PLATFORM=${{ matrix.platform }}
echo "ARTIFACT_NAME=AppImages-${PLATFORM//\//-}" >> $GITHUB_ENV

- name: Upload AppImage
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: ./*AppImage*
if-no-files-found: error
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ Session.vim
# Emacs
\#*\#

# AppImage
CMakeFiles/
_build_appimage/

# These are output to the source root when the appimage script is run:
#/xml2g
#/g2xml

## macOS
*.DS_Store
Icon
Expand Down
7 changes: 4 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ OPTION(BUILD_MEGAGLEST_MODEL_VIEWER "Build model viewer" ON)
OPTION(BUILD_MEGAGLEST_MAP_EDITOR "Build map editor" ON)
OPTION(BUILD_MEGAGLEST "Build MegaGlest" ON)
OPTION(BUILD_MEGAGLEST_TESTS "Build MegaGlest Unit Tests" OFF)
OPTION(INCLUDE_DATA "Include Game Data in build. If true but no data present, data will be skipped." ON)
OPTION(WANT_SINGLE_INSTALL_DIRECTORY "Use single install directory for everything. It is useful for example for MacOS cpack bundles." OFF)
OPTION(WANT_APPIMAGE "Enable AppImage compatibility" ON)
OPTION(WANT_STATIC_LIBS "Builds as many static libs as possible." OFF)
Expand Down Expand Up @@ -157,7 +158,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX OR MINGW OR MSVC)
IF(NOT WANT_APPIMAGE)
MESSAGE(STATUS "**Disable appimage code.")
ADD_DEFINITIONS(-DNO_APPIMAGE)
ELSEIF((NOT EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/CMakeLists.txt") AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
ELSEIF((NOT INCLUDE_DATA OR NOT EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/CMakeLists.txt") AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
MESSAGE(STATUS "**AppImage compatiblity + nodata wanted. Adding flag \"APPIMAGE_NODATA\".")
ADD_DEFINITIONS(-DAPPIMAGE_NODATA)
ENDIF()
Expand Down Expand Up @@ -509,7 +510,7 @@ IF(EXISTS "${PROJECT_SOURCE_DIR}/source/")
ENDIF()

# Check if data exist
IF(EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/CMakeLists.txt")
IF(INCLUDE_DATA AND EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/CMakeLists.txt")
MESSAGE(STATUS "**Found game data.")
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/data/glest_game )
ENDIF()
Expand All @@ -526,7 +527,7 @@ IF(NOT DEFINED CPACK_GENERATOR)
ENDIF()
# CPack configuration shared accross platforms
SET(CPACK_PACKAGE_NAME ${PKG_NAME})
IF(EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/others/megaglest-long-description.txt.in")
IF(INCLUDE_DATA AND EXISTS "${PROJECT_SOURCE_DIR}/data/glest_game/others/megaglest-long-description.txt.in")
FILE(READ "${PROJECT_SOURCE_DIR}/data/glest_game/others/megaglest-long-description.txt.in" MEGAGLEST_LONG_DESCRIPTION)
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${MEGAGLEST_LONG_DESCRIPTION}")
ELSE()
Expand Down
22 changes: 22 additions & 0 deletions mk/linux/AppRun
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#! /usr/bin/env bash

set -e

HERE="$(readlink -f "$(dirname "$0")")"

BINARY_NAME="megaglest"

if [ "$MG_BIN" = "editor" ]; then
BINARY_NAME="megaglest_editor"
elif [ "$MG_BIN" = "viewer" ]; then
BINARY_NAME="megaglest_g3dviewer"
fi

echo "To invoke the map editor:"
echo "MG_BIN=editor $0"
echo ""
echo "To invoke the g3d model viewer:"
echo "MG_BIN=viewer $0"
echo ""

exec "$HERE/usr/bin/$BINARY_NAME" "$@"
216 changes: 128 additions & 88 deletions mk/linux/build-appimage.sh
Original file line number Diff line number Diff line change
@@ -1,120 +1,160 @@
#!/bin/sh

set -e

# SCRIPTLOC=$(dirname "$0")
SCRIPTLOC="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"

if [ ! -f $TOOLS_DIR/squashfs-root/AppRun ]; then
echo "Please specify the path to the extracted linuxdeploy (squashfs-root) using \$TOOLS_DIR env variable."
exit -1
# To test this script locally, from the source root directory,
# you can use:
#
# docker run -it --rm -e HOSTUID=$(id -u) -e \
# -v $PWD:/workspace -w /workspace andy5995/linuxdeploy:v2-focal bash
#
# Normally 'bash' can be replaced with the /path/to/script but starting
# the container from a shell means you can run the script manually in the
# container and then fix any problems, then re-run the script (hint: the
# dependencies will be installed the first time, and not have to be installed
# on subsequent attempts).
#
# Then: 'su - builder' (preserve some environmental variables with '-')
# 'bash'
# 'export VERSION=snapshot'
# 'cd /workspace'
# 'mk/linux/build-appimage.sh'

set -ev

if [ -z "$VERSION" ]; then
echo "VERSION must be set"
exit 1
fi

mkdir -p $SCRIPTLOC/BuildAppImage/game
cd $SCRIPTLOC/BuildAppImage/game

if [ -d $SCRIPTLOC/BuildAppImage/game/AppDir ]; then
rm -r $SCRIPTLOC/BuildAppImage/game/AppDir
# Check if the workspace path is absolute
if [[ "$WORKSPACE" != /* ]]; then
echo "The workspace path must be absolute"
exit 1
fi
test -d "$WORKSPACE"

cmake ../../../.. -DBUILD_MEGAGLEST_MODEL_VIEWER=OFF -DBUILD_MEGAGLEST_MAP_EDITOR=OFF -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=OFF
make DESTDIR=AppDir -j$(nproc) install
strip AppDir/usr/local/bin/megaglest
# Used by linuxdeploy when it sets the filename
export LINUXDEPLOY_OUTPUT_VERSION="$VERSION"

if [ ! -d AppDir/usr/bin ]; then
mkdir -p AppDir/usr/bin
fi
APPIMAGE_BUILD_DIR="$WORKSPACE/_build_appimage"
INST_PREFIX="usr"

cp $(whereis 7z | awk -F ' ' '{print $2;}') AppDir/usr/bin/
# Hacky workaround to use internal 7z.
sed -i 's#=7z#=$APPLICATIONPATH/7z#' AppDir/usr/local/share/megaglest/glest.ini
#if [ -n "$DO_CLEAN_BUILD" ] && [ -d $APPIMAGE_BUILD_DIR ]; then
#rm -rf $APPIMAGE_BUILD_DIR
#fi

if [ ! -f AppDir/usr/local/share/applications/megaglest.desktop ]; then
wget -P AppDir/usr/local/share/applications/ https://raw.githubusercontent.com/MegaGlest/megaglest-data/develop/others/desktop/megaglest.desktop;
if [ ! -d "$APPIMAGE_BUILD_DIR" ]; then
mkdir -p "$APPIMAGE_BUILD_DIR"
fi

convert AppDir/usr/local/share/megaglest/megaglest.ico megaglest.png
mv megaglest-2.png megaglest.png

$TOOLS_DIR/squashfs-root/AppRun -d AppDir/usr/local/share/applications/megaglest.desktop \
--icon-file=megaglest.png \
--icon-filename=megaglest --executable AppDir/usr/local/bin/megaglest --appdir AppDir --output appimage

mv MegaGlest*.AppImage $SCRIPTLOC

# MapEditor
mkdir -p $SCRIPTLOC/BuildAppImage/mapeditor
cd $SCRIPTLOC/BuildAppImage/mapeditor

if [ -d $SCRIPTLOC/BuildAppImage/mapeditor/AppDir ]; then
rm -r $SCRIPTLOC/BuildAppImage/mapeditor/AppDir
fi
sudo DEBIAN_FRONTEND=noninteractive -i sh -c \
"apt update &&
apt upgrade -y &&
apt install --no-install-recommends -y
build-essential
$CC
libcurl4-gnutls-dev
libsdl2-dev
libopenal-dev
liblua5.3-dev
libjpeg-dev
libpng-dev
libfreetype6-dev
libwxgtk3.0-gtk3-dev
libcppunit-dev
libfribidi-dev
libftgl-dev
libglew-dev
libogg-dev
libvorbis-dev
libminiupnpc-dev
libircclient-dev
libxml2-dev
libx11-dev
libgl1-mesa-dev
libglu1-mesa-dev
librtmp-dev
libkrb5-dev
libldap2-dev
libidn2-dev
libpsl-dev
libgnutls28-dev
libnghttp2-dev
libssh-dev
libbrotli-dev
p7zip-full
imagemagick"

cd "$APPIMAGE_BUILD_DIR"
cmake $WORKSPACE \
-DCMAKE_INSTALL_PREFIX=/$INST_PREFIX \
-DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=OFF
make DESTDIR=$APPIMAGE_BUILD_DIR/AppDir -j$(nproc) install
# This is done by linuxdeploy
# strip AppDir/$INST_PREFIX/local/bin/megaglest

cp $(whereis 7z | awk -F ' ' '{print $2;}') $APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/bin/
# Hacky workaround to use internal 7z.
sed -i 's#=7z#=$APPLICATIONPATH/7z#' AppDir/$INST_PREFIX/share/megaglest/glest.ini

cmake ../../../.. -DBUILD_MEGAGLEST=OFF -DBUILD_MEGAGLEST_MODEL_VIEWER=OFF -DBUILD_MEGAGLEST_MAP_EDITOR=ON -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=OFF
make DESTDIR=AppDir -j$(nproc) install
strip AppDir/usr/local/bin/megaglest_editor
GAME_DESKTOP_DEST="$APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/applications"

if [ ! -d AppDir/usr/bin ]; then
mkdir -p AppDir/usr/bin
if [ ! -d "$GAME_DESKTOP_DEST" ]; then
mkdir -p "$GAME_DESKTOP_DEST"
fi

if [ ! -f AppDir/usr/local/share/applications/megaglest_editor.desktop ]; then
wget -P AppDir/usr/local/share/applications/ https://raw.githubusercontent.com/MegaGlest/megaglest-data/develop/others/desktop/megaglest_editor.desktop;
if [ ! -f "$GAME_DESKTOP_DEST/megaglest.desktop" ]; then
cp "$WORKSPACE/data/glest_game/others/desktop/megaglest.desktop" "$GAME_DESKTOP_DEST"
fi

convert AppDir/usr/local/share/megaglest/editor.ico editor.png
mv editor-2.png editor.png
# Another stupid hack to fix icons.
sed -i 's#Icon=megaglest#Icon=editor#' AppDir/usr/local/share/applications/megaglest_editor.desktop

ln -s $TOOLS_DIR/linuxdeploy-plugin-gtk.sh .

$TOOLS_DIR/squashfs-root/AppRun -d AppDir/usr/local/share/applications/megaglest_editor.desktop \
--icon-file=editor.png \
--icon-filename=editor --executable AppDir/usr/local/bin/megaglest_editor --appdir AppDir --plugin gtk --output appimage

mv MegaGlest*.AppImage $SCRIPTLOC
convert $APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/megaglest/megaglest.ico megaglest.png
mv megaglest-2.png megaglest.png

# G3D viewer
mkdir -p $SCRIPTLOC/BuildAppImage/g3dviewer
cd $SCRIPTLOC/BuildAppImage/g3dviewer
MAP_EDITOR_DESKTOP_DEST="$APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/applications"
if [ ! -d "$MAP_EDITOR_DESKTOP_DEST" ]; then
mkdir -p "$MAP_EDITOR_DESKTOP_DEST"
fi

if [ -d $SCRIPTLOC/BuildAppImage/g3dviewer/AppDir ]; then
rm -r $SCRIPTLOC/BuildAppImage/g3dviewer/AppDir
if [ ! -f "$MAP_EDITOR_DESKTOP_DEST/megaglest_editor.desktop" ]; then
cp "$WORKSPACE/data/glest_game/others/desktop/megaglest_editor.desktop" "$MAP_EDITOR_DESKTOP_DEST"
# Another stupid hack to fix icons.
sed -i 's#Icon=megaglest#Icon=editor#' $MAP_EDITOR_DESKTOP_DEST/megaglest_editor.desktop
fi

cmake ../../../.. -DBUILD_MEGAGLEST=OFF -DBUILD_MEGAGLEST_MODEL_VIEWER=ON -DBUILD_MEGAGLEST_MAP_EDITOR=OFF -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=OFF
make DESTDIR=AppDir -j$(nproc) install
strip AppDir/usr/local/bin/megaglest_g3dviewer
#convert $APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/megaglest/editor.ico editor.png
#mv editor-2.png editor.png

if [ ! -d AppDir/usr/bin ]; then
mkdir -p AppDir/usr/bin
G3DVIEWER_DESKTOP_DEST="$APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/applications"
if [ ! -d "$G3DVIEWER_DESKTOP_DEST" ]; then
mkdir -p "$G3DVIEWER_DESKTOP_DEST"
fi

if [ ! -f AppDir/usr/local/share/applications/megaglest_g3dviewer.desktop ]; then
wget -P AppDir/usr/local/share/applications/ https://raw.githubusercontent.com/MegaGlest/megaglest-data/develop/others/desktop/megaglest_g3dviewer.desktop;
if [ ! -f "$G3DVIEWER_DESKTOP_DEST/megaglest_g3dviewer.desktop" ]; then
cp "$WORKSPACE/data/glest_game/others/desktop/megaglest_g3dviewer.desktop" "$G3DVIEWER_DESKTOP_DEST"
# Another stupid hack to fix icons.
sed -i 's#Icon=megaglest#Icon=g3dviewer#' $G3DVIEWER_DESKTOP_DEST/megaglest_g3dviewer.desktop
fi

convert AppDir/usr/local/share/megaglest/g3dviewer.ico g3dviewer.png
mv g3dviewer-2.png g3dviewer.png
# Another stupid hack to fix icons.
sed -i 's#Icon=megaglest#Icon=g3dviewer#' AppDir/usr/local/share/applications/megaglest_g3dviewer.desktop
#convert $APPIMAGE_BUILD_DIR/AppDir/$INST_PREFIX/share/megaglest/g3dviewer.ico g3dviewer.png
#mv g3dviewer-2.png g3dviewer.png

ln -s $TOOLS_DIR/linuxdeploy-plugin-gtk.sh .

$TOOLS_DIR/squashfs-root/AppRun -d AppDir/usr/local/share/applications/megaglest_g3dviewer.desktop \
--icon-file=g3dviewer.png \
--icon-filename=g3dviewer --executable AppDir/usr/local/bin/megaglest_g3dviewer --appdir AppDir --plugin gtk --output appimage
linuxdeploy -d $GAME_DESKTOP_DEST/megaglest.desktop \
--icon-file=megaglest.png \
--icon-filename=megaglest \
--custom-apprun="$WORKSPACE/mk/linux/AppRun" \
--executable AppDir/$INST_PREFIX/bin/megaglest \
--appdir AppDir \
--plugin gtk \
--output appimage

mv MegaGlest*.AppImage $SCRIPTLOC
mv MegaGlest*.AppImage "$WORKSPACE"

# Tools
mkdir -p $SCRIPTLOC/BuildAppImage/tools
cd $SCRIPTLOC/BuildAppImage/tools
#mkdir -p $APPIMAGE_BUILD_DIR/tools
#cd $APPIMAGE_BUILD_DIR/tools

cmake ../../../.. -DBUILD_MEGAGLEST=OFF -DBUILD_MEGAGLEST_MODEL_VIEWER=OFF -DBUILD_MEGAGLEST_MAP_EDITOR=OFF -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=ON
make -j$(nproc)
#cmake $WORKSPACE -DBUILD_MEGAGLEST=OFF -DBUILD_MEGAGLEST_MODEL_VIEWER=OFF -DBUILD_MEGAGLEST_MAP_EDITOR=OFF -DBUILD_MEGAGLEST_MODEL_IMPORT_EXPORT_TOOLS=ON
#make -j$(nproc)

strip source/tools/glexemel/g2xml source/tools/glexemel/xml2g
mv source/tools/glexemel/g2xml $SCRIPTLOC
mv source/tools/glexemel/xml2g $SCRIPTLOC
#strip source/tools/glexemel/g2xml source/tools/glexemel/xml2g
#mv source/tools/glexemel/g2xml $WORKSPACE
#mv source/tools/glexemel/xml2g $WORKSPACE
Loading
Loading