Skip to content

Commit 2863bb1

Browse files
authored
feat(eui-neo): add 0.6.0 (#473)
CORE_SOURCES gains exactly one TU — `core/audio/audio.cpp`, a streaming audio Player over the vendored single-header miniaudio 0.11.21 (`3rd/miniaudio.h`). The TU carries MINIAUDIO_IMPLEMENTATION itself, but it changes two things the descriptor must follow: * it includes miniaudio by BARE name, so `*/3rd` goes on the package's include path — as the platform-level `include_dirs` + `private_include_dirs` pair on all three legs. A BASE-level `private_include_dirs` was tried first and is inert (measured: audio.cpp's dep scan failed with 'miniaudio.h' file not found), so this mirrors upstream's PRIVATE include the way the glib leg does. Consumers must not inherit `3rd/` (bare stb_image.h/miniaudio.h and shadowed vendored copies); `core/audio/audio.h` is a pimpl header. * miniaudio links per-platform audio APIs: linux gains `-lm` (upstream `${CMAKE_DL_LIBS} m`), macosx gains CoreAudio + AudioToolbox + CoreFoundation; windows needs nothing (WASAPI binds at runtime). Everything else upstream moved is app- or CMake-level; tray_bridge.c differs only in comment language + EOF newline. `-fno-char8_t` is still required. No CN mirror yet (never published to mcpp-res); plain-string GLOBAL url fallback per cn-mirror.md SOP. sha256 derived and verified from the tag tarball. All seven workspace members bumped to 0.6.0 and verified locally with mcpp 2026.9.26.2: index lint clean; eui-neo, eui-neo-window, eui-neo-app-main, eui-neo-markdown, eui-neo-vulkan, eui-neo-sdl2, eui-neo-tray all pass; emitted compile_commands confirms the audio TU carries the `*/3rd` -I and consumer TUs carry neither 3rd nor glib.
1 parent 366b6ca commit 2863bb1

9 files changed

Lines changed: 183 additions & 16 deletions

