create_appimage.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/bin/bash
  2. set -e
  3. # Define paths
  4. SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
  5. REPO_ROOT=$(dirname "$SCRIPT_DIR")
  6. # Allow BUILD_DIR to be overridden by environment variable
  7. if [ -z "$BUILD_DIR" ]; then
  8. BUILD_DIR="$REPO_ROOT/out/build/linux-clang-debug"
  9. fi
  10. APP_DIR="$REPO_ROOT/AppDir"
  11. OUT_DIR="$REPO_ROOT/out"
  12. # Define architecture
  13. if [ -z "$ARCH" ]; then
  14. ARCH="x86_64"
  15. fi
  16. if [ "$ARCH" == "arm64" ]; then
  17. LINUXDEPLOY_ARCH="aarch64"
  18. elif [ "$ARCH" == "aarch64" ]; then
  19. LINUXDEPLOY_ARCH="aarch64"
  20. else
  21. LINUXDEPLOY_ARCH="x86_64"
  22. fi
  23. # Function to download linuxdeploy if not present
  24. download_tools() {
  25. if [ ! -f "linuxdeploy-$LINUXDEPLOY_ARCH.AppImage" ]; then
  26. echo "Downloading linuxdeploy..."
  27. wget -q "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$LINUXDEPLOY_ARCH.AppImage"
  28. chmod +x "linuxdeploy-$LINUXDEPLOY_ARCH.AppImage"
  29. fi
  30. if [ ! -f "linuxdeploy-plugin-qt-$LINUXDEPLOY_ARCH.AppImage" ]; then
  31. echo "Downloading linuxdeploy-plugin-qt..."
  32. wget -q "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-$LINUXDEPLOY_ARCH.AppImage"
  33. chmod +x "linuxdeploy-plugin-qt-$LINUXDEPLOY_ARCH.AppImage"
  34. fi
  35. }
  36. # cleanup previous run
  37. rm -rf "$APP_DIR"
  38. mkdir -p "$APP_DIR/usr/bin" "$APP_DIR/usr/lib" "$APP_DIR/usr/share/applications" "$APP_DIR/usr/share/icons/hicolor/512x512/apps"
  39. # Copy binaries
  40. echo "Copying binaries..."
  41. cp "$BUILD_DIR/bin/vcmiclient" "$APP_DIR/usr/bin/"
  42. cp "$BUILD_DIR/bin/vcmiserver" "$APP_DIR/usr/bin/"
  43. cp "$BUILD_DIR/bin/vcmilauncher" "$APP_DIR/usr/bin/"
  44. cp "$BUILD_DIR/bin/vcmieditor" "$APP_DIR/usr/bin/"
  45. # Size Optimization: Strip binaries and libraries
  46. echo "Stripping binaries and libraries to reduce size..."
  47. find "$APP_DIR/usr/bin" "$APP_DIR/usr/lib" -type f -exec strip --strip-unneeded {} + 2>/dev/null || true
  48. # Copy resources
  49. echo "Copying resources..."
  50. cp "$REPO_ROOT/clientapp/icons/vcmiclient.512x512.png" "$APP_DIR/usr/share/icons/hicolor/512x512/apps/vcmiclient.png"
  51. cp "$REPO_ROOT/launcher/vcmilauncher.desktop" "$APP_DIR/usr/share/applications/"
  52. # Copy config and Mods
  53. # These are symlinks in the build dir, so we copy the actual folders from repo root
  54. echo "Copying config and Mods..."
  55. cp -r "$REPO_ROOT/config" "$APP_DIR/usr/bin/"
  56. cp -r "$REPO_ROOT/Mods" "$APP_DIR/usr/bin/"
  57. # Set up version
  58. if [ -z "$VERSION" ]; then
  59. VERSION_FILE="$REPO_ROOT/cmake_modules/VersionDefinition.cmake"
  60. if [ -f "$VERSION_FILE" ]; then
  61. V_MAJOR=$(grep -m 1 "VCMI_VERSION_MAJOR" "$VERSION_FILE" | tr -d -c 0-9)
  62. V_MINOR=$(grep -m 1 "VCMI_VERSION_MINOR" "$VERSION_FILE" | tr -d -c 0-9)
  63. V_PATCH=$(grep -m 1 "VCMI_VERSION_PATCH" "$VERSION_FILE" | tr -d -c 0-9)
  64. export VERSION="${V_MAJOR}.${V_MINOR}.${V_PATCH}"
  65. else
  66. export VERSION="continuous"
  67. fi
  68. fi
  69. # Set up environment variables for linuxdeploy
  70. export VERSION
  71. export UPD_INFO="gh-releases-zsync|vcmi|vcmi|continuous|VCMI-*$ARCH.AppImage.zsync"
  72. if [ -z "$QMAKE" ]; then
  73. if command -v qmake6 &> /dev/null; then
  74. export QMAKE=qmake6
  75. else
  76. export QMAKE=qmake
  77. fi
  78. fi
  79. # Run linuxdeploy
  80. echo "Running linuxdeploy..."
  81. download_tools
  82. "./linuxdeploy-$LINUXDEPLOY_ARCH.AppImage" \
  83. --appdir "$APP_DIR" \
  84. --plugin qt \
  85. --output appimage \
  86. --desktop-file "$APP_DIR/usr/share/applications/vcmilauncher.desktop" \
  87. --icon-file "$APP_DIR/usr/share/icons/hicolor/512x512/apps/vcmiclient.png" \
  88. --executable "$APP_DIR/usr/bin/vcmilauncher"
  89. # cleanup
  90. rm -f linuxdeploy-*.AppImage
  91. echo "AppImage creation complete!"
  92. # Move to build directory if specified (for CI integration)
  93. APPIMAGE_FILE=$(ls VCMI-*.AppImage 2>/dev/null | head -n 1)
  94. if [ -n "$APPIMAGE_FILE" ] && [ -n "$BUILD_DIR" ]; then
  95. # Use VCMI_PACKAGE_FILE_NAME from CI if available, otherwise original name
  96. TARGET_NAME="${VCMI_PACKAGE_FILE_NAME:-${APPIMAGE_FILE%.*}}.AppImage"
  97. echo "Ensuring $BUILD_DIR exists and moving $APPIMAGE_FILE to $BUILD_DIR/$TARGET_NAME"
  98. mkdir -p "$BUILD_DIR"
  99. mv "$APPIMAGE_FILE" "$BUILD_DIR/$TARGET_NAME"
  100. fi