name: Build Linux on: workflow_dispatch: jobs: build-linux: runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v4 with: submodules: "recursive" token: ${{ secrets.PAT }} - name: Set up Go uses: actions/setup-go@v6 with: go-version: "^1.23.0" - name: Install Linux dependencies run: | sudo apt-get update sudo apt-get install -y \ build-essential \ autoconf \ automake \ checkinstall \ git \ pkg-config \ libpugixml-dev \ libusb-1.0-0-dev \ libqrencode-dev \ libirecovery-1.0-dev \ libcurl4-openssl-dev \ libusbmuxd-dev \ libssl-dev \ libtool-bin \ libreadline-dev \ libavahi-compat-libdnssd-dev \ libavcodec-dev \ libavutil-dev \ libswscale-dev \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ libfuse2 \ libunwind-dev \ libxcb-cursor0 \ libxkbcommon-x11-0 \ libheif-dev \ libzip-dev \ libssh-dev - name: Install Qt uses: jurplel/install-qt-action@v3 with: version: "6.7.2" modules: "qtmultimedia qtlocation qtpositioning qtserialport" dir: ${{ github.workspace }} - name: Compile additional dependencies run: | git clone https://github.com/lxqt/lxqt-build-tools.git pushd lxqt-build-tools mkdir build && cd build cmake .. sudo make install popd git clone https://github.com/uncor3/qtermwidget.git pushd qtermwidget mkdir build && cd build cmake .. sudo make install popd - name: Build libimobiledevice suite run: | repos=("libplist" "libtatsu" "libimobiledevice-glue" "libimobiledevice" "libirecovery") for repo in "${repos[@]}"; do echo "Building $repo..." git clone --depth=1 --recursive "https://github.com/libimobiledevice/$repo" pushd "$repo" ./autogen.sh sudo make install popd echo "Built $repo successfully." done - name: Update linker cache run: sudo ldconfig - name: Configure CMake run: | cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DRUN_CLANG_TIDY=OFF - name: Build with CMake run: cmake --build build --config Release - name: Prepare for AppImage run: | export APPDIR=$PWD/AppDir wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" chmod a+x linuxdeployqt-continuous-x86_64.AppImage mkdir -p "$APPDIR/usr/bin" mkdir -p "$APPDIR/usr/share/applications" mkdir -p "$APPDIR/usr/share/icons/hicolor/256x256/apps" cp build/iDescriptor "$APPDIR/usr/bin/" cp resources/icons/app-icon/icon.png "$APPDIR/usr/share/icons/hicolor/256x256/apps/iDescriptor.png" export APPDIR=$PWD/AppDir # Remove unused Qt SQL plugins to fix linuxdeployqt error rm ${{ github.workspace }}/Qt/6.7.2/gcc_64/plugins/sqldrivers/libqsqlmimer.so || true export GSTREAMER_VERSION=1.0 cp build/iDescriptor "$APPDIR/usr/bin/" # Bundle GStreamer plugins + helpers plugins_target_dir="$APPDIR"/usr/lib/gstreamer-"$GSTREAMER_VERSION" helpers_target_dir="$APPDIR"/usr/lib/gstreamer"$GSTREAMER_VERSION"/gstreamer-"$GSTREAMER_VERSION" if [ -d /usr/lib/"$(uname -m)"-linux-gnu/gstreamer-"$GSTREAMER_VERSION" ]; then plugins_dir=/usr/lib/$(uname -m)-linux-gnu/gstreamer-"$GSTREAMER_VERSION" else plugins_dir=/usr/lib/gstreamer-"$GSTREAMER_VERSION" fi helpers_dir=/usr/lib/$(uname -m)-linux-gnu/gstreamer"$GSTREAMER_VERSION"/gstreamer-"$GSTREAMER_VERSION" mkdir -p "$plugins_target_dir" echo "Copying plugins into $plugins_target_dir" for i in "$plugins_dir"/*; do [ -d "$i" ] && continue [ ! -f "$i" ] && echo "File does not exist: $i" && continue echo "Copying plugin: $i" cp "$i" "$plugins_target_dir" done for i in "$plugins_target_dir"/*; do [ -d "$i" ] && continue [ ! -f "$i" ] && echo "File does not exist: $i" && continue (file "$i" | grep -v ELF --silent) && echo "Ignoring non ELF file: $i" && continue echo "Manually setting rpath for $i" patchelf --set-rpath '$ORIGIN/..:$ORIGIN' "$i" done mkdir -p "$helpers_target_dir" echo "Copying helpers in $helpers_target_dir" for i in "$helpers_dir"/*; do [ -d "$i" ] && continue [ ! -f "$i" ] && echo "File does not exist: $i" && continue echo "Copying helper: $i" cp "$i" "$helpers_target_dir" done for i in "$helpers_target_dir"/*; do [ -d "$i" ] && continue [ ! -f "$i" ] && echo "File does not exist: $i" && continue (file "$i" | grep -v ELF --silent) && echo "Ignoring non ELF file: $i" && continue echo "Manually setting rpath for $i" patchelf --set-rpath '$ORIGIN/../..' "$i" done echo "Installing AppRun hook" mkdir -p "$APPDIR"/apprun-hooks if [ "$GSTREAMER_VERSION" == "1.0" ]; then cat > "$APPDIR"/apprun-hooks/linuxdeploy-plugin-gstreamer.sh <<\EOF #! /bin/bash export GST_REGISTRY_REUSE_PLUGIN_SCANNER="no" export GST_PLUGIN_SYSTEM_PATH_1_0="${APPDIR}/usr/lib/gstreamer-1.0" export GST_PLUGIN_PATH_1_0="${APPDIR}/usr/lib/gstreamer-1.0" export GST_PLUGIN_SCANNER_1_0="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner" export GST_PTP_HELPER_1_0="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-ptp-helper" EOF elif [ "$GSTREAMER_VERSION" == "0.10" ]; then cat > "$APPDIR"/apprun-hooks/linuxdeploy-plugin-gstreamer.sh <<\EOF #! /bin/bash export GST_REGISTRY_REUSE_PLUGIN_SCANNER="no" export GST_PLUGIN_SYSTEM_PATH_0_10="${APPDIR}/usr/lib/gstreamer-1.0" export GST_PLUGIN_SCANNER_0_10="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner" export GST_PTP_HELPER_0_10="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-ptp-helper" EOF else echo "Warning: unknown GStreamer version: $GSTREAMER_VERSION, cannot install AppRun hook" fi # Create a .desktop file required for the AppImage cat < $APPDIR/usr/share/applications/iDescriptor.desktop [Desktop Entry] Name=iDescriptor Exec=iDescriptor Icon=iDescriptor Type=Application Categories=Utility; EOF - name: Build AppImage run: | export VERSION=1.0.0 # Clean up unneeded libs rm -f lib/libxcb-glx.so* lib/libXrandr.so* lib/libXext.so* lib/libXrender.so* lib/libXfixes.so* lib/libXau.so* lib/libXdmcp.so* rm -f lib/libstdc++.so* lib/libgcc_s.so* || true # Build AppImage from the AppDir ./linuxdeployqt-continuous-x86_64.AppImage AppDir/usr/share/applications/iDescriptor.desktop \ -appimage \ -no-strip \ -qmldir=./qml \ -exclude-libs=libGL,libGLX,libEGL,libOpenGL,libdrm,libva,libvdpau,libxcb,libxcb-glx,libxcb-dri2,libxcb-dri3,libX11,libXext,libXrandr,libXrender,libXfixes,libXau,libXdmcp - name: Upload Artifact (Linux) if: runner.os == 'Linux' uses: actions/upload-artifact@v4 with: name: iDescriptor-AppImage path: build/iDescriptor-*.AppImage - name: Upload Artifact (Windows) if: runner.os == 'Windows' uses: actions/upload-artifact@v4 with: name: iDescriptor-Windows path: build/Release/iDescriptor.exe