Files
OrcaSlicer/scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
ExPikaPaka 5ed56eb876 Cache system presets to eliminate startup and wizard load times (#14217)
* Add caching system for presets

* Removing user\bundle serialization and keeping it only for system presets

* Integrate caching into WebGuideDialog which speeds up time of SetupWizzard and PrinterSelection dialog

* Add CI\CD step to prepare cache file in ahead of time so user does not need to wait

* Add partial cache generation when only one of the vendros is changed to speed up recalculation time

* Handle corrupted files

* Add cache to GuideDialog as previos version didn't work as expected

* Add inspecting tool and fix CI cache generation

* Generate cache per vendor

* Simplify code by mergin it in PresetBundle

* Simplify code a bit more

* Add cereal serialize() to VendorProfile, PrinterModel, Preset, and Semver

* Remove CachedPrinterModel/VendorProfile/Preset mirror structs from VendorCache

* Fix use-after-free in CallAfter lambda; replace raw thread pointer with unique_ptr

* Use get_vendor_cache_key() to match cache keys written by the app

* Remove BOM added by VSC

* Skip invalid vendors

* Remove leftover cache file

* Fix build for windows arm64

* Revert json cache back

* Update check for stale cache

* Serealize all value fields for Preset class to minimize regression later

* Minimize field duplication by moving Cache thing into PresetBundle

* Add tests for Cache system

* Add a bit more tests

* Merge branch 'main' into feature/cache_profiles_and_optimize_loading_speed

* Rvert from per-verndor to single cache file

Replace N per-vendor .cache files with a single system_presets.cache
that holds all vendors and presets in one serialized blob.

Cache load is now all-or-nothing: on hit all vendors are applied from
the bundle (sub-second); on miss all vendors are parsed from JSON and
a fresh bundle is written to the user cache dir.

Invalidation is driven by bundle_key - a sorted concatenation of all
vendor JSON version strings. Any vendor update invalidates the whole
cache and triggers re-parse on next launch.

Guide wizard (WebGuideDialog) loads the bundled cache into a plain
PresetBundle instead of a separate VendorGuideData struct, removing
the duplicate data model.

generate_system_cache simplified from a per-vendor loop to a single
save_system_presets_cache() call producing one output file.

* Transfer all Preset fields from cache via move assignmet

apply_vendor_preset_group was copying fields manually and missed
bundle_id, user_id, base_id, sync_info, updated_time, key_values,
ini_str. Replace field-by-field copy with move assignment of the
fully-deserialized Preset, then restore the vendor pointer which
is excluded from serialization.

* Ignore cache for future

* Remove not used files

* Ship one preset cache per vendor in place of the profile JSONs

Each vendor's system presets serialize into a single <vendor>.opc built at
package time, and a shipped build carries that file alone — the profile JSON
and its sub-file tree are pruned. The vendor loader, the setup wizard's profile
list and the resource installer all read a vendor through its cache, falling
back to parsing whenever one is absent, stale or unreadable, so the cache stays
an optimization and never a source of truth. Caches hold presets in source form
and resolve inheritance at load, through the same code the JSON path uses.

* Make the preset cache self-describing and load each vendor from the system folder alone

The cached DynamicPrintConfig is keyed by name, through a per-file dictionary of the
distinct opt_keys, the type each was written as, and the distinct enum value names,
instead of by serialization_key_ordinal — a position assigned by declaration order at
static init, where inserting one option shifts every later ordinal and the lookup then
succeeds on the wrong option. Because a name-keyed payload drops the options this build
cannot place rather than being rejected wholesale, the schema fingerprint goes, and with
it the two fallbacks that existed only because an installed cache died on every app
upgrade: the second lookup tier into resources/profiles and the parse fallback to the
same place. A vendor is loaded from <data_dir>/system/ and nowhere else, as on main —
which is what makes the app write its .opc files there again.

* Simplify the preset cache internals after review

* Use the shared temp-dir helper in the preset bundle loading test

* Bound stamp string reads in the preset cache

* Speed up the setup wizard with a profile-data cache

The wizard's per-vendor fast path threw on vendors present only in
resources, falling back to a ~29 s raw JSON scan on every open. Each
vendor now loads from the directory it was found in, and the derived
model/machine/filament/process catalog is cached whole in
<data_dir>/cache/wizard_profile_data.json, stamped by each vendor's
name and version - a fresh cache makes an open one file read, with no
bundle built and no presets installed (~0.2 s vs ~2 s).

* Remove debug SVG dump from a geometry test

* Move the per-vendor cache file format into PresetCacheFormat

* Move the vendor install helpers from PresetBundle into Utils

* rename

* fix flatpak

* change cache version to 1

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-08-21 16:56:52 +08:00

429 lines
16 KiB
YAML

app-id: com.orcaslicer.OrcaSlicer
runtime: org.gnome.Platform
runtime-version: "50"
sdk: org.gnome.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.llvm21
command: entrypoint
separate-locales: true
rename-icon: OrcaSlicer
build-options:
append-path: /usr/lib/sdk/llvm21/bin
prepend-ld-library-path: /usr/lib/sdk/llvm21/lib
env:
CC: clang
CXX: clang++
LDFLAGS: "-fuse-ld=lld"
finish-args:
- --share=ipc
- --socket=x11
- --socket=wayland
- --share=network
- --device=all
- --filesystem=home
- --filesystem=xdg-run/gvfs
- --filesystem=/run/media
- --filesystem=/media
# Network shares (CIFS/NFS) are commonly mounted under /mnt, which the default
# finish-args don't grant; without it, opening a model from such a share fails
# with "The file does not contain any geometry data."
# https://github.com/flathub/com.orcaslicer.OrcaSlicer/issues/2
- --filesystem=/mnt
- --filesystem=/run/spnav.sock:ro
# Allow read-only access to OrcaSlicer's legacy config and cache directories (if they exist) for migration purposes.
- --filesystem=~/.var/app/io.github.softfever.OrcaSlicer:ro
# Allow OrcaSlicer to own and talk to instance-check D-Bus names (InstanceCheck.cpp)
- --talk-name=com.orcaslicer.OrcaSlicer.InstanceCheck.*
- --own-name=com.orcaslicer.OrcaSlicer.InstanceCheck.*
- --system-talk-name=org.freedesktop.UDisks2
- --env=SPNAV_SOCKET=/run/spnav.sock
modules:
# JPEG codec and GTK video sink (Wayland liveview) for the liveview
- name: gst-plugins-good
buildsystem: meson
config-opts:
- -Dauto_features=disabled
- -Djpeg=enabled
- -Dgtk3=enabled
- -Ddoc=disabled
- -Dexamples=disabled
- -Dtests=disabled
sources:
- type: archive
url: https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.22.8.tar.xz
sha256: e305b9f07f52743ca481da0a4e0c76c35efd60adaf1b0694eb3bb021e2137e39
- name: glu
build-options:
cxxflags: -Wno-register
config-opts:
- --disable-static
sources:
- type: archive
url: https://ftp.osuosl.org/pub/blfs/conglomeration/glu/glu-9.0.2.tar.xz
sha256: 6e7280ff585c6a1d9dfcdf2fca489251634b3377bfc33c29e4002466a38d02d4
cleanup:
- /include
- /lib/*.a
- /lib/*.la
- /lib/pkgconfig
- name: kde-extra-cmake-modules
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/KDE/extra-cmake-modules
tag: v5.249.0
commit: 008ae77d0cd2a97c346228ab30b99279643e5022
cleanup:
- /
- name: libspnav
sources:
- type: archive
url: https://github.com/FreeSpacenav/libspnav/releases/download/v1.2/libspnav-1.2.tar.gz
sha256: 093747e7e03b232e08ff77f1ad7f48552c06ac5236316a5012db4269951c39db
# wxWidgets built as a separate module for Flathub (no network at build time)
# Config-opts mirror deps/wxWidgets/wxWidgets.cmake with FLATPAK=ON, DEP_WX_GTK3=ON
- name: wxWidgets
buildsystem: cmake-ninja
build-options:
env:
CMAKE_POLICY_VERSION_MINIMUM: "3.5"
config-opts:
- -DCMAKE_BUILD_TYPE=Release
- -DwxBUILD_PRECOMP=ON
- -DwxBUILD_TOOLKIT=gtk3
- -DCMAKE_DEBUG_POSTFIX:STRING=d
- -DwxBUILD_DEBUG_LEVEL=0
- -DwxBUILD_SAMPLES=OFF
- -DwxBUILD_SHARED=ON
- -DBUILD_SHARED_LIBS=ON
- -DwxUSE_MEDIACTRL=ON
- -DwxUSE_DETECT_SM=OFF
- -DwxUSE_PRIVATE_FONTS=ON
- -DwxUSE_OPENGL=ON
- -DwxUSE_GLCANVAS_EGL=ON
- -DwxUSE_WEBREQUEST=ON
- -DwxUSE_WEBVIEW=ON
- -DwxUSE_WEBVIEW_EDGE=OFF
- -DwxUSE_WEBVIEW_IE=OFF
- -DwxUSE_REGEX=builtin
- -DwxUSE_LIBSDL=OFF
- -DwxUSE_XTEST=OFF
- -DwxUSE_STC=OFF
- -DwxUSE_AUI=ON
- -DwxUSE_LIBPNG=sys
- -DwxUSE_ZLIB=sys
- -DwxUSE_LIBJPEG=sys
- -DwxUSE_LIBTIFF=OFF
# sys, not builtin (unlike the static deps build): wxWidgets installs the
# builtin libwxwebp*.so only for static builds, so a shared build leaves
# them missing at runtime. The GNOME runtime provides libwebp.
- -DwxUSE_LIBWEBP=sys
- -DwxUSE_EXPAT=sys
- -DwxUSE_NANOSVG=OFF
- -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld
- -DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld
- -DCMAKE_MODULE_LINKER_FLAGS=-fuse-ld=lld
sources:
# Use git instead of archive: wxWidgets 3.3 relies on multiple git
# submodules (PCRE2, etc.) that are not included in GitHub tarballs.
- type: git
url: https://github.com/SoftFever/Orca-deps-wxWidgets.git
tag: orca-3.3.2
commit: db1005db3dea2c37a46fb455a9a02e37aa360751
# OrcaSlicer C++ dependencies (built offline with pre-downloaded archives)
- name: orca_deps
buildsystem: simple
build-options:
env:
BUILD_DIR: deps/build_flatpak
build-commands:
- |
cmake -S deps -B $BUILD_DIR \
-DFLATPAK=ON \
-DDEP_DOWNLOAD_DIR=/run/build/orca_deps/external-packages \
-DCMAKE_PREFIX_PATH=/app \
-DDESTDIR=/app \
-DCMAKE_INSTALL_PREFIX=/app \
-DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \
-DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \
-DCMAKE_MODULE_LINKER_FLAGS="-fuse-ld=lld"
- cmake --build $BUILD_DIR --parallel
- rm -rf /run/build/orca_deps/external-packages
cleanup:
- /include
- "*.a"
- "*.la"
# CPython headers: useless at runtime (no compiler in the runtime
# sandbox, so C-extension source builds can't happen anyway), and a
# few MB of bloat. /app/libpython is installed by this module, so the
# entry must live in THIS module's cleanup (module-level cleanup only
# matches files the module itself installed).
- /libpython/include
sources:
# OrcaSlicer deps/ directory (avoids copying .git from worktree)
- type: dir
path: ../../deps
dest: deps
# ---------------------------------------------------------------
# Pre-downloaded dependency archives
# These are placed in external-packages/<Name>/ so CMake's
# ExternalProject_Add finds them and skips network downloads.
# ---------------------------------------------------------------
# Boost 1.84.0
- type: file
url: https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz
sha256: 4d27e9efed0f6f152dc28db6430b9d3dfb40c0345da7342eaa5a987dde57bd95
dest: external-packages/Boost
# Eigen 5.0.1
- type: file
url: https://gitlab.com/libeigen/eigen/-/archive/5.0.1/eigen-5.0.1.zip
sha256: 0dbb1f9e3aaad66f352c03227d8c983f6f0b49e0b07e71a7300f4abcc01aee12
dest: external-packages/Eigen
# TBB v2021.5.0
- type: file
url: https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2021.5.0.zip
sha256: 83ea786c964a384dd72534f9854b419716f412f9d43c0be88d41874763e7bb47
dest: external-packages/TBB
# Cereal v1.3.0
- type: file
url: https://github.com/USCiLab/cereal/archive/refs/tags/v1.3.0.zip
sha256: 71642cb54658e98c8f07a0f0d08bf9766f1c3771496936f6014169d3726d9657
dest: external-packages/Cereal
# Qhull v8.0.2
- type: file
url: https://github.com/qhull/qhull/archive/v8.0.2.zip
sha256: a378e9a39e718e289102c20d45632f873bfdc58a7a5f924246ea4b176e185f1e
dest: external-packages/Qhull
# GLFW 3.4
- type: file
url: https://github.com/glfw/glfw/archive/refs/tags/3.4.zip
sha256: a133ddc3d3c66143eba9035621db8e0bcf34dba1ee9514a9e23e96afd39fd57a
dest: external-packages/GLFW
# OpenCSG 1.4.2
- type: file
url: https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip
sha256: 51afe0db79af8386e2027d56d685177135581e0ee82ade9d7f2caff8deab5ec5
dest: external-packages/OpenCSG
# Blosc 1.17.0 (tamasmeszaros fork)
- type: file
url: https://github.com/tamasmeszaros/c-blosc/archive/refs/heads/v1.17.0_tm.zip
sha256: dcb48bf43a672fa3de6a4b1de2c4c238709dad5893d1e097b8374ad84b1fc3b3
dest: external-packages/Blosc
# OpenEXR v2.5.5
- type: file
url: https://github.com/AcademySoftwareFoundation/openexr/archive/refs/tags/v2.5.5.zip
sha256: 0307a3d7e1fa1e77e9d84d7e9a8694583fbbbfd50bdc6884e2c96b8ef6b902de
dest: external-packages/OpenEXR
# OpenVDB (custom fork)
- type: file
url: https://github.com/tamasmeszaros/openvdb/archive/a68fd58d0e2b85f01adeb8b13d7555183ab10aa5.zip
sha256: f353e7b99bd0cbfc27ac9082de51acf32a8bc0b3e21ff9661ecca6f205ec1d81
dest: external-packages/OpenVDB
# GMP 6.2.1
- type: file
url: https://github.com/SoftFever/OrcaSlicer_deps/releases/download/gmp-6.2.1/gmp-6.2.1.tar.bz2
sha256: eae9326beb4158c386e39a356818031bd28f3124cf915f8c5b1dc4c7a36b4d7c
dest: external-packages/GMP
# MPFR 4.2.2
- type: file
url: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.2.tar.bz2
sha256: 9ad62c7dc910303cd384ff8f1f4767a655124980bb6d8650fe62c815a231bb7b
dest: external-packages/MPFR
# CGAL 5.6.3
- type: file
url: https://github.com/CGAL/cgal/releases/download/v5.6.3/CGAL-5.6.3.zip
sha256: 5d577acb4a9918ccb960491482da7a3838f8d363aff47e14d703f19fd84733d4
dest: external-packages/CGAL
# NLopt v2.5.0
- type: file
url: https://github.com/stevengj/nlopt/archive/v2.5.0.tar.gz
sha256: c6dd7a5701fff8ad5ebb45a3dc8e757e61d52658de3918e38bab233e7fd3b4ae
dest: external-packages/NLopt
# libnoise 1.0
- type: file
url: https://github.com/SoftFever/Orca-deps-libnoise/archive/refs/tags/1.0.zip
sha256: 96ffd6cc47898dd8147aab53d7d1b1911b507d9dbaecd5613ca2649468afd8b6
dest: external-packages/libnoise
# Draco 1.5.7
- type: file
url: https://github.com/google/draco/archive/refs/tags/1.5.7.zip
sha256: 27b72ba2d5ff3d0a9814ad40d4cb88f8dc89a35491c0866d952473f8f9416b77
dest: external-packages/Draco
# OpenSSL 1.1.1w (GNOME SDK has 3.x; OrcaSlicer requires 1.1.x)
- type: file
url: https://github.com/openssl/openssl/archive/OpenSSL_1_1_1w.tar.gz
sha256: 2130e8c2fb3b79d1086186f78e59e8bc8d1a6aedf17ab3907f4cb9ae20918c41
dest: external-packages/OpenSSL
# CURL 7.75.0 (built from source to link against OpenSSL 1.1.x)
- type: file
url: https://github.com/curl/curl/archive/refs/tags/curl-7_75_0.zip
sha256: a63ae025bb0a14f119e73250f2c923f4bf89aa93b8d4fafa4a9f5353a96a765a
dest: external-packages/CURL
# OCCT (OpenCASCADE) V7_6_0
- type: file
url: https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_0.zip
sha256: 28334f0e98f1b1629799783e9b4d21e05349d89e695809d7e6dfa45ea43e1dbc
dest: external-packages/OCCT
# OpenCV 4.6.0
- type: file
url: https://github.com/opencv/opencv/archive/refs/tags/4.6.0.tar.gz
sha256: 1ec1cba65f9f20fe5a41fda1586e01c70ea0c9a6d7b67c9e13edf0cfe2239277
dest: external-packages/OpenCV
# CPython 3.12.13
- type: file
url: https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tar.xz
sha256: c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684
dest: external-packages/python3
# wxInspector 1.0.0
- type: file
url: https://github.com/Noisyfox/wxInspector/archive/refs/tags/v1.0.0.zip
sha256: 0ba163956f2d468b19a91b96c5aba66ee9610843ea41dda628ea44cdafde7db7
dest: external-packages/wxInspector
# ---------------------------------------------------------------
# Fallback archives for deps normally provided by the GNOME SDK.
# These are only used if find_package() fails to locate them.
# ---------------------------------------------------------------
# ZLIB 1.2.13
- type: file
url: https://github.com/madler/zlib/archive/refs/tags/v1.2.13.zip
sha256: c2856951bbf30e30861ace3765595d86ba13f2cf01279d901f6c62258c57f4ff
dest: external-packages/ZLIB
# libpng 1.6.35
- type: file
url: https://github.com/glennrp/libpng/archive/refs/tags/v1.6.35.zip
sha256: 3d22d46c566b1761a0e15ea397589b3a5f36ac09b7c785382e6470156c04247f
dest: external-packages/PNG
# libjpeg-turbo 3.0.1
- type: file
url: https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/3.0.1.zip
sha256: d6d99e693366bc03897677650e8b2dfa76b5d6c54e2c9e70c03f0af821b0a52f
dest: external-packages/JPEG
# Freetype 2.12.1
- type: file
url: https://github.com/SoftFever/orca_deps/releases/download/freetype-2.12.1.tar.gz/freetype-2.12.1.tar.gz
sha256: efe71fd4b8246f1b0b1b9bfca13cfff1c9ad85930340c27df469733bbb620938
dest: external-packages/FREETYPE
- name: OrcaSlicer
buildsystem: simple
build-commands:
- |
cmake . -B build_flatpak \
-DFLATPAK=ON \
-DORCA_TOOLS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/app \
-DCMAKE_INSTALL_PREFIX=/app \
-DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" \
-DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" \
-DCMAKE_MODULE_LINKER_FLAGS="-fuse-ld=lld"
- cmake --build build_flatpak --target OrcaSlicer -j$FLATPAK_BUILDER_N_JOBS
- ./scripts/run_gettext.sh
- cmake --build build_flatpak --target install -j$FLATPAK_BUILDER_N_JOBS
# Per-vendor preset caches. On the other platforms CI runs this script
# itself; the flatpak is built inside flatpak-builder and the generator
# only exists in here, so the swap is a build step instead, against the
# profiles the install above copied into /app.
- cmake --build build_flatpak --target generate_system_cache -j$FLATPAK_BUILDER_N_JOBS
- ./scripts/build_preset_cache.sh -n -b build_flatpak /app/share/OrcaSlicer/profiles
cleanup:
- /include
post-install:
- | # Desktop integration files
install -Dm644 -t /app/share/icons/hicolor/scalable/apps/ resources/images/OrcaSlicer.svg
install -Dm644 ${FLATPAK_ID}.metainfo.xml /app/share/metainfo/${FLATPAK_ID}.metainfo.xml
desktop-file-edit --set-key=Exec --set-value="entrypoint %U" /app/share/applications/${FLATPAK_ID}.desktop
install -Dm755 entrypoint /app/bin
install -Dm755 umount /app/bin
- install -Dm644 LICENSE.txt /app/share/licenses/${FLATPAK_ID}/LICENSE.txt
- | # Install fonts into fontconfig-scanned directory so Pango finds them
# before initialization (avoids ensure_faces crash from AddPrivateFont)
install -Dm644 -t /app/share/fonts/OrcaSlicer/ resources/fonts/*.ttf
fc-cache -f /app/share/fonts/OrcaSlicer/
sources:
# OrcaSlicer source tree (specific dirs to avoid copying .git from worktree)
- type: dir
path: ../../cmake
dest: cmake
- type: dir
path: ../../deps_src
dest: deps_src
- type: dir
path: ../../resources
dest: resources
- type: dir
path: ../../src
dest: src
- type: dir
path: ../../localization
dest: localization
- type: file
path: ../../CMakeLists.txt
- type: file
path: ../../LICENSE.txt
- type: file
path: ../../version.inc
- type: file
path: ../run_gettext.sh
dest: scripts
- type: file
path: ../build_preset_cache.sh
dest: scripts
# AppData metainfo for GNOME Software & Co.
- type: file
path: com.orcaslicer.OrcaSlicer.metainfo.xml
# Startup script
- type: file
path: entrypoint
# umount wrapper used to redirect umount calls to UDisks2
- type: file
path: umount