File tree

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Design doc: bump `compat.eui-neo` to 0.6.0
2+
3+
Date: 2026-09-26
4+
5+
Follow-up to `.agents/docs/2026-09-04-bump-eui-neo-0.5.9-plan.md` and commit `1cf5768` (0.5.9),
6+
plus the index-side re-release `0.5.9.1` (vulkan loader re-pin). Upstream released 0.6.0;
7+
this bumps the index from 0.5.9.1 to 0.6.0.
8+
9+
## Source and version
10+
11+
| | |
12+
|---|---|
13+
| Upstream | `https://github.com/sudoevolve/EUI-NEO` |
14+
| Version | `0.6.0` (latest release) |
15+
| Tarball | `archive/refs/tags/v0.6.0.tar.gz` |
16+
| sha256 | `11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1` (derived from the tag tarball) |
17+
| Wrap dir | `EUI-NEO-0.6.0/` — absorbed by the existing `install()` hook (`normalise_layout`) |
18+
| CN mirror | **pending** — no `mcpp-res` write access on this machine; plain-string url fallback per SOP |
19+
| License | Apache-2.0 (unchanged) |
20+
21+
## What changed upstream (0.5.9 → 0.6.0)
22+
23+
- `CORE_SOURCES` gains exactly one TU: `core/audio/audio.cpp` — a streaming audio `Player`
24+
behind the new `include/eui/audio.h` (`eui::audio`, surfaced through the umbrella header).
25+
- The TU vendors **miniaudio 0.11.21** as a single header at `3rd/miniaudio.h` and carries
26+
`#define MINIAUDIO_IMPLEMENTATION` itself; no other TU in the lib touches it. Upstream adds
27+
`${EUI_MINIAUDIO_DIR}` (= `3rd/`) as a **PRIVATE** include dir because audio.cpp includes it
28+
by bare name `"miniaudio.h"`.
29+
- Upstream link additions for miniaudio: `${CMAKE_DL_LIBS} m` PUBLIC on Linux;
30+
`CoreAudio + AudioToolbox + CoreFoundation` frameworks on macOS; nothing on Windows (the
31+
WASAPI backend binds its APIs at runtime).
32+
- `core/audio/audio.h` is a pimpl header (only `<memory>`, `<string>`) — consumers never need
33+
the `3rd/` search path.
34+
- Everything else is app- or CMake-level: `EUI_ENABLE_MODULES` default, an INTERFACE
35+
`EUI_DEBUG_BUILD=1` tied to CMake Debug config, new example targets (`promo`, `vcd_viewer`),
36+
probe test properties. `tray_bridge.c` differs from 0.5.9 only in comment language + EOF
37+
newline (verified by diff). `3rd/` dependency pins, features, and flags carry over unchanged.
38+
- `-fno-char8_t` remains required.
39+
40+
## Descriptor changes (`pkgs/e/compat.eui-neo.lua`)
41+
42+
- `xpm.<linux|macosx|windows>["0.6.0"]`: plain-string GLOBAL url (no CN mirror), sha256 above.
43+
- `sources += */core/audio/audio.cpp`.
44+
- `*/3rd` added to the platform-level `include_dirs` + `private_include_dirs` pair on all
45+
three legs (linux: extended beside the glib path) — the miniaudio bare include, package-side
46+
only. ⚠️ A BASE-level `private_include_dirs` was tried first and is **inert**: measured, not
47+
assumed — audio.cpp's dependency scan failed with `'miniaudio.h' file not found` while every
48+
base-level `include_dirs` entry took effect normally. The platform-level pair is the shape
49+
the glib leg already established from emitted `compile_commands.json` (the -I lands on the
50+
package's own TUs and not on consumers'). Publishing `*/3rd` would expose bare
51+
`stb_image.h`/`nanosvg.h`/`miniaudio.h` and shadowed vendored copies of index packages in
52+
every consumer TU.
53+
- linux `ldflags += -lm`; macosx `ldflags += -framework CoreAudio -framework AudioToolbox
54+
-framework CoreFoundation`; windows unchanged.
55+
- Header comment: recipe now tracks `CMakeLists.txt` v0.6.0; `3rd/` note counts miniaudio as
56+
the fourth vendored single-file header; new 0.6.0 paragraph.
57+
58+
## Test members
59+
60+
All seven `tests/examples/eui-neo*` members bumped to `0.6.0` (the vulkan member moves from
61+
`0.5.9.1`; the rest from `0.5.9`). No test source changes: the 0.6.0 surface this workspace
62+
exercises (backends, app-mains, tray, markdown, network) is unchanged; the audio Player is
63+
new API that no member reaches yet.
64+
65+
## Verification
66+
67+
Locally, mcpp 2026.9.26.2 (upgraded for this run — the index floor moved to 2026.9.18.3),
68+
Linux x86_64:
69+
70+
- Index lint: `check_mirror_urls`, `check_platform_version_parity`, `check_duplicate_versions`,
71+
`check_package_name`, `check_cross_package_refs` — all clean on the descriptor.
72+
- First revision used a BASE-level `private_include_dirs = { "*/3rd" }`; audio.cpp's dependency
73+
scan failed (`'miniaudio.h' file not found`) — the finding recorded in the descriptor. The
74+
platform-level pair replaced it.
75+
- All seven members `mcpp test` green: eui-neo (headless), eui-neo-window, eui-neo-app-main,
76+
eui-neo-markdown, eui-neo-sdl2 (sdl2+network), eui-neo-vulkan, eui-neo-tray.
77+
- Interface check on the emitted `compile_commands.json`: the package's `core/audio/audio.cpp`
78+
TU carries `-I …/eui-neo-0.6.0/3rd`; the member's consumer TU carries neither the 3rd path
79+
nor the glib path — private pairing behaves the same as the glib leg.
80+
81+
Windows/macOS legs rest on CI: the descriptor changes there are additive (source list + the
82+
same private include pair + frameworks), and upstream's own CMake pins the same link model
83+
(nothing extra on Windows; three frameworks on macOS).

‎pkgs/e/compat.eui-neo.lua‎

