|
| 1 | +# Design doc: bump `compat.eui-neo` to 0.6.3 |
| 2 | + |
| 3 | +Date: 2026-11-15 |
| 4 | + |
| 5 | +Follow-up to `.agents/docs/2026-10-30-bump-eui-neo-0.6.2-plan.md` and commit `1809c8b` (0.6.2). |
| 6 | +Upstream released 0.6.3; this bumps the index from 0.6.2 to 0.6.3. |
| 7 | + |
| 8 | +## Source and version |
| 9 | + |
| 10 | +| | | |
| 11 | +|---|---| |
| 12 | +| Upstream | `https://github.com/sudoevolve/EUI-NEO` | |
| 13 | +| Version | `0.6.3` (latest release, 2026-11-12) | |
| 14 | +| Tarball | `archive/refs/tags/v0.6.3.tar.gz` | |
| 15 | +| sha256 | `08074e2fb72662c8a4c2f7d75dec558aed2c751545797e0ccccbdbe8f439b669` (computed twice from two fresh downloads, stable) | |
| 16 | +| Wrap dir | `EUI-NEO-0.6.3/` — absorbed by the existing `install()` hook (`normalise_layout`) | |
| 17 | +| CN mirror | **pending** — no `mcpp-res` write access on this machine; plain-string url fallback per SOP | |
| 18 | +| License | Apache-2.0 (unchanged) | |
| 19 | +| Auto-update | not covered by `.github/xpkgindex-update.yml` (the descriptor has `generated_files` + an `install()` hook); bumped manually | |
| 20 | + |
| 21 | +## What changed upstream (0.6.2 → 0.6.3) |
| 22 | + |
| 23 | +Release notes: `docs/releases/v0.6.3.md` (keyboard navigation + focus, a |
| 24 | +backend-agnostic widget semantics snapshot, virtualized `dataTable`, system |
| 25 | +save/directory dialogs, input undo byte budgets, line-chart sampling, |
| 26 | +async/serial lifecycle fixes, docs reorganisation). |
| 27 | + |
| 28 | +- **`CORE_SOURCES` and `VULKAN_SOURCES` are byte-identical to 0.6.2** |
| 29 | + (extracted and diffed from both `CMakeLists.txt`). Every changed core file |
| 30 | + is already in the source list (`async.cpp`, `platform.cpp`, `primitive.cpp`, |
| 31 | + runtime headers, `window_backend.cpp`); the only new headers are |
| 32 | + `core/accessibility.h` and `include/eui/accessibility.h`, both header-only |
| 33 | + and re-exported by `include/eui_neo.h`. |
| 34 | +- **The one link-line change**: upstream's Windows block grew |
| 35 | + `ole32 comdlg32 uuid` (`target_link_libraries(eui_neo PUBLIC …)`), for |
| 36 | + `platform.cpp`'s new directory picker (`CoCreateInstance(CLSID_FileOpenDialog, |
| 37 | + … IID_PPV_ARGS)`, `SHCreateItemFromParsingName`). This descriptor already |
| 38 | + named ole32/comdlg32 from the 0.6.1 CI work; `-luuid` is the new name (the |
| 39 | + `IID_*`/`CLSID_*` GUID symbols). The linux implementation shells out to |
| 40 | + zenity/kdialog and the macOS one to osascript, so neither leg gains a |
| 41 | + link-time dependency. |
| 42 | +- **New optional module with a TU**: `modules/serial/` ships |
| 43 | + `serial.cpp`/`serial.h` and CMake builds it as `eui::module_serial`, a |
| 44 | + separate target linking `eui::neo` — it is NOT part of `CORE_SOURCES`, and |
| 45 | + the only in-tree consumer is the `serial_tool` example and the `serial_port` |
| 46 | + unit test (which compiles the TU per-test). Exposed here as the `serial` |
| 47 | + feature (see below). `modules/keyboard/` is a single header with no TU, so |
| 48 | + it needs no feature entry — the `*` include root already serves it. |
| 49 | +- The SDL2 branch of `window_backend.cpp` keeps 0.6.2's hoisted |
| 50 | + `sendX11MoveResizeForWindow` definition (`#endif` position unchanged across |
| 51 | + 0.6.2 → 0.6.3, diffed), so the 0.6.1-era package-private template stub in |
| 52 | + `mcpp_eui_backends.h` stays inert on non-linux and the linux |
| 53 | + `SDL_VIDEO_DRIVER_X11` define stays a practical no-op. **No shim change.** |
| 54 | +- No build-config macro changed: the `EUI_*` macro set extracted from |
| 55 | + `core/`, `include/` and `components/` is identical between 0.6.1 and 0.6.3. |
| 56 | + |
| 57 | +## Descriptor changes (`pkgs/e/compat.eui-neo.lua`) |
| 58 | + |
| 59 | +- `xpm.<linux|macosx|windows>["0.6.3"]`: plain-string GLOBAL url (no CN |
| 60 | + mirror yet), sha256 above. |
| 61 | +- Windows `ldflags`: `-luuid` added, with the rationale next to it. |
| 62 | +- New `serial` feature: `sources = { "*/modules/serial/serial.cpp" }` — |
| 63 | + source-gated exactly like `app-main`; a consumer that names it includes |
| 64 | + `<modules/serial/serial.h>` through the existing `*` include root. |
| 65 | +- File-top version note for 0.6.3; the `CORE_SOURCES` recipe reference moved |
| 66 | + to `v0.6.3`. |
| 67 | + |
| 68 | +## Test members |
| 69 | + |
| 70 | +- All seven `tests/examples/eui-neo*` members: pin `0.6.2` → `0.6.3`. |
| 71 | +- **New member `tests/examples/eui-neo-serial`** (registered in the root |
| 72 | + `mcpp.toml` workspace): asserts the feature at link time (SerialPort ctor/ |
| 73 | + dtor/open/isOpen come from `serial.cpp`) and at runtime opens a device path |
| 74 | + that cannot exist, so `!open().ok`, `!isOpen()`, and move-ownership leaving |
| 75 | + the moved-from object closed — no hardware, no privileges. |
| 76 | + |
| 77 | +## Verification |
| 78 | + |
| 79 | +Local Linux x86_64, mcpp **2026.11.15.1** (the CI `MCPP_VERSION`, downloaded |
| 80 | +as the release tarball), `MCPP_INDEX_MIRROR=GLOBAL`, every member cold |
| 81 | +(`target/` and `.mcpp/` removed) before its run: |
| 82 | + |
| 83 | +| Member | Result | |
| 84 | +|---|---| |
| 85 | +| `eui-neo` | `test result ok` — `compat.eui-neo smoke test: ok (parsed eui-neo v3, markdown gated off)` | |
| 86 | +| `eui-neo-window` | `test result ok` — own-main loop linked, window run opt-in | |
| 87 | +| `eui-neo-app-main` | `test result ok` — package-supplied `main()` linked | |
| 88 | +| `eui-neo-markdown` | `test result ok` — `markdown: ok (2 blocks, h1 = 'Heading')` | |
| 89 | +| `eui-neo-tray` | `test result ok` — `linux tray backend verified over a private session bus` | |
| 90 | +| `eui-neo-vulkan` | `test result ok` — `backend=vulkan, loader api 1.4.357` | |
| 91 | +| `eui-neo-sdl2` | `test result ok` — `SDL driver=dummy, curl 8.21.0-DEV ssl=OpenSSL/3.5.1` | |
| 92 | +| `eui-neo-serial` | `test result ok` — feature on: link + runtime assertions pass | |
| 93 | + |
| 94 | +Negative verification for `serial`: with the feature removed from the |
| 95 | +member's dependency declaration, the cold build fails at link with |
| 96 | +`undefined reference to 'core::serial::SerialPort::SerialPort()'` (and |
| 97 | +`isOpen`, `open`, the move ctor, `close`, the dtor) — the gating is real, not |
| 98 | +a default. Restoring the feature returns the member to `test result ok`. |
| 99 | + |
| 100 | +Index lint: `check_mirror_urls`, `check_package_name`, |
| 101 | +`check_reserved_namespace`, `check_cross_package_refs`, |
| 102 | +`check_platform_version_parity`, `check_duplicate_versions` — all clean; |
| 103 | +`mcpp xpkg parse` reports `features 7`, `parse OK`. |
| 104 | + |
| 105 | +Known local noise (pre-existing, not caused by this bump): the sdl2 member's |
| 106 | +link prints mcpp's "one library, two providers" note for zlib |
| 107 | +(`compat.zlib` vs glib's runtime `libz.so.1`, mcpp#519). The descriptor |
| 108 | +already documents why libz is not staged. |
| 109 | + |
| 110 | +## CI status |
| 111 | + |
| 112 | +PR #804 (run `43730038159`), all legs green: `lint`, `select`, `build`, `scan`, |
| 113 | +`mirror-cn-reachable`, `graphics install: no side effects on unrelated |
| 114 | +members`, workspace linux default + llvm 0–3/4, macOS, Windows, and the |
| 115 | +`candidate (compat:eui-neo 0.6.3)` install/build legs on linux |
| 116 | +default/llvm, macosx and windows. The Windows candidate + workspace legs are |
| 117 | +what validate `-luuid` and `serial.cpp`'s `windows.h` branch; the macOS leg |
| 118 | +validates the termios branch and the framework links. |
| 119 | + |
| 120 | +## Notes |
| 121 | + |
| 122 | +- macOS and Windows legs are unverified locally; the CI `workspace` legs are |
| 123 | + authoritative for `-luuid` and for `serial.cpp`'s `windows.h`/termios |
| 124 | + branches. |
| 125 | +- The `serial` feature is new surface, so the 0.6.3 bump is two things at |
| 126 | + once: three version entries and the first descriptor-level exposure of |
| 127 | + upstream's module system. If CI finds a platform-specific break in |
| 128 | + `serial.cpp`, the version entries stand on their own and the feature can be |
| 129 | + reverted without touching them. |
0 commit comments