FEXCore PPA-flavor Stable - FEX-2608
FEXCore PPA-flavor Stable: FEX-2608
A maximally faithful reproduction of the fex-emu-wine PPA build
flavor for stable tag FEX-2608
(commit e869aa644).
Build recipe sourced directly from FEX-Emu/FEX-ppa/deb_wine_base/rules
— the upstream Debian packaging file. Every cmake flag, install
path, toolchain pin, and version override matches upstream
byte-for-byte; calibrated against the actual FEX-2604 PPA wcp at
−0.16% size drift (functionally identical).
What's special about the "PPA flavor"?
The Launchpad PPA (ppa:fex-emu/fex → fex-emu-wine package) ships
a wcp with a build configuration that differs from FEX upstream's
own GitHub Actions wine_build workflow:
| Trait | This wcp / Original PPA wcp | Stripped nightly wcp |
|---|---|---|
| HostThunks path baked in | //fex-emu/HostThunks |
/usr/lib/wine/aarch64-windows/fex-emu/HostThunks |
| DWARF debug sections | Present | None (stripped) |
| DWARF coverage | Only C runtime helpers (Musl CRT, softfloat, cephes, rpmalloc, xxhash, tiny-json) — ~88 CUs, 0 C++ | n/a |
| FEX C++ JIT code | Release-optimised, no debug info | Release-optimised, no debug info |
| Approx DLL size | ~5 MB each | ~3.6 MB each |
Toolchain
bylaws/llvm-mingwrelease20250920
— clang 21.1.0 frombylaws/llvm-project(FEX maintainer's LLVM
fork with ARM64EC/wow64 patches not yet in mainline). Calibrated
to land within −0.16% of the original FEX-2604 PPA wcp; same
workflow used for all stable tags.
Build recipe (mirrors upstream debian/rules)
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_C_FLAGS_RELEASE="-O3 -DNDEBUG -g" # -g only for C
-DCMAKE_INSTALL_PREFIX=/usr # upstream value
-DCMAKE_INSTALL_LIBDIR=/ # bakes "//fex-emu/HostThunks"
-DTUNE_ARCH=generic -DTUNE_CPU=generic # upstream value
-DOVERRIDE_VERSION=<tag-short> # upstream value
-DENABLE_LTO=False -DENABLE_ASSERTIONS=False -DBUILD_TESTING=False
-DENABLE_JEMALLOC_GLIBC_ALLOC=False
CXXFLAGS="-Wno-deprecated-enum-enum-conversion"Source cloned into /usr/src/fex-emu-wine-NNNN~q/, built in
build_wow64/ and build_arm64ec/ subdirectories — matching the
Debian packaging sandbox. DLLs taken from build_*/Bin/ (no
llvm-strip, no ninja install).
Residual ~2 KB drift is environmental, not recipe
Both this build and the upstream PPA use the same recipe and the
same bylaws/llvm-mingw 20250920 toolchain release. The remaining
drift comes from the toolchain's host architecture: PPA runs on
aarch64 hosts (Launchpad ARM64), this workflow runs on x86_64
(ubuntu-latest). The clang binaries are built from the same
source for two different hosts; their internal optimizer
heuristics differ subtly, propagating into ~2 KB of different
instruction scheduling. Same target ABI, same emitted behaviour.
Why ship this flavor at all?
You get crash-grade backtraces with file:line if something explodes
inside the C math/runtime helpers (numerically-suspect zone), without
paying the size cost of full DWARF on the C++ JIT (which would
balloon the wcp from ~5 MB to ~37 MB for no practical debugging
benefit — those code paths are mature).
How we discovered the recipe
llvm-dwarfdump on the original FEXcore-2604-PPA.wcp revealed:
DW_AT_comp_dir=/usr/src/fex-emu-wine-2604~q/build_wow64DW_AT_producer= clang frombylaws/llvm-projectDW_AT_language=DW_LANG_C11on every CU- 88 compile units, all
.cfiles, none from FEX's C++ codebase
That language-and-file pattern is only possible if -g was passed
to the C compiler but not to C++ — i.e. CFLAGS=-g on Release mode.
Files
FEXCore-*-PPA.wcp— Winlator component packageFEXCore-*-PPA.zip— manual injection format (GameHub)