Lines changed: 93 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
-- libpng, zlib, glad, tray, yyjson, md4c). NONE of those are built here: each
1212
-- one already exists in this index as its own `compat.*` package at the same
1313
-- upstream version, and building them once for the whole ecosystem is the
14-
-- point of having them. `3rd/` is still on the include path because three
14+
-- point of having them. `3rd/` is still on the include path because four
1515
-- genuinely vendored single-file headers live at its root (stb_image,
16-
-- nanosvg, nanosvgrast) and the sources include them as `"3rd/stb_image.h"`.
16+
-- nanosvg, nanosvgrast, and since 0.6.0 miniaudio) and the sources include
17+
-- them as `"3rd/stb_image.h"` — except miniaudio, which audio.cpp includes
18+
-- BARE; see the 0.6.0 note below.
1719
--
18-
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.5.9): CORE_SOURCES
20+
-- The build recipe below tracks upstream `CMakeLists.txt` (v0.6.0): CORE_SOURCES
1921
-- plus the OpenGL backend and, for the glfw window backend, `ime_bridge.c`.
2022
-- 0.5.5 grew a Shadertoy subsystem: render_backend.h and include/eui/types.h now
2123
-- include core/render/shadertoy.h unconditionally, and opengl_backend.cpp calls
@@ -56,8 +58,30 @@
5658
-- via global properties. 3rd/, dependencies, features, and flags carry over
5759
-- unchanged.
5860
--
61+
-- 0.6.0: CORE_SOURCES gains one TU — `core/audio/audio.cpp`, a streaming
62+
-- audio Player behind the new `include/eui/audio.h`. Its only third-party
63+
-- need is miniaudio 0.11.21, vendored as the single header `3rd/miniaudio.h`
64+
-- (same category as stb_image/nanosvg — genuinely vendored, not mirrored as
65+
-- an index package), and the TU carries `#define MINIAUDIO_IMPLEMENTATION`
66+
-- itself, so NOTHING else in the lib touches it. Two things follow:
67+
-- * audio.cpp includes it as a BARE `"miniaudio.h"` (upstream adds
68+
-- `EUI_MINIAUDIO_DIR` = `3rd/` as a PRIVATE include dir), so `*/3rd` must
69+
-- be on this package's include path — see private_include_dirs below.
70+
-- PUBLISHED headers stay clean: `core/audio/audio.h` hides miniaudio
71+
-- behind a pimpl, so consumers must not inherit the raw `3rd/` path
72+
-- (it would expose bare stb_image.h/nanosvg.h and shadow real index
73+
-- packages for every consumer TU).
74+
-- * miniaudio links something on every platform (upstream: `${CMAKE_DL_LIBS}
75+
-- m` PUBLIC on Linux, CoreAudio+AudioToolbox+CoreFoundation on macOS,
76+
-- nothing on Windows — the WASAPI backend is dlopen-bound at runtime).
77+
-- Everything else this release moves is app- or CMake-level: the
78+
-- EUI_ENABLE_MODULES default, an INTERFACE `EUI_DEBUG_BUILD=1` tied to the
79+
-- Debug CONFIG, promo/vcd_viewer example targets, and Chinese re-commenting
80+
-- of tray_bridge.c (diff vs 0.5.9: comments + EOF newline only). `3rd/`,
81+
-- deps and the backend/app-main source lists are unchanged.
82+
--
5983
-- All `mcpp` paths are GLOBS relative to the verdir; the leading `*/` absorbs
60-
-- the GitHub tarball's `EUI-NEO-0.5.9/` wrap layer.
84+
-- the GitHub tarball's `EUI-NEO-0.6.0/` wrap layer.
6185
package = {
6286
spec = "1",
6387
namespace = "compat",
@@ -155,6 +179,14 @@ package = {
155179
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.5.9.tar.gz",
156180
sha256 = "370d1da706d94bbbb144fa1634e1d9796a8a1ffd58b696fbb801296aef15703d",
157181
},
182+
-- 0.6.0 has no CN mirror yet (never published to mcpp-res), so it
183+
-- is a plain-string GLOBAL url — check_mirror_urls.lua exempts
184+
-- plain strings, and the maintainer flips it to { GLOBAL, CN }
185+
-- when the mirror lands.
186+
["0.6.0"] = {
187+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
188+
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
189+
},
158190
},
159191
macosx = {
160192
["0.5.3"] = {
@@ -197,6 +229,11 @@ package = {
197229
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.5.9.tar.gz",
198230
sha256 = "370d1da706d94bbbb144fa1634e1d9796a8a1ffd58b696fbb801296aef15703d",
199231
},
232+
-- 0.6.0: see the linux block — plain-string GLOBAL, no CN mirror.
233+
["0.6.0"] = {
234+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
235+
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
236+
},
200237
},
201238
windows = {
202239
["0.5.3"] = {
@@ -239,6 +276,11 @@ package = {
239276
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.5.9.tar.gz",
240277
sha256 = "370d1da706d94bbbb144fa1634e1d9796a8a1ffd58b696fbb801296aef15703d",
241278
},
279+
-- 0.6.0: see the linux block — plain-string GLOBAL, no CN mirror.
280+
["0.6.0"] = {
281+
url = "https://github.com/sudoevolve/EUI-NEO/archive/refs/tags/v0.6.0.tar.gz",
282+
sha256 = "11d0725bcc6f16abbbea6052b58c6949008cf78ceaa1645002ba1b3abf9772a1",
283+
},
242284
},
243285
},
244286

@@ -250,6 +292,21 @@ package = {
250292
-- `*/include` carries the umbrella `eui_neo.h` and `eui/*.h`; `*` is the
251293
-- verdir root, which is what makes the `"components/…"`, `"core/…"` and
252294
-- `"3rd/stb_image.h"` quoted includes resolve. Upstream marks both PUBLIC.
295+
-- `*/3rd` is added to the PRIVATE include set of every platform block
296+
-- below (0.6.0: audio.cpp includes the vendored `3rd/miniaudio.h` by
297+
-- BARE name — see the header comment). Not here: a BASE-level
298+
-- `private_include_dirs` is inert — measured, not assumed. The first
299+
-- revision of this 0.6.0 change carried it and audio.cpp's dependency
300+
-- scan failed with `'miniaudio.h' file not found` while every base
301+
-- `include_dirs` entry took effect normally. The proven shape is the
302+
-- glib pair below: `include_dirs` + `private_include_dirs` in the
303+
-- PLATFORM block, which yields the -I on this package's own TUs and
304+
-- NOT on consumers' (verified in emitted compile_commands), matching
305+
-- upstream's `target_include_directories(eui_neo PRIVATE …)`.
306+
-- Publishing `*/3rd` would hand every consumer a search path holding
307+
-- bare stb_image.h/nanosvg.h/miniaudio.h and shadowed copies of the
308+
-- index packages vendored under 3rd/; `core/audio/audio.h` is a pimpl
309+
-- header that never mentions miniaudio, so nothing needs it publicly.
253310
include_dirs = { "*/include", "*", "mcpp_generated" },
254311

255312
-- mcpp#233/#240: every package in a link emits its objects into ONE
@@ -332,6 +389,11 @@ package = {
332389
-- its own TU (upstream CORE_SOURCES). GLFW branch rides on ime_bridge.h
333390
-- (ime_bridge.c, already compiled) + glfw; SDL2 branch needs only SDL.
334391
"*/core/window/window_input_backend.cpp",
392+
-- 0.6.0: streaming audio via the vendored single-header miniaudio
393+
-- (MINIAUDIO_IMPLEMENTATION lives in this TU). Needs `*/3rd` on the
394+
-- include path — see private_include_dirs — and per-platform link
395+
-- additions — see the platform blocks.
396+
"*/core/audio/audio.cpp",
335397
},
336398

337399
targets = { ["eui-neo"] = { kind = "lib" } },
@@ -538,6 +600,12 @@ package = {
538600
-- upstream; until then this keeps us on a real upstream release
539601
-- tag rather than a fork carrying the patch.
540602
cxxflags = { "-DEUI_TRAY_WINAPI=1", "-DNOMINMAX", "-D_WIN32_WINNT=0x0A00" },
603+
-- 0.6.0: audio.cpp's bare `#include "miniaudio.h"` — the same
604+
-- platform-level pair the linux leg proves (see the note above
605+
-- the base include_dirs). No link addition is needed on Windows:
606+
-- miniaudio's WASAPI backend binds its APIs at runtime.
607+
include_dirs = { "*/3rd" },
608+
private_include_dirs = { "*/3rd" },
541609
-- Upstream lists winmm/urlmon/shell32/user32/imm32/pdh and stops
542610
-- there, because CMake's MSVC default `CMAKE_C_STANDARD_LIBRARIES`
543611
-- already drags in kernel32/user32/gdi32/shell32/ole32/comdlg32/…
@@ -570,7 +638,17 @@ package = {
570638
-- bridge files; the AppKit tray path is Cocoa-native and never
571639
-- includes tray.h.
572640
cflags = { "-DEUI_TRAY_APPKIT=1" },
573-
ldflags = { "-framework", "Cocoa", "-lobjc" },
641+
-- 0.6.0: audio.cpp's bare `#include "miniaudio.h"` — the same
642+
-- platform-level pair the linux leg proves. See the note above
643+
-- the base include_dirs for why BASE-level private_include_dirs
644+
-- does not work.
645+
include_dirs = { "*/3rd" },
646+
private_include_dirs = { "*/3rd" },
647+
-- 0.6.0: the three audio frameworks upstream links PUBLIC for
648+
-- miniaudio's CoreAudio backend.
649+
ldflags = { "-framework", "Cocoa", "-lobjc",
650+
"-framework", "CoreAudio", "-framework", "AudioToolbox",
651+
"-framework", "CoreFoundation" },
574652
flags = {
575653
{ glob = "*/core/platform/native_bridge.c", cflags = { "-x", "objective-c" } },
576654
{ glob = "*/core/platform/tray_bridge.c", cflags = { "-x", "objective-c" } },
@@ -631,16 +709,22 @@ package = {
631709
-- Where install() put glib. PRIVATE: `<gio/gio.h>` is included by
632710
-- tray_bridge.c and by nothing this package publishes, so a
633711
-- consumer must not inherit a glib header search path.
634-
include_dirs = { "mcpp_generated/glib/include/glib-2.0" },
635-
private_include_dirs = { "mcpp_generated/glib/include/glib-2.0" },
712+
-- `*/3rd` joins for 0.6.0 (audio.cpp's bare `"miniaudio.h"` — see
713+
-- the note above the base include_dirs): package-side only, same
714+
-- proven pairing as the glib path.
715+
include_dirs = { "mcpp_generated/glib/include/glib-2.0", "*/3rd" },
716+
private_include_dirs = { "mcpp_generated/glib/include/glib-2.0", "*/3rd" },
636717
-- ⚠️ THE EXPLICIT `-L` IS NOT REDUNDANT WITH `runtime.library_dirs`
637718
-- BELOW. That key becomes `-Wl,-rpath` only — it tells the LOADER
638719
-- where to look, not the LINKER. lld happens to search rpath and
639720
-- would hide this; GNU ld does not, and `-lglib-2.0` then falls
640721
-- through to whatever the host has (or to nothing).
641722
--
642-
-- `-ldl` is glad's CMAKE_DL_LIBS.
643-
ldflags = { "-lpthread", "-ldl",
723+
-- `-ldl` is glad's CMAKE_DL_LIBS; `-lm` joins for 0.6.0, where
724+
-- upstream adds `${CMAKE_DL_LIBS} m` PUBLIC for miniaudio's ALSA
725+
-- backend. (Linking libm is not staging it — the forbidden list
726+
-- below is about payload RUNPATH contents.)
727+
ldflags = { "-lpthread", "-ldl", "-lm",
644728
"-Lmcpp_generated/glib/lib",
645729
"-lgio-2.0", "-lgobject-2.0", "-lglib-2.0" },
646730
runtime = {

‎tests/examples/eui-neo-app-main/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ name = "eui-neo-app-main-tests"
3030
version = "0.1.0"
3131

3232
[dependencies.compat]
33-
eui-neo = { version = "0.5.9", features = ["app-main"] }
33+
eui-neo = { version = "0.6.0", features = ["app-main"] }

‎tests/examples/eui-neo-markdown/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ version = "0.1.0"
77
# what switches components/markdown.h from its fallback to the real parser.
88

99
[dependencies.compat]
10-
eui-neo = { version = "0.5.9", features = ["markdown"] }
10+
eui-neo = { version = "0.6.0", features = ["markdown"] }

‎tests/examples/eui-neo-sdl2/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ version = "0.1.0"
77
# into a real libcurl-backed implementation. The render backend stays OpenGL,
88
# unnamed — naming a feature no longer costs you the defaults.
99
[dependencies.compat]
10-
eui-neo = { version = "0.5.9", features = ["sdl2", "network"] }
10+
eui-neo = { version = "0.6.0", features = ["sdl2", "network"] }

‎tests/examples/eui-neo-tray/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ name = "eui-neo-tray-tests"
2525
version = "0.1.0"
2626

2727
[dependencies.compat]
28-
eui-neo = "0.5.9"
28+
eui-neo = "0.6.0"

‎tests/examples/eui-neo-vulkan/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version = "0.1.0"
66
# package resolves the exclusive choice in its own preprocessor from the
77
# MCPP_FEATURE_* flags. The window backend stays GLFW, unnamed.
88
[dependencies.compat]
9-
eui-neo = { version = "0.5.9.1", features = ["vulkan"] }
9+
eui-neo = { version = "0.6.0", features = ["vulkan"] }
1010

1111
[build]
1212
cxxflags = ["-DHAVE_EUI_VULKAN=1"]

‎tests/examples/eui-neo-window/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ name = "eui-neo-window-tests"
3434
version = "0.1.0"
3535

3636
[dependencies.compat]
37-
eui-neo = "0.5.9"
37+
eui-neo = "0.6.0"

‎tests/examples/eui-neo/mcpp.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ name = "eui-neo-tests"
33
version = "0.1.0"
44

55
[dependencies.compat]
6-
eui-neo = "0.5.9"
6+
eui-neo = "0.6.0"

0 commit comments

Comments
 (0)