diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-05-01 10:09:39 -0500 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-05-01 10:09:39 -0500 |
| commit | af43100e29859adbf5dcb6ee90cd8f981439b859 (patch) | |
| tree | 6d51db8b4f0b77cf4443cb2f49c4e5a7c354d7b6 /docker | |
| parent | 5d1fb2964a172e3444f18ca2ea823ee36784e699 (diff) | |
Remove AppImage build target and runtime references
We ship via portable tarball directory + .bin self-extracting installer
only; the AppImage path was unmaintained and pulling in linuxdeploy
tooling for a format we no longer publish.
Build:
- build.sh: drop appimage/all-includes-appimage modes (now: tarball,
installer, all=both, shell). Output listing tracks the directory.
- docker/Dockerfile: drop BUILD_APPIMAGE arg and the linuxdeploy
download/extract block.
- docker/build-inner.sh: drop build_appimage() (~120 lines), AppImage
arm of the BUILD_MODE switch, *.AppImage summary listing.
- docker/AppRun.sh: deleted.
- .gitignore: drop *.AppImage / squashfs-root / *.flatpak entries.
Runtime: no longer key off APPIMAGE/APPDIR env vars or AppRun-set
state. The fluorine-manager launcher script already exports
FLUORINE_ORIG_*, MO2_BASE_DIR, MO2_PLUGINS_DIR, MO2_LIBS_DIR,
MO2_PYTHON_DIR for the same purpose, so simplify:
- envshortcut: appImageOrBinary -> launcherOrBinary; bundledFluorineIcon
no longer probes APPDIR.
- nxmhandler: drop APPIMAGE-based wrapper path; use applicationFilePath.
- protonlauncher: rename cleanAppImageEnv -> cleanFluorineEnv, drop
APPIMAGE/APPDIR/OWD/ARGV0/APPIMAGE_ORIGINAL_EXEC/DESKTOPINTEGRATION
removals and .mount_Fluori pattern strip.
- prefixsetuprunner: same env-cleaning trim.
- utility, library.h, proxypython, mainwindow, moapplication, appconfig:
comment cleanup pointing at the launcher instead of AppRun.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'docker')
| -rw-r--r-- | docker/AppRun.sh | 131 | ||||
| -rw-r--r-- | docker/Dockerfile | 23 | ||||
| -rwxr-xr-x | docker/build-inner.sh | 133 |
3 files changed, 4 insertions, 283 deletions
diff --git a/docker/AppRun.sh b/docker/AppRun.sh deleted file mode 100644 index 145ac61..0000000 --- a/docker/AppRun.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/bash -HERE="$(dirname "$(readlink -f "$0")")" -APPIMAGE_DIR="$(dirname "$(readlink -f "${APPIMAGE:-$0}")")" - -cleanup_stale_fuse_mounts() { - local root="$1" - [ -n "${root}" ] || return 0 - [ -r /proc/mounts ] || return 0 - - local src mp fstype rest mount_path stat_out - while IFS=' ' read -r src mp fstype rest; do - # Decode escaped paths from /proc/mounts. - mount_path="${mp//\\040/ }" - mount_path="${mount_path//\\011/$'\t'}" - mount_path="${mount_path//\\012/$'\n'}" - - case "${mount_path}" in - "${root}"/*) ;; - *) continue ;; - esac - - case "${fstype}" in - fuse*|fuse.*) ;; - *) continue ;; - esac - - stat_out="$(LC_ALL=C stat "${mount_path}" 2>&1 || true)" - if printf "%s" "${stat_out}" | grep -Eq "Transport endpoint is not connected|Stale file handle|Input/output error"; then - echo "[Fluorine] Recovering stale FUSE mount: ${mount_path}" - fusermount3 -uz "${mount_path}" >/dev/null 2>&1 || \ - fusermount -uz "${mount_path}" >/dev/null 2>&1 || \ - umount -l "${mount_path}" >/dev/null 2>&1 || true - fi - done < /proc/mounts -} - -cleanup_stale_fuse_mounts "${APPIMAGE_DIR}" - -sync_dir_overwrite_files() { - local name="$1" - local src="${HERE}/usr/share/fluorine/${name}" - local dst="${APPIMAGE_DIR}/${name}" - - [ -d "${src}" ] || return 0 - - if [ ! -d "${dst}" ]; then - echo "[Fluorine] First run: extracting ${name}/ next to AppImage..." - else - echo "[Fluorine] Updating ${name}/ bundled files..." - fi - mkdir -p "${dst}" - # Merge bundled payload while skipping VCS metadata (.git, etc.). - ( - cd "${src}" - tar --exclude-vcs -cf - . - ) | ( - cd "${dst}" - tar -xf - - ) -} - -# ── Extract/sync writable dirs ── -sync_dir_overwrite_files "plugins" -sync_dir_overwrite_files "lib" -sync_dir_overwrite_files "python" - -# Some existing Windows portable setups include plugins/plugin_python with -# .pyd/.dll payload. On Linux, the proxy will prefer this folder if present, -# which can hide the correct Linux mobase module. Overlay Linux runtime files -# into that folder to keep compatibility without deleting user content. -if [ -d "${APPIMAGE_DIR}/plugins/plugin_python" ]; then - if find "${APPIMAGE_DIR}/plugins/plugin_python" -type f \( -name '*.pyd' -o -name 'python*.dll' \) | grep -q .; then - echo "[Fluorine] Detected Windows plugin_python payload, overlaying Linux runtime files..." - mkdir -p "${APPIMAGE_DIR}/plugins/plugin_python/libs" - [ -d "${APPIMAGE_DIR}/plugins/libs" ] && cp -a "${APPIMAGE_DIR}/plugins/libs/." "${APPIMAGE_DIR}/plugins/plugin_python/libs/" - PYTHON_ROOT_CANDIDATE="${HERE}/usr/share/fluorine/python" - [ -d "${PYTHON_ROOT_CANDIDATE}/lib" ] || PYTHON_ROOT_CANDIDATE="${APPIMAGE_DIR}/python" - if [ -d "${PYTHON_ROOT_CANDIDATE}/lib" ]; then - PYVER_DIR="$(find "${PYTHON_ROOT_CANDIDATE}/lib" -mindepth 1 -maxdepth 1 -type d -name 'python3.*' | head -n 1)" - if [ -n "${PYVER_DIR}" ]; then - SITE_DIR="${PYVER_DIR}/site-packages" - [ -d "${SITE_DIR}/PyQt6" ] && cp -a "${SITE_DIR}/PyQt6" "${APPIMAGE_DIR}/plugins/plugin_python/libs/" - [ -d "${SITE_DIR}/PyQt6_sip" ] && cp -a "${SITE_DIR}/PyQt6_sip" "${APPIMAGE_DIR}/plugins/plugin_python/libs/" - [ -d "${SITE_DIR}/sip" ] && cp -a "${SITE_DIR}/sip" "${APPIMAGE_DIR}/plugins/plugin_python/libs/" - fi - fi - fi -fi - -# ── Environment ── -# Save original LD_LIBRARY_PATH so child processes (xdg-open, kde-open, etc.) -# can use host libraries instead of the bundled (potentially older) ones. -export FLUORINE_ORIG_LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}" -export PATH="${HERE}/usr/bin:${HERE}/usr/libexec:${PATH}" -export LD_LIBRARY_PATH="${HERE}/usr/lib:${HERE}/usr/libexec:${LD_LIBRARY_PATH:-}" - -# Qt plugins (read-only, inside AppImage) -export QT_PLUGIN_PATH="${HERE}/usr/plugins" -export QT_QPA_PLATFORM_PLUGIN_PATH="${HERE}/usr/plugins/platforms" -if [ -x "${HERE}/usr/libexec/QtWebEngineProcess" ]; then - export QTWEBENGINEPROCESS_PATH="${HERE}/usr/libexec/QtWebEngineProcess" -fi -if [ -d "${HERE}/usr/resources" ]; then - export QTWEBENGINE_RESOURCES_PATH="${HERE}/usr/resources" -fi -if [ -d "${HERE}/usr/translations/qtwebengine_locales" ]; then - export QTWEBENGINE_LOCALES_PATH="${HERE}/usr/translations/qtwebengine_locales" -fi - -# Tell the app to use the writable dirs next to the AppImage. -# MO2_BASE_DIR overrides qApp->applicationDirPath() for plugin/library discovery. -export MO2_BASE_DIR="${APPIMAGE_DIR}" -export MO2_PLUGINS_DIR="${APPIMAGE_DIR}/plugins" -export MO2_LIBS_DIR="${APPIMAGE_DIR}/lib" -MO2_PYTHON_BUNDLED="${HERE}/usr/share/fluorine/python" -if [ -d "${MO2_PYTHON_BUNDLED}/lib" ]; then - export MO2_PYTHON_DIR="${MO2_PYTHON_BUNDLED}" -else - export MO2_PYTHON_DIR="${APPIMAGE_DIR}/python" -fi -# Do not export PYTHONHOME/PYTHONPATH globally here. MO2 sets Python runtime -# internally for plugin_python, while child processes (NaK/launchers) must -# use their own system Python environment. -unset PYTHONHOME PYTHONPATH PYTHONNOUSERSITE - -# Raise open file descriptor limit — large modlists with FUSE VFS -# can easily exceed the default 1024 -ulimit -n 65536 2>/dev/null - -cd "${APPIMAGE_DIR}" -exec "${HERE}/usr/bin/ModOrganizer.bin" "$@" diff --git a/docker/Dockerfile b/docker/Dockerfile index 827d45b..643074c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -74,27 +74,4 @@ RUN /opt/python-bundled/bin/pip3 install --no-cache-dir \ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ sh -s -- -y --default-toolchain stable --profile minimal -# ── Pre-download linuxdeploy tooling (optional, only for AppImage builds) ── -# Set BUILD_APPIMAGE=1 to include linuxdeploy in the image. -# Without it, only tarball and installer builds are available. -ARG BUILD_APPIMAGE=0 -RUN if [ "${BUILD_APPIMAGE}" = "1" ]; then \ - mkdir -p /opt/linuxdeploy && \ - curl -L --retry 3 -o /opt/linuxdeploy/linuxdeploy-x86_64.AppImage \ - https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && \ - curl -L --retry 3 -o /opt/linuxdeploy/linuxdeploy-plugin-qt-x86_64.AppImage \ - https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage && \ - chmod +x /opt/linuxdeploy/linuxdeploy-x86_64.AppImage \ - /opt/linuxdeploy/linuxdeploy-plugin-qt-x86_64.AppImage && \ - cd /opt/linuxdeploy && \ - ./linuxdeploy-plugin-qt-x86_64.AppImage --appimage-extract >/dev/null && \ - mv squashfs-root linuxdeploy-plugin-qt.AppDir && \ - chmod +x linuxdeploy-plugin-qt.AppDir/AppRun && \ - ln -sf /opt/linuxdeploy/linuxdeploy-plugin-qt.AppDir/AppRun \ - /opt/linuxdeploy/linuxdeploy-plugin-qt && \ - chmod -x /opt/linuxdeploy/linuxdeploy-plugin-qt-x86_64.AppImage; \ - else \ - echo "Skipping linuxdeploy (BUILD_APPIMAGE not set)"; \ - fi - WORKDIR /build diff --git a/docker/build-inner.sh b/docker/build-inner.sh index fb5497b..7adab23 100755 --- a/docker/build-inner.sh +++ b/docker/build-inner.sh @@ -523,7 +523,7 @@ cp -f /src/data/icons/com.fluorine.manager.metainfo.xml "${OUT_DIR}/icons/" echo "Wrote manifest: $(wc -l < "${OUT_DIR}/fluorine-manifest.txt") entries" # ── Determine build mode ── -# BUILD_MODE is passed from build.sh: tarball (default), installer, appimage, all +# BUILD_MODE is passed from build.sh: tarball (default), installer, all BUILD_MODE="${BUILD_MODE:-tarball}" # ── Build portable distribution (directory) ── @@ -657,126 +657,6 @@ INSTALLER_HEADER ls -lh "/src/build/${TARBALL_NAME}.bin" } -# ── Build AppImage (legacy, optional) ── -build_appimage() { - echo "" - echo "=== Building AppImage ===" - - if [ ! -d /opt/linuxdeploy ]; then - echo "ERROR: linuxdeploy not available. Rebuild Docker image with --build-arg BUILD_APPIMAGE=1" - return 1 - fi - - APPDIR="/src/build/AppDir" - rm -rf "${APPDIR}" - mkdir -p "${APPDIR}/usr/bin" "${APPDIR}/usr/lib" "${APPDIR}/usr/share/applications" \ - "${APPDIR}/usr/plugins" \ - "${APPDIR}/usr/share/icons/hicolor/256x256/apps" \ - "${APPDIR}/usr/share/metainfo" - - cp -a "${OUT_DIR}"/. "${APPDIR}/usr/bin/" - mv "${APPDIR}/usr/bin/lib"/* "${APPDIR}/usr/lib/" 2>/dev/null || true - rmdir "${APPDIR}/usr/bin/lib" 2>/dev/null || true - if [ -d "${APPDIR}/usr/bin/qt6plugins" ]; then - cp -a "${APPDIR}/usr/bin/qt6plugins"/. "${APPDIR}/usr/plugins/" - fi - - cp -f "${OUT_DIR}/icons/com.fluorine.manager.desktop" "${APPDIR}/usr/share/applications/" - cp -f "${OUT_DIR}/icons/com.fluorine.manager.png" "${APPDIR}/usr/share/icons/hicolor/256x256/apps/" - cp -f "${OUT_DIR}/icons/com.fluorine.manager.metainfo.xml" "${APPDIR}/usr/share/metainfo/" - - mkdir -p "${APPDIR}/usr/share/icons" - for theme_dir in /usr/share/icons/*; do - [ -d "${theme_dir}" ] || continue - cp -a "${theme_dir}" "${APPDIR}/usr/share/icons/" - done - if [ -f "/usr/share/icons/default/index.theme" ]; then - mkdir -p "${APPDIR}/usr/share/icons/default" - cp -f "/usr/share/icons/default/index.theme" "${APPDIR}/usr/share/icons/default/" - fi - - patchelf --force-rpath --set-rpath '$ORIGIN/../lib' "${APPDIR}/usr/bin/ModOrganizer-core" - find "${APPDIR}/usr/bin/plugins" -name "*.so" -exec patchelf --force-rpath --set-rpath '$ORIGIN/../../lib' {} \; 2>/dev/null || true - find "${APPDIR}/usr/lib" -name "*.so" -exec patchelf --force-rpath --set-rpath '$ORIGIN' {} \; 2>/dev/null || true - - cat > "${APPDIR}/AppRun" <<'APPRUN' -#!/usr/bin/env bash -set -euo pipefail -SELF="$(readlink -f "$0")" -HERE="$(cd "$(dirname "$SELF")" && pwd)" -BIN="${HERE}/usr/bin" -APPIMAGE_DIR="$(dirname "$(readlink -f "${APPIMAGE:-$0}")")" - -export FLUORINE_ORIG_LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}" -export FLUORINE_ORIG_LD_PRELOAD="${LD_PRELOAD:-}" -export FLUORINE_ORIG_PATH="${PATH}" -export FLUORINE_ORIG_XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" -export FLUORINE_ORIG_QT_PLUGIN_PATH="${QT_PLUGIN_PATH:-}" - -# Steam injects 32-bit gameoverlayrenderer.so via LD_PRELOAD — clear it. -unset LD_PRELOAD - -# Suppress Qt debug logging by default (see comment in main launcher). -: "${QT_LOGGING_RULES:=default.debug=false}" -export QT_LOGGING_RULES - -export PATH="${BIN}:${PATH}" -# Replace (not append) LD_LIBRARY_PATH — Steam game mode injects its runtime -# libs which break Python/Qt. RPATH handles the binary's own deps. -export LD_LIBRARY_PATH="${HERE}/usr/lib" - -export MO2_BASE_DIR="${APPIMAGE_DIR}" -export MO2_PLUGINS_DIR="${BIN}/plugins" -export MO2_LIBS_DIR="${BIN}/lib" - -unset PYTHONPATH PYTHONNOUSERSITE PYTHONHOME MO2_PYTHON_DIR - -export QT_PLUGIN_PATH="${HERE}/usr/plugins" -export QT_QPA_PLATFORM_PLUGIN_PATH="${HERE}/usr/plugins/platforms" -export XDG_DATA_DIRS="${HERE}/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" -export QT_ICON_THEME_NAME="${QT_ICON_THEME_NAME:-breeze}" -export QT_STYLE_OVERRIDE="${QT_STYLE_OVERRIDE:-Breeze}" -export XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:-KDE}" - -# Raise open file descriptor limit — large modlists with FUSE VFS -# can easily exceed the default 1024 -ulimit -n 65536 2>/dev/null - -cd "${APPIMAGE_DIR}" -exec "${BIN}/ModOrganizer-core" "$@" -APPRUN - chmod +x "${APPDIR}/AppRun" - - ln -sf usr/share/applications/com.fluorine.manager.desktop "${APPDIR}/com.fluorine.manager.desktop" - ln -sf usr/share/icons/hicolor/256x256/apps/com.fluorine.manager.png "${APPDIR}/com.fluorine.manager.png" - ln -sf usr/share/icons/hicolor/256x256/apps/com.fluorine.manager.png "${APPDIR}/.DirIcon" - - DEPLOY_DIR="/tmp/linuxdeploy-extract" - if [ ! -d "${DEPLOY_DIR}" ]; then - cd /opt/linuxdeploy - ./linuxdeploy-x86_64.AppImage --appimage-extract >/dev/null - mv squashfs-root "${DEPLOY_DIR}" - chmod +x "${DEPLOY_DIR}/AppRun" - fi - - export ARCH=x86_64 - "${DEPLOY_DIR}/AppRun" \ - --appdir "${APPDIR}" \ - --output appimage \ - --desktop-file "${APPDIR}/usr/share/applications/com.fluorine.manager.desktop" \ - --icon-file "${APPDIR}/usr/share/icons/hicolor/256x256/apps/com.fluorine.manager.png" \ - 2>&1 || { - echo "WARNING: linuxdeploy AppImage generation failed" - } - - APPIMAGE_FILE=$(ls -1 Fluorine*.AppImage 2>/dev/null || ls -1 *.AppImage 2>/dev/null || true) - if [ -n "${APPIMAGE_FILE}" ]; then - mv "${APPIMAGE_FILE}" "/src/build/" - echo "AppImage: /src/build/${APPIMAGE_FILE}" - ls -lh "/src/build/"*.AppImage - fi -} - # ── Execute requested build mode ── case "${BUILD_MODE}" in tarball) @@ -785,17 +665,12 @@ case "${BUILD_MODE}" in installer) build_installer ;; - appimage) - build_appimage - ;; all) build_tarball - if [ -d /opt/linuxdeploy ]; then - build_appimage - fi + build_installer ;; *) - echo "ERROR: Unknown BUILD_MODE '${BUILD_MODE}'. Use: tarball, installer, appimage, all" + echo "ERROR: Unknown BUILD_MODE '${BUILD_MODE}'. Use: tarball, installer, all" exit 1 ;; esac @@ -805,4 +680,4 @@ echo "=== Build Summary ===" du -sh "${OUT_DIR}"/*/ "${OUT_DIR}"/ModOrganizer-core 2>/dev/null | sort -rh echo "" echo "Build outputs:" -ls -dh /src/build/fluorine-manager/ /src/build/fluorine-manager.bin /src/build/*.AppImage 2>/dev/null || echo " (none found)" +ls -dh /src/build/fluorine-manager/ /src/build/fluorine-manager.bin 2>/dev/null || echo " (none found)" |
