Files
wehub-resource-sync 3e779be6f3
CI / lint (push) Failing after 13m4s
CI / test (3.11, ubuntu-latest) (push) Failing after 2m4s
CI / test (3.13, ubuntu-latest) (push) Successful in 13m30s
CI / test (3.14, ubuntu-latest) (push) Successful in 17m21s
CI / test (3.12, ubuntu-latest) (push) Successful in 17m55s
CI / discover-apps-ps (push) Successful in 1m56s
CI / test (3.9, ubuntu-latest) (push) Successful in 13m17s
CI / test (3.10, ubuntu-latest) (push) Successful in 26m21s
CI / audit (push) Successful in 13m38s
Deploy site / deploy (push) Has been cancelled
CI / test (3.14, ubuntu-24.04-arm) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:32:37 +08:00

123 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WinPodX AppImage build
Builds a distro-agnostic **Thin** AppImage of WinPodX (0.6.0 item A).
There are **two build paths**, both producing a Thin AppImage:
| | What is bundled | How |
|---|---|---|
| **CI (shipped release artifact)** | Python + winpodx + Qt + **FreeRDP 3** | `.github/workflows/appimage-publish.yml` |
| **`build.sh` (local dev)** | Python + winpodx + Qt | python-appimage, host-resolved FreeRDP |
The release asset attached to a tag is the CI build (the only difference vs
`build.sh` is the bundled FreeRDP overlay). Neither build bundles the
container runtime.
## Prerequisites the user provides on the host
Same model as `install.sh`:
- **`podman` (recommended)** or `docker` — installed via the
host distro package manager. Rootless podman fundamentally needs host
systemd / subuid integration that an AppImage can't carry, so WinPodX
cannot ship one that works.
- KVM kernel module + `/dev/kvm` access + `kvm` group membership.
- `/etc/subuid` + `/etc/subgid` for rootless Podman.
`winpodx setup-host` runs a one-shot `pkexec` wizard for the kvm-group /
subuid / kvm-module bits; `winpodx setup` / `winpodx doctor` surface
anything else.
The dockur/windows container image (~500MB1GB) is pulled at first pod
start via the host podman/docker.
## Why Thin (was Fat before 0.6.0)
The pre-0.6.0 Fat AppImage bundled the entire podman stack
(podman / podman-compose / conmon / crun / netavark / aardvark-dns / pasta /
slirp4netns) into `${APPDIR}/usr/bin` and prepended that directory to PATH
+ `${APPDIR}/usr/lib` to LD_LIBRARY_PATH. That broke every host that
already had a working podman:
- **#357 (Ubuntu 26.04)** — bundled `podman-compose` resolved first,
probed for a podman it couldn't drive standalone, died with
`it seems that you do not have podman installed`.
- **#363 (Fedora Bluefin)** — host `systemd-run` rootless aardvark-dns
spawn loaded the bundled `libcrypto.so.3` from the inherited
`LD_LIBRARY_PATH`, died with `OPENSSL_3.4.0 not found`.
PR #365 patched around it with a host-first `_hostenv` helper. 0.6.0
item A removes the root cause: drop the entire container stack, require
host podman/docker (same model as `install.sh`) and stops fighting
the host. That alone only reached ~274 MB (from ~296 MB fat), so a
companion Qt6 slim (`slim-pyside6.sh`) strips the unused Qt6 modules
PySide6 bundles — winpodx links only QtCore/QtGui/QtWidgets/QtSvg/
QtDBus — bringing the AppImage to ~110 MB. `_hostenv`
collapses to an `LD_LIBRARY_PATH` strip (still needed: bundled FreeRDP /
Python / Qt keep the AppImage's `LD_LIBRARY_PATH`, and host helpers
spawned by the host runtime must not inherit bundled libcrypto / libssl).
## CI release artifact (Thin)
`.github/workflows/appimage-publish.yml` runs on every `v*.*.*` tag
push, builds the Thin AppImage, and uploads it as a release asset
alongside the `.deb` / `.rpm` / wheel artefacts.
**Bundled:**
- Python 3.11 runtime (astral-sh python-build-standalone, pinned tag +
SHA256-verified against its `.sha256` sidecar)
- `winpodx` wheel + `gui` (PySide6/Qt6) + `reverse-open`
(Pillow / cairosvg / pyxdg) extras
- FreeRDP 3 client: `xfreerdp3`, `wlfreerdp3`, `sdl-freerdp3` (from
Fedora 41) — leaf binary, doesn't spawn host helpers
- Transitive `.so` deps for the above (via `ldd`), minus the
host-critical exclude list (glibc / libX11 / libGL / libwayland /
libxkbcommon stay on the host)
**NOT bundled** (Thin acknowledges these have to come from the host):
- Container runtime: `podman` / `podman-compose` / `conmon` / `crun` /
`netavark` / `aardvark-dns` / `pasta` / `passt` / `slirp4netns`
- KVM kernel module + `/dev/kvm` access + `kvm` group membership
- `/etc/subuid` + `/etc/subgid` for rootless Podman
- dockur/windows container image (pulled at first pod start)
## Local lean build (`build.sh`)
```bash
./packaging/appimage/build.sh
# -> packaging/appimage/winpodx-<version>-x86_64.AppImage (lean: host FreeRDP too)
```
Prerequisites: Python 3.11+, `pip install python-appimage build`,
internet (pulls PySide6 + extras from PyPI). This path does **not**
bundle FreeRDP either — it relies on the host's FreeRDP / podman,
exactly like the wheel / `.deb` / `.rpm`.
## Licensing
WinPodX itself is **MIT** and stays MIT. The Thin AppImage redistributes
only the FreeRDP 3 client stack from Fedora 41, so its license + NOTICE
texts travel inside it:
- WinPodX `LICENSE` (MIT) + `THIRD_PARTY_LICENSES.md` at
`${APPDIR}/usr/share/doc/winpodx/`
- bundled FreeRDP package licenses (Apache-2.0: `freerdp-libs`,
`libwinpr`) under `${APPDIR}/usr/share/doc/winpodx/third-party/<pkg>/`
- the python-build-standalone (PSF) license
- PySide6 / Qt6 (LGPL-3.0), cairosvg (LGPL-3.0), pyxdg (LGPL-2.0),
Pillow (HPND) carry their license in their `*.dist-info` inside
`${APPDIR}/opt/python`. The AppImage SquashFS is `--appimage-extract`-able,
satisfying LGPL relinking.
The pre-Thin podman-stack license dirs (`podman/`, `podman-compose/`,
`conmon/`, `crun/`, `netavark/`, `passt/`, `slirp4netns/`) stay vendored
in-repo at `packaging/appimage/licenses/` for provenance + to make a
future re-bundling cheap, but they no longer ship inside the AppImage
because the binaries they cover are no longer bundled.
See the repo-root `THIRD_PARTY_LICENSES.md` for the full breakdown,
including the bundled rdprrap (MIT + vendored Apache-2.0 rdpwrap) and
rcedit (MIT) that ship in every channel via the wheel's OEM payload.