From 03fc1da756d26944d66cff8997d712521b1fde2c Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 11 Mar 2026 07:11:59 -0500 Subject: Remove FUSE passthrough, flake.nix, and stop archiving build output FUSE passthrough caused Wine DLL loading failures (ERROR_NOACCESS 0x3E6) for all file types, not just executables. Root cause is a kernel-level incompatibility between FUSE passthrough I/O and Wine's file access patterns. Removed all passthrough code, the passthrough helper binary, libcap dependency, and the settings UI toggle. Also removed flake.nix (unused with Docker build system) and stopped tar.gz'ing the build output since GitHub zips release assets automatically. Co-Authored-By: Claude Opus 4.6 --- docker/build-inner.sh | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'docker/build-inner.sh') diff --git a/docker/build-inner.sh b/docker/build-inner.sh index c62285b..ca6bac7 100755 --- a/docker/build-inner.sh +++ b/docker/build-inner.sh @@ -290,10 +290,8 @@ for tool in wrestool icotool lootcli; do done # ── Fix RPATH so binaries find libs without LD_LIBRARY_PATH ── -# IMPORTANT: Use --force-rpath to set DT_RPATH (not DT_RUNPATH). -# DT_RPATH is honored even when the binary has file capabilities -# (e.g. cap_sys_admin for FUSE passthrough). DT_RUNPATH and -# LD_LIBRARY_PATH are both ignored by the kernel for capability binaries. +# Use --force-rpath to set DT_RPATH (not DT_RUNPATH) for reliable +# library resolution regardless of LD_LIBRARY_PATH. echo "Patching RPATH..." patchelf --force-rpath --set-rpath '$ORIGIN/lib:$ORIGIN/python/lib' "${OUT_DIR}/ModOrganizer-core" [ -f "${OUT_DIR}/lootcli" ] && patchelf --force-rpath --set-rpath '$ORIGIN/lib' "${OUT_DIR}/lootcli" @@ -350,9 +348,7 @@ PYTHON_DIR="${RUN}/python" export PATH="${RUN}:${PATH}" # NOTE: Do NOT set LD_LIBRARY_PATH here. The binary uses DT_RPATH -# ($ORIGIN/lib:$ORIGIN/python/lib) to find its libraries. Setting -# LD_LIBRARY_PATH on a capability-bearing binary (cap_sys_admin for FUSE -# passthrough) triggers AT_SECURE mode, which drops all file capabilities. +# ($ORIGIN/lib:$ORIGIN/python/lib) to find its libraries. export MO2_BASE_DIR="${RUN}" export MO2_PLUGINS_DIR="${RUN}/plugins" export MO2_DLLS_DIR="${RUN}/dlls" @@ -372,9 +368,6 @@ LAUNCH chmod +x "${OUT_DIR}/fluorine-manager" # ── qt.conf — tells Qt where to find plugins without QT_PLUGIN_PATH env ── -# This is required when the binary has file capabilities (cap_sys_admin for -# FUSE passthrough), because glibc strips environment variables in AT_SECURE -# mode. qt.conf is read by Qt at startup regardless of env. cat > "${OUT_DIR}/qt.conf" <<'QTCONF' [Paths] Plugins = qt6plugins @@ -389,19 +382,17 @@ cp -f /src/data/com.fluorine.manager.metainfo.xml "${OUT_DIR}/" # BUILD_MODE is passed from build.sh: tarball (default), installer, appimage, all BUILD_MODE="${BUILD_MODE:-tarball}" -# ── Build tarball (portable distribution) ── +# ── Build portable distribution (directory) ── +# No archive created — GitHub zips release assets automatically. build_tarball() { echo "" - echo "=== Building tarball ===" + echo "=== Building portable distribution ===" cd /src/build - # Create a clean directory name for the archive TARBALL_NAME="fluorine-manager" rm -rf "${TARBALL_NAME}" cp -a staging "${TARBALL_NAME}" - tar czf "${TARBALL_NAME}.tar.gz" "${TARBALL_NAME}"/ - rm -rf "${TARBALL_NAME}" - echo "Tarball: /src/build/${TARBALL_NAME}.tar.gz" - ls -lh "/src/build/${TARBALL_NAME}.tar.gz" + echo "Output: /src/build/${TARBALL_NAME}/" + du -sh "/src/build/${TARBALL_NAME}" } # ── Build self-extracting installer (.bin frontloader) ── @@ -686,4 +677,4 @@ echo "=== Build Summary ===" du -sh "${OUT_DIR}"/*/ "${OUT_DIR}"/ModOrganizer-core 2>/dev/null | sort -rh echo "" echo "Build outputs:" -ls -lh /src/build/fluorine-manager.tar.gz /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 /src/build/*.AppImage 2>/dev/null || echo " (none found)" -- cgit v1.3.1