|
| 1 | +#!/bin/bash |
| 2 | +set -e |
| 3 | + |
| 4 | +# Configuration |
| 5 | +BINARY_NAME="ciyue" |
| 6 | +APP_NAME="Ciyue" |
| 7 | +APP_ID="org.eu.mumulhl.ciyue" |
| 8 | +ICON_PATH="assets/icon.png" |
| 9 | +BUILD_DIR="build/linux/x64/release" |
| 10 | +BUNDLE_DIR="$BUILD_DIR/bundle" |
| 11 | +DEB_ROOT="build/deb" |
| 12 | +DEB_ASSETS_DIR="linux/packaging/deb" |
| 13 | +DESKTOP_FILE="linux/packaging/org.eu.mumulhl.ciyue.desktop" |
| 14 | +METAINFO_FILE="linux/packaging/org.eu.mumulhl.ciyue.metainfo.xml" |
| 15 | + |
| 16 | +# Ensure we are in the project root |
| 17 | +cd "$(dirname "$0")/.." |
| 18 | + |
| 19 | +# Check if flutter build has been run |
| 20 | +if [ ! -d "$BUNDLE_DIR" ]; then |
| 21 | + echo "Error: Bundle directory not found at $BUNDLE_DIR" |
| 22 | + echo "Please run 'flutter build linux --release' first." |
| 23 | + exit 1 |
| 24 | +fi |
| 25 | + |
| 26 | +# Extract version from pubspec.yaml |
| 27 | +VERSION_RAW=$(grep 'version: ' pubspec.yaml | sed 's/version: //') |
| 28 | +# Normalize version for DEB (replace + with -) |
| 29 | +VERSION=$(echo $VERSION_RAW | sed 's/+/-/') |
| 30 | + |
| 31 | +echo "=== 1. Preparing DEB Build Environment ===" |
| 32 | +rm -rf "$DEB_ROOT" |
| 33 | +mkdir -p "$DEB_ROOT/usr/bin" |
| 34 | +mkdir -p "$DEB_ROOT/opt/$BINARY_NAME" |
| 35 | +mkdir -p "$DEB_ROOT/usr/share/applications" |
| 36 | +mkdir -p "$DEB_ROOT/usr/share/icons/hicolor/256x256/apps" |
| 37 | +mkdir -p "$DEB_ROOT/usr/share/metainfo" |
| 38 | +mkdir -p "$DEB_ROOT/DEBIAN" |
| 39 | + |
| 40 | +echo "=== 2. Copying Files ===" |
| 41 | +# Copy bundle to /opt/ciyue |
| 42 | +cp -r "$BUNDLE_DIR/"* "$DEB_ROOT/opt/$BINARY_NAME/" |
| 43 | + |
| 44 | +# Create symlink in /usr/bin |
| 45 | +ln -sf "/opt/$BINARY_NAME/$BINARY_NAME" "$DEB_ROOT/usr/bin/$BINARY_NAME" |
| 46 | + |
| 47 | +# Desktop file |
| 48 | +cp "$DESKTOP_FILE" "$DEB_ROOT/usr/share/applications/$APP_ID.desktop" |
| 49 | + |
| 50 | +# Icon |
| 51 | +cp "$ICON_PATH" "$DEB_ROOT/usr/share/icons/hicolor/256x256/apps/$BINARY_NAME.png" |
| 52 | + |
| 53 | +# Metainfo |
| 54 | +cp "$METAINFO_FILE" "$DEB_ROOT/usr/share/metainfo/$APP_ID.appdata.xml" |
| 55 | + |
| 56 | +echo "=== 3. Generating Control File from Template ===" |
| 57 | +# Determine Architecture |
| 58 | +ARCH=$(dpkg --print-architecture 2>/dev/null || echo "amd64") |
| 59 | + |
| 60 | +# Calculate installed size in KB |
| 61 | +INSTALLED_SIZE=$(du -sk "$DEB_ROOT" | cut -f1) |
| 62 | + |
| 63 | +CONTROL_TEMPLATE="$DEB_ASSETS_DIR/control" |
| 64 | +CONTROL_FILE="$DEB_ROOT/DEBIAN/control" |
| 65 | + |
| 66 | +sed -e "s|@BINARY_NAME@|$BINARY_NAME|g" \ |
| 67 | + -e "s|@VERSION@|$VERSION|g" \ |
| 68 | + -e "s|@ARCH@|$ARCH|g" \ |
| 69 | + -e "s|@INSTALLED_SIZE@|$INSTALLED_SIZE|g" \ |
| 70 | + "$CONTROL_TEMPLATE" > "$CONTROL_FILE" |
| 71 | + |
| 72 | +echo "=== 4. Building DEB Package ===" |
| 73 | +if ! command -v dpkg-deb &> /dev/null; then |
| 74 | + echo "Error: 'dpkg-deb' not found. Please install 'dpkg' or 'apt-utils'." |
| 75 | + exit 1 |
| 76 | +fi |
| 77 | + |
| 78 | +dpkg-deb --build "$DEB_ROOT" "${BINARY_NAME}_${VERSION}_${ARCH}.deb" |
| 79 | + |
| 80 | +echo "=== 5. Cleanup ===" |
| 81 | +rm -rf "$DEB_ROOT" |
| 82 | + |
| 83 | +echo "=== Done! ===" |
| 84 | +echo "DEB created: $(ls ${BINARY_NAME}_${VERSION}_${ARCH}.deb)" |
0 commit comments