From 3485e577f1b4eb1905bba425ee8eac951c2cedf8 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 22 May 2026 08:36:34 +0200 Subject: [PATCH 1/7] new(winehq.org): headless wine for Windows-binary CI testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minimal headless wine build — no X11, no OpenGL, no audio, 64-bit only, no wine tests. Aimed at the use case described in pkgxdev/pantry#12985 and the brewkit#346 RFC: run cross-compiled .exe files inside brewkit's Linux test sandbox to validate native-Windows pantry recipes. What it provides: - bin/wine, bin/wine64 (the runtime) - bin/winepath (path-translation helper) - bin/wineserver (the wine background service) - bin/winecfg (mostly stub-useful, included for completeness) What it does NOT support: - GUI apps (no X11) - 3D / Vulkan / OpenGL - Audio (ALSA, Pulse, OSS all disabled) - Multimedia (SDL, gstreamer disabled) - Peripherals (USB, CUPS, gphoto, V4L2, SANE all disabled) - 32-bit Win binaries (--enable-archs=x86_64 only) - Wine's own test suite (--disable-tests) Pilot platform: linux/x86-64 only. linux/aarch64 + darwin/* are follow-ups (wine-side complications: aarch64 needs qemu-user or hangover for x86-64 Win binaries; darwin needs the macOS-32-bit dance). Test step: `wine64 --version` returns "wine-X.Y" — proves the binary loads + can run a basic console command. Recipes that depend on wine (starting with pkgxdev/pantry#12984's llvm-mingw test step) get the full runtime check for free. Refs: pkgxdev/pantry#12985 (this issue), pkgxdev/brewkit#346 (RFC). --- projects/winehq.org/package.yml | 106 ++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 projects/winehq.org/package.yml diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml new file mode 100644 index 0000000000..499345d967 --- /dev/null +++ b/projects/winehq.org/package.yml @@ -0,0 +1,106 @@ +# Wine: Windows API implementation for POSIX hosts. +# +# Headless minimal build aimed at CI use — runs cross-compiled +# Windows .exe files in brewkit's Linux test sandbox so we can +# validate native-Windows pantry recipes without spinning up +# GitHub Windows runners. See pkgxdev/pantry#12985 for context +# and pkgxdev/brewkit#346 for the broader RFC. +# +# What's deliberately out of this build: +# +# - X11 (--without-x): no GUI in CI +# - OpenGL/Vulkan/OSMesa: no 3D rendering +# - ALSA/PulseAudio/OSS: no audio +# - SDL/GStreamer: no media +# - CUPS/gphoto2/USB/V4L2/SANE/UDev: no peripherals +# - 32-bit Win support (--enable-archs=x86_64): 64-bit only +# - tests (--disable-tests): skip wine's own test suite (massive +# build-time saving, irrelevant for our use case) +# +# Result: a headless wine64 binary that can launch a console-only +# Windows .exe and capture its stdout/stderr. Good for CLI tool +# testing; not useful for GUI apps, games, or anything graphical. + +distributable: + url: https://dl.winehq.org/wine/source/{{ version.major }}.0/wine-{{ version.raw }}.tar.xz + strip-components: 1 + +# Use the github mirror's tag list, filtering down to numeric semver +# tags (excludes legacy daily-build tags like wine-20050930). +versions: + github: wine-mirror/wine/tags + match: /^wine-\d{2,}\.\d+(\.\d+)?$/ + strip: /^wine-/ + +# Pilot scope: linux/x86-64 only. Once the integration with +# brewkit#346 lands, expanding to linux/aarch64 + darwin/* is +# a follow-up — both have wine-side complications: +# - linux/aarch64: wine can run aarch64 Windows binaries but +# x86-64 Windows requires qemu-user or hangover +# - darwin: Apple deprecated 32-bit; wine 11.x ships darwin +# support but it's a meaningful extra config dance +platforms: + - linux/x86-64 + +build: + dependencies: + gnu.org/bison: '^3' + github.com/westes/flex: '*' + perl.org: '^5' + gnu.org/gettext: '*' + freetype.org: '*' + gnutls.org: '*' + zlib.net: '*' + gnu.org/make: '*' + gnu.org/gcc: '*' + gnu.org/binutils: '*' + + script: + - ./configure $ARGS + - make --jobs {{ hw.concurrency }} + - make install + + env: + ARGS: + - --prefix={{ prefix }} + - --enable-archs=x86_64 # 64-bit only — half the build, all we need + - --disable-tests # skip wine's massive internal test suite + - --without-x # no X11 + - --without-opengl + - --without-osmesa + - --without-vulkan + - --without-alsa + - --without-pulse + - --without-oss + - --without-sdl + - --without-gstreamer + - --without-cups + - --without-gphoto + - --without-capi + - --without-cms + - --without-udev + - --without-v4l2 + - --without-sane + - --without-usb + - --without-pcap + - --without-fontconfig + - --without-krb5 + +test: + # `wine64 --version` returns "wine-X.Y" on stable, "wine-X.Y (Staging)" + # on staging. We just check that it ran and printed a sane version. + script: + - run: | + out=$(wine64 --version 2>&1) + echo "wine64 --version: $out" + case "$out" in + "wine-{{version.marketing}}"*) echo PASS ;; + *) echo "FAIL: expected wine-{{version.marketing}}, got $out"; exit 1 ;; + esac + +provides: + - bin/wine + - bin/wine64 + - bin/winepath + - bin/wineserver + - bin/winecfg From 1aac3add16ab9bb897f8a8e558f627437d53c692 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 22 May 2026 13:22:36 +0200 Subject: [PATCH 2/7] =?UTF-8?q?fix(winehq):=20restrict=20versions=20to=20s?= =?UTF-8?q?table=20(X.0)=20=E2=80=94=20dev=20releases=20live=20at=20.../X.?= =?UTF-8?q?x/,=20broke=20URL=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/winehq.org/package.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml index 499345d967..621832f16c 100644 --- a/projects/winehq.org/package.yml +++ b/projects/winehq.org/package.yml @@ -25,11 +25,16 @@ distributable: url: https://dl.winehq.org/wine/source/{{ version.major }}.0/wine-{{ version.raw }}.tar.xz strip-components: 1 -# Use the github mirror's tag list, filtering down to numeric semver -# tags (excludes legacy daily-build tags like wine-20050930). +# Use the github mirror's tag list, filtering to STABLE-branch tags +# only (X.0 and X.0.Y). Wine's release naming: +# wine-X.0 — stable (annual, lives at dl.winehq.org/.../X.0/) +# wine-X.Y — dev release (lives at dl.winehq.org/.../X.x/) +# wine-X.0-rcN — release candidates (skipped) +# We pick only stable so the URL template (.../{{major}}.0/) resolves. +# Also excludes legacy daily-build tags like wine-20050930. versions: github: wine-mirror/wine/tags - match: /^wine-\d{2,}\.\d+(\.\d+)?$/ + match: /^wine-\d{2,}\.0(\.\d+)?$/ strip: /^wine-/ # Pilot scope: linux/x86-64 only. Once the integration with From a5a6ef2a83878663a4ba387dca131dfd82aa21f6 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 22 May 2026 15:06:03 +0200 Subject: [PATCH 3/7] fix(winehq): switch versions to url: mode (github: ignores match:) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brewkit's github: codepath silently ignores match:, so my previous regex didn't filter anything — pantry picked wine-11.9 (dev release) which lives in dl.winehq.org/source/11.x/, not /11.0/, so the URL template 404'd. Switch to url: mode (same shape as gnu.org/glibc): url: https://dl.winehq.org/wine/source/ match: /\d{2,}\.0\// # only stable major-version directories strip: /\// Picks the latest stable (currently wine-11.0). Excludes 11.x/ dev release dirs because match looks for an exact \d.0/ pattern. --- projects/winehq.org/package.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml index 621832f16c..8c6e1cb94a 100644 --- a/projects/winehq.org/package.yml +++ b/projects/winehq.org/package.yml @@ -25,17 +25,19 @@ distributable: url: https://dl.winehq.org/wine/source/{{ version.major }}.0/wine-{{ version.raw }}.tar.xz strip-components: 1 -# Use the github mirror's tag list, filtering to STABLE-branch tags -# only (X.0 and X.0.Y). Wine's release naming: +# Wine's release naming: # wine-X.0 — stable (annual, lives at dl.winehq.org/.../X.0/) # wine-X.Y — dev release (lives at dl.winehq.org/.../X.x/) -# wine-X.0-rcN — release candidates (skipped) -# We pick only stable so the URL template (.../{{major}}.0/) resolves. -# Also excludes legacy daily-build tags like wine-20050930. +# wine-X.0-rcN — release candidates +# +# We list ONLY stable major-version directories from the dl.winehq.org +# index, then semver-sort to pick the latest. URL mode is required: +# brewkit's `github:` mode silently ignores `match:`, so we can't use +# it to filter dev releases out of the tag list. versions: - github: wine-mirror/wine/tags - match: /^wine-\d{2,}\.0(\.\d+)?$/ - strip: /^wine-/ + url: https://dl.winehq.org/wine/source/ + match: /\d{2,}\.0\// + strip: /\// # Pilot scope: linux/x86-64 only. Once the integration with # brewkit#346 lands, expanding to linux/aarch64 + darwin/* is From 2b0d3dfc69d389192632fbff332d93f2abbd0687 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Fri, 22 May 2026 15:18:00 +0200 Subject: [PATCH 4/7] =?UTF-8?q?fix(winehq):=20--without-mingw=20=E2=80=94?= =?UTF-8?q?=20use=20wine's=20builtin=20win-side=20DLLs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI surface: `configure: error: x86_64 PE cross-compiler not found` because --enable-archs=x86_64 implicitly requires a mingw cross- compiler on PATH (to build wine's Windows-side DLLs from source). For our headless-CI use case we don't need built-from-source win DLLs — wine's builtin ones (no mingw, fallback path) are sufficient to load + execute simple PE binaries. Bonus: avoids the build-dep cycle with pkgxdev/pantry#12984 (llvm-mingw) once that recipe lands — wine would otherwise build- depend on the cross-compiler whose recipe build-depends on wine for its own runtime testing. --- projects/winehq.org/package.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml index 8c6e1cb94a..c46a537380 100644 --- a/projects/winehq.org/package.yml +++ b/projects/winehq.org/package.yml @@ -72,6 +72,10 @@ build: - --prefix={{ prefix }} - --enable-archs=x86_64 # 64-bit only — half the build, all we need - --disable-tests # skip wine's massive internal test suite + - --without-mingw # use wine's built-in win-side DLLs instead of + # mingw-cross-compiled ones (avoids requiring + # llvm.org/mingw-w64 at build time, which would + # be a build-dep cycle once mingw recipe lands) - --without-x # no X11 - --without-opengl - --without-osmesa From 4c0f359751483c173e71ad70d3f2052fae57a6cc Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sat, 13 Jun 2026 13:10:37 +0200 Subject: [PATCH 5/7] fix(winehq.org): build the PE DLLs with llvm.org/mingw-w64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit configure aborted with `x86_64 PE cross-compiler not found`: modern Wine builds its built-in DLLs as real PE binaries and has no ELF-builtin fallback, so `--without-mingw` doesn't avoid the requirement — it still needs a PE cross-compiler. Now that llvm.org/mingw-w64 is in main, add it as a build dep (it provides x86_64-w64-mingw32-{gcc,clang}) and switch to `--with-mingw`. No build-dep cycle: the mingw recipe only uses Wine in its test step. Co-Authored-By: Claude Opus 4.8 (1M context) --- projects/winehq.org/package.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml index c46a537380..4e45897278 100644 --- a/projects/winehq.org/package.yml +++ b/projects/winehq.org/package.yml @@ -61,6 +61,12 @@ build: gnu.org/make: '*' gnu.org/gcc: '*' gnu.org/binutils: '*' + # Modern Wine compiles its built-in DLLs as real PE binaries, so it + # needs a PE cross-compiler at build time — configure aborts with + # "x86_64 PE cross-compiler not found" without one. llvm.org/mingw-w64 + # provides x86_64-w64-mingw32-{gcc,clang}. No build-dep cycle: the + # mingw recipe uses Wine only in its *test* step, never its build. + llvm.org/mingw-w64: '*' script: - ./configure $ARGS @@ -72,10 +78,11 @@ build: - --prefix={{ prefix }} - --enable-archs=x86_64 # 64-bit only — half the build, all we need - --disable-tests # skip wine's massive internal test suite - - --without-mingw # use wine's built-in win-side DLLs instead of - # mingw-cross-compiled ones (avoids requiring - # llvm.org/mingw-w64 at build time, which would - # be a build-dep cycle once mingw recipe lands) + - --with-mingw # build the win-side DLLs as PE with the + # llvm.org/mingw-w64 cross-compiler (now a + # build dep). Required: modern Wine has no + # ELF-builtin fallback, so configure demands + # a PE cross-compiler regardless. - --without-x # no X11 - --without-opengl - --without-osmesa From 9fc2f3c98f2728ca72ada54aba21cfaae02bf791 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Sat, 13 Jun 2026 13:40:16 +0200 Subject: [PATCH 6/7] ci(winehq.org): re-trigger now that llvm.org/mingw-w64 bottle is published Validated locally on Debian: `./configure --with-mingw --enable-archs=x86_64` (and aarch64) detects the mingw PE cross-compiler and succeeds. The earlier CI red likely built mingw-w64 from source inline (bottle not yet published); re-running against the published bottle. Co-Authored-By: Claude Opus 4.8 (1M context) From 7851b267144065125f2167bfcdd2f8658fdc8a5c Mon Sep 17 00:00:00 2001 From: Jacob Heider Date: Sat, 13 Jun 2026 11:56:43 -0400 Subject: [PATCH 7/7] Update package.yml for WineHQ configuration include debugging cat of config.log --- projects/winehq.org/package.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/projects/winehq.org/package.yml b/projects/winehq.org/package.yml index 4e45897278..47f0fb797e 100644 --- a/projects/winehq.org/package.yml +++ b/projects/winehq.org/package.yml @@ -58,7 +58,6 @@ build: freetype.org: '*' gnutls.org: '*' zlib.net: '*' - gnu.org/make: '*' gnu.org/gcc: '*' gnu.org/binutils: '*' # Modern Wine compiles its built-in DLLs as real PE binaries, so it @@ -69,7 +68,7 @@ build: llvm.org/mingw-w64: '*' script: - - ./configure $ARGS + - ./configure $ARGS || (cat config.log && false) - make --jobs {{ hw.concurrency }} - make install @@ -107,14 +106,8 @@ build: test: # `wine64 --version` returns "wine-X.Y" on stable, "wine-X.Y (Staging)" # on staging. We just check that it ran and printed a sane version. - script: - - run: | - out=$(wine64 --version 2>&1) - echo "wine64 --version: $out" - case "$out" in - "wine-{{version.marketing}}"*) echo PASS ;; - *) echo "FAIL: expected wine-{{version.marketing}}, got $out"; exit 1 ;; - esac + - wine64 --version 2>&1 | tee out + - grep "wine-{{version.marketing}}" out provides: - bin/wine