# flatpak-builder manifest for repackaging the official O3DE Linux .deb as a Flatpak. # # The workflow (and scripts/build.sh) download the latest o3de_*.deb to ./o3de.deb # next to this manifest before building, so the manifest itself never needs editing # when a new version drops. # # Why the SDK is the runtime (not just the sdk): O3DE compiles game-project code at # runtime and ships only a *build toolchain* dependency list (clang/ninja/cmake/ # pkg-config + -dev libs). Those live in org.freedesktop.Sdk, so we run against it. id: org.o3de.O3DE runtime: org.freedesktop.Sdk runtime-version: '24.08' sdk: org.freedesktop.Sdk command: o3de-wrapper.sh finish-args: - --share=ipc - --share=network # Project Manager fetches gems/templates; engine downloads assets - --socket=x11 # O3DE's bundled Qt only ships the xcb plugin, so X11/XWayland is required - --socket=wayland - --socket=pulseaudio - --device=dri # GPU access for the renderer - --device=all # broader device access (input devices, additional GPUs) - --filesystem=home # O3DE stores projects and ~/.o3de in the user's home - --talk-name=org.freedesktop.Notifications - --env=QT_QPA_PLATFORM=xcb # O3DE's bundled Qt is most reliable under XWayland/X11 modules: - name: o3de buildsystem: simple build-commands: # The .deb is an `ar` archive containing data.tar.{gz,xz,zst}. - ar x o3de.deb - mkdir -p data - tar -C data -xf data.tar.* # The payload installs entirely under /opt/O3DE//. (The /usr branch # is kept for robustness in case a future release adds desktop glue there.) - 'if [ -d data/opt ]; then mkdir -p "${FLATPAK_DEST}/opt"; cp -a data/opt/. "${FLATPAK_DEST}/opt/"; fi' - 'if [ -d data/usr ]; then cp -a data/usr/. "${FLATPAK_DEST}/"; fi' # On first launch O3DE installs its 'o3de' CLI from scripts/o3de. By default # python/get_python.sh does an *editable* install ('pip install -e'), which # writes an egg-info into read-only /app and fails. get_python.sh has a # built-in immutable-install hook (the Snap path): if a prebuilt sdist exists # at scripts/o3de/dist/o3de-1.0.0.tar.gz it installs that (non-editable) # instead. Build the tarball now, while /app is still writable. - | set -e O3DE_PKG=$(find "${FLATPAK_DEST}/opt/O3DE" -maxdepth 3 -type d -path '*/scripts/o3de' | head -n1) if [ -n "$O3DE_PKG" ] && [ -f "$O3DE_PKG/setup.py" ]; then ( cd "$O3DE_PKG" && python3 setup.py sdist ) test -f "$O3DE_PKG/dist/o3de-1.0.0.tar.gz" else echo "scripts/o3de/setup.py not found; O3DE layout may have changed" >&2 exit 1 fi # Belt-and-suspenders: LYPython.cmake also installs o3de (editable) during a # project-build CMake configure. Patch every copy to non-editable. find "${FLATPAK_DEST}/opt/O3DE" -path '*/cmake/LYPython.cmake' | while read -r LYPYTHON; do grep -qF -- '-m pip install -e ' "$LYPYTHON" && \ sed -i 's/-m pip install -e /-m pip install /g' "$LYPYTHON" || true done # Launcher + AppStream + desktop entry under the Flatpak app-id. - install -Dm755 o3de-wrapper.sh "${FLATPAK_DEST}/bin/o3de-wrapper.sh" - install -Dm644 org.o3de.O3DE.desktop "${FLATPAK_DEST}/share/applications/org.o3de.O3DE.desktop" - install -Dm644 org.o3de.O3DE.metainfo.xml "${FLATPAK_DEST}/share/metainfo/org.o3de.O3DE.metainfo.xml" - install -Dm644 org.o3de.O3DE.png "${FLATPAK_DEST}/share/icons/hicolor/256x256/apps/org.o3de.O3DE.png" sources: - type: file path: o3de.deb - type: file path: o3de-wrapper.sh - type: file path: org.o3de.O3DE.desktop - type: file path: org.o3de.O3DE.metainfo.xml - type: file path: org.o3de.O3DE.png