aboutsummaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-05-01 10:09:39 -0500
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-05-01 10:09:39 -0500
commitaf43100e29859adbf5dcb6ee90cd8f981439b859 (patch)
tree6d51db8b4f0b77cf4443cb2f49c4e5a7c354d7b6 /docker
parent5d1fb2964a172e3444f18ca2ea823ee36784e699 (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.sh131
-rw-r--r--docker/Dockerfile23
-rwxr-xr-xdocker/build-inner.sh133
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)"