Skip to content

FEXCore PPA-flavor Stable - FEX-2608

Choose a tag to compare

@github-actions github-actions released this 05 Aug 01:10
· 1308 commits to main since this release

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/fexfex-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-mingw release 20250920
    — clang 21.1.0 from bylaws/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_wow64
  • DW_AT_producer = clang from bylaws/llvm-project
  • DW_AT_language = DW_LANG_C11 on every CU
  • 88 compile units, all .c files, 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 package
  • FEXCore-*-PPA.zip — manual injection format (GameHub)