diff --git a/.agents/docs/2026-08-29-add-galay-plan.md b/.agents/docs/2026-08-29-add-galay-plan.md new file mode 100644 index 00000000..2e307a64 --- /dev/null +++ b/.agents/docs/2026-08-29-add-galay-plan.md @@ -0,0 +1,91 @@ +# Add Galay 5.0.0 (`gzj-creator.galay`) + +Date: 2026-08-29 +Upstream: +Tag: `v5.0.0` (`a9e81ce8239695a8dae68314ee991339839d5409`) +Status: local Linux validation passed with mcpp 2026.8.27.1 and the CI-pinned 2026.8.27.2 check. + +## 1. Shape and identity + +Galay is source type (b), a library already developed for mcpp. Its v5.0.0 +release carries a complete `mcpp.toml`, so the index entry is Form A and does +not duplicate its build recipe. + +- Package identity: `namespace = "gzj-creator"`, `name = "galay"`. The + namespace names the upstream owner; the package name remains one atomic + segment. +- The upstream manifest builds the default `galay.utils` and `galay.kernel` + named modules plus their C++ implementations. SSL, HTTP, WebSocket, HTTP/2, + database, RPC, MCP, and tracing sources remain opt-in features in that + manifest, with the corresponding feature dependencies preserved. +- The release manifest declares `platforms = ["linux", "macos"]`. The index + therefore publishes `linux` and `macosx` entries only; Windows is omitted + until the upstream manifest gains a Windows-compatible build. +- License and description are taken from the upstream manifest: Apache-2.0, + C++23 coroutine networking and protocol framework. + +## 2. Source and hash + +Both platform entries use the immutable GitHub tag archive: + + https://github.com/gzj-creator/galay/archive/refs/tags/v5.0.0.tar.gz + +The archive is 5,227,585 bytes. `sha256sum` was run twice on the complete +archive and returned: + + 8e410d97b0615333c92192633f9495acdc8eb1d56dd94f1eeecd8e68e5a4f73e + +`tar -tzf` succeeds and confirms the root `mcpp.toml`, the tracked include +layout, and the fifteen named C++23 module interfaces are present. + +## 3. CN mirror + +`gtc` is not installed in this environment and no GitCode write credential is +available. Following `docs/cn-mirror.md`, the descriptor uses the plain GLOBAL +URL rather than inventing a mirror table. CN consumers fall back to GitHub; +the `mcpp-res/galay` mirror can be added later without changing the package +identity or version. + +## 4. Workspace member + +`tests/examples/galay` is a Unix-gated public-package consumer. Its member +manifest has exactly one project index redirect: + + [indices] + gzj-creator = { path = "../../.." } + +The test imports `galay.utils` and `galay.kernel`, checks Base64 and string +helpers, links the out-of-line `kernel::Buffer` implementation, and validates +IPv4 `kernel::Host` construction. Windows compiles a no-op `main()` because +the upstream package has no Windows platform entry. + +The first RED run failed as expected before the descriptor existed: + + error: dependency 'gzj-creator.galay': no package found for exact selector + +After adding the descriptor, the first executable run caught an incorrect +assumption about `Buffer::clear()` retaining its length; the assertion was +changed to require the documented empty state. The corrected test then passed. + +## 5. Validation + +- `mcpp xpkg parse pkgs/g/gzj-creator.galay.lua` passed with the Form-A result + and Linux/macOS version lists. +- `mcpp test -p galay` passed with mcpp 2026.8.27.1 after a cold build: + `test result ok. 1 passed; 0 failed`. +- The CI-pinned `mcpp 2026.8.27.2` test also passed offline: + `test result ok. 1 passed; 0 failed`. +- The build compiled 26 Galay units, including both default module interfaces, + the kernel implementation units, and the transitive libaio package. +- All six descriptor lint checks passed, and all 134 package descriptors passed + `mcpp xpkg parse` with the CI-pinned binary. +- Optional Galay features are intentionally not enabled by this minimal + member. They remain upstream-owned feature/dependency decisions and need + dedicated protocol/database environments before being advertised as tested. + +## 6. Follow-up + +When upstream publishes Windows support or a maintainer creates the +`mcpp-res/galay` release asset, add the platform/mirror entry with the same +archive bytes and keep the version at `5.0.0` only if the bytes remain +identical; otherwise publish a new upstream version/tag. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..19648902 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +维护说明:未发版的变更记录在 `## [Unreleased]` 下;准备发版时,按 +`vX.Y.Z` 标题格式将累计条目整理到对应版本节,并按改动性质归入 +`Added`、`Changed`、`Fixed`、`Docs` 或 `Chore`。每条记录只保留用户和维护者 +需要知道的主线变化,不逐行复制提交差异。 + +## [Unreleased] + +### Added + +- 收录 `gzj-creator.galay` 5.0.0 原生 Form-A 模块包,覆盖 `galay.utils` 与 + `galay.kernel` 默认模块,并加入 Unix 示例工程和索引文档。 diff --git a/README.md b/README.md index 80bf17be..a6e6c9d1 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ A few descriptors worth opening first, one per common shape: | Shape | Example | What it shows | |------|------|------| -| Native module library (Form A) | [`mcpplibs.tinyhttps`](pkgs/t/tinyhttps.lua) | Upstream carries its own `mcpp.toml`, so the descriptor is metadata plus a download address | +| Native module library (Form A) | [`mcpplibs.tinyhttps`](pkgs/t/tinyhttps.lua) · [`gzj-creator.galay`](pkgs/g/gzj-creator.galay.lua) | Upstream carries its own `mcpp.toml`; Galay also demonstrates a multi-module package with feature-scoped protocol layers | | C-source compat | [`compat.cjson`](pkgs/c/compat.cjson.lua) | One `.c` compiled into a lib; the optional extension sits behind a `features` gate | | Header-only | [`compat.gtl`](pkgs/c/compat.gtl.lua) | Nothing to compile — `include_dirs` and an anchor TU | | Whole-source build + generated config | [`compat.c-ares`](pkgs/c/compat.c-ares.lua) | The config header configure would have produced is snapshotted into `generated_files` | diff --git a/README.zh-CN.md b/README.zh-CN.md index 64cfef09..83b30aff 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -36,7 +36,7 @@ mcpp self config --mirror CN # 切换至国内镜像,默认使用 GLOBAL 上 | 形态 | 示例 | 看点 | |------|------|------| -| 原生模块库(Form A) | [`mcpplibs.tinyhttps`](pkgs/t/tinyhttps.lua) | 上游自带 `mcpp.toml`,描述符只有元数据与下载地址 | +| 原生模块库(Form A) | [`mcpplibs.tinyhttps`](pkgs/t/tinyhttps.lua) · [`gzj-creator.galay`](pkgs/g/gzj-creator.galay.lua) | 上游自带 `mcpp.toml`;Galay 还展示了多模块包与按 feature 开启协议层 | | C 源码 compat | [`compat.cjson`](pkgs/c/compat.cjson.lua) | 单个 `.c` 编成库;可选扩展由 `features` 门控 | | header-only | [`compat.gtl`](pkgs/c/compat.gtl.lua) | 没有可编译内容 —— `include_dirs` 加一个 anchor TU | | 全源码直编 + 生成 config | [`compat.c-ares`](pkgs/c/compat.c-ares.lua) | 把 configure 本该生成的 config 头快照进 `generated_files` | diff --git a/docs/descriptor-examples.md b/docs/descriptor-examples.md index ff83d7a5..1c1180a8 100644 --- a/docs/descriptor-examples.md +++ b/docs/descriptor-examples.md @@ -13,6 +13,7 @@ in the [root README](../README.md#reference-examples). | Shape | Examples | |------|------| | Native module library (Form A) | [`mcpplibs.xpkg`](../pkgs/x/xpkg.lua) · [`mcpplibs.tinyhttps`](../pkgs/t/tinyhttps.lua) · [`tensorvia-cpu`](../pkgs/t/tensorvia-cpu.lua) · [`ffmpeg`](../pkgs/f/ffmpeg.lua) (module layer; sources compiled directly through `compat.ffmpeg`) · [`opencv`](../pkgs/o/opencv.opencv.lua) (single repository: the module layer and the full OpenCV 5 source build both live in the package, and only this descriptor stays on the index side) · [`mcpplibs.grpc`](../pkgs/g/grpc.lua) (gRPC 1.83.0 — the one library here that CANNOT be a compat descriptor: upstream publishes no self-contained source artifact, its tag archive carrying abseil/protobuf/re2/boringssl/zlib as empty submodule placeholders, so [grpc-m](https://github.com/mcpplibs/grpc-m)'s release tarball IS that artifact. It vendors only gRPC's own source and takes the five dependencies from this index, so a consumer that also uses protobuf links one copy rather than two) | +| Native multi-module library with feature-scoped sources | [`gzj-creator.galay`](../pkgs/g/gzj-creator.galay.lua) (Galay 5.0.0 — the upstream Form-A manifest exposes `galay.utils` and `galay.kernel` by default, while SSL, HTTP, database, RPC, MCP, and tracing modules stay behind named features and their corresponding dependencies. The index keeps the upstream manifest intact and tests the default module surface on Unix.) | | C-source compat (with `features`) | [`compat.cjson`](../pkgs/c/compat.cjson.lua) · [`compat.zlib`](../pkgs/c/compat.zlib.lua) · [`compat.hiredis`](../pkgs/c/compat.hiredis.lua) (the classic 1.2.0 — a 7-TU C build whose flat tarball headers get `hiredis/`-prefixed wrapper headers via `generated_files`, so consumers write `#include ` exactly like upstream's install layout) · [`compat.sqlite3`](../pkgs/c/compat.sqlite3.lua) (plain C-source, no features: the single `sqlite3.c` amalgamation; 3.45.3, the final maintenance release of the most widely deployed 3.45.x line) · [`compat.libuv`](../pkgs/c/compat.libuv.lua) (libuv 1.48.0 — the per-OS source sets transcribed from upstream's CMakeLists, because a `src/unix/*.c` glob would compile every OS's backend at once; linux/macos get explicit unix subsets, windows globs `src/win/*.c`) | · [`compat.xxhash`](../pkgs/c/compat.xxhash.lua) (one TU, one header, no features at all — the interesting decision is what is NOT compiled: `xxh_x86dispatch.c` selects an AVX2/AVX512 path at RUNTIME and needs per-file `-mavx2` plus `XXH_X86DISPATCH` at every call site, so the package ships the flagless SSE2 baseline instead. Nor is the header-only `XXH_INLINE_ALL` mode chosen: it re-emits the implementation in every TU that hashes anything, which is the right trade only when there is exactly one such TU — something a package cannot know) | C-source compat where the library IS a kernel ABI | [`compat.libaio`](../pkgs/c/compat.libaio.lua) (libaio 0.3.113 — twelve syscall-wrapper TUs, and the only `xpm` section is `linux`, because there is no port to declare: `struct iocb` is the kernel's and every TU is `syscall(__NR_io_*, …)`. Consumers gate it with `[target.'cfg(linux)'.dependencies]`, the mirror image of compat.wil. Three things it teaches. **One public header out of a source dir**: upstream installs exactly one, `libaio.h`, but the tarball keeps it in `src/` beside the private headers — one of which is named `syscall.h` and would SHADOW glibc's for every consumer TU — so `include_dirs` names a `generated_files` forwarder and nothing else; the package's own sources reach the real header through it while their quote-form `#include "syscall.h"` still resolves next to the including `.c`, so no `-I` into `src/` is needed at all. **A `c_standard` that is a trap**: `-std=c11` sets `__STRICT_ANSI__`, which hides `syscall()` and `sigset_t`, and the public header then fails to parse at `io_pgetevents`; declaring `c_standard = "gnu11"` LOOKS like the fix but mcpp 2026.8.27.2 accepts the string and still emits `-std=c11` (visible in the emitted `compile_commands.json`), so `-D_GNU_SOURCE` in `cflags` is the spelling that takes effect. **Symbol versioning in a static package**: `io_getevents` and `io_cancel` have no ordinary definitions upstream — the functions are `io_getevents_0_4` etc. publishing short names through `.symver … @@LIBAIO_0.4` — which resolves for an executable under both ld.bfd and lld, but not when a consumer builds a `.so` straight out of these objects; that needs upstream's `src/libaio.map`, exactly as upstream's own `libaio.a` does) | | C++-source compat, one depending on the other | [`compat.abseil`](../pkgs/c/compat.abseil.lua) (151 TUs; a wildcard over `absl/**` trimmed by upstream's test/benchmark naming conventions) · [`compat.protobuf`](../pkgs/c/compat.protobuf.lua) (the libprotobuf runtime, 79 TUs transcribed from upstream's own `src/file_lists.cmake`; declares `compat.abseil` as a dependency because protobuf's public headers include `absl/…`, and its `gzip` feature defines `HAVE_ZLIB` and pulls `compat.zlib`, while `upb` adds protobuf's 64-TU C runtime out of the same tarball. It also exposes **`protoc`** as a `kind = "bin"` target, so a consumer writing `tools = ["protoc"]` gets the compiler built for its own machine out of the same package it links — making a generator/runtime version mismatch inexpressible) · [`compat.re2`](../pkgs/c/compat.re2.lua) (22 TUs, upstream's own `RE2_SOURCES`) · [`compat.redis-plus-plus`](../pkgs/c/compat.redis-plus-plus.lua) (redis++ 1.3.13 — the sync client, 17 TUs + `patterns/redlock.cpp`, depends on `compat.hiredis`; the one header CMake would generate, `hiredis_features.h`, is snapshotted via `generated_files`, and the async/TLS TUs are left out so the base build stays a two-package pair. An `async` feature adds the libuv-backed `AsyncRedis` interface (the 9 async TUs + `compat.libuv`; `event_loop.cpp` runs `uv_run` on a background thread, and `` arrives through compat.hiredis' wrapper headers). Two versions, one on each side of the source-structure watershed, share this ONE source list: 1.3.13 (modern 17-TU layout) and 1.3.3 (pre-`redis_uri.cpp`/`redlock` 15-TU layout) — the union works because 1.3.3's TUs are a strict subset, so exactly two globs match nothing there (a warning, not an error; same trick as compat.catch2)) | · [`compat.sqlitecpp`](../pkgs/c/compat.sqlitecpp.lua) (the RAII C++ wrapper over SQLite. Upstream vendors sqlite3 as a GIT SUBMODULE, so a source tarball simply does not contain it and the library cannot link — the dependency edge on `compat.sqlite3` replaces the submodule, and does it better: two consumers of SQLite in one link now share ONE amalgamation instead of each embedding a private copy with its own compile-time options. Its two CMake knobs are deliberately not set — `SQLITECPP_USE_ASSERT_ON_ERRORS` changes the error model from throwing to aborting, and `SQLITE_ENABLE_COLUMN_METADATA` has to agree with how SQLite ITSELF was built; both are the consumer's call, and the headers already guard them with `#ifdef`) diff --git a/docs/zh/descriptor-examples.md b/docs/zh/descriptor-examples.md index 7680309e..02646561 100644 --- a/docs/zh/descriptor-examples.md +++ b/docs/zh/descriptor-examples.md @@ -11,6 +11,7 @@ | 形态 | 示例 | |------|------| | 原生模块库(Form A) | [`mcpplibs.xpkg`](../../pkgs/x/xpkg.lua) · [`mcpplibs.tinyhttps`](../../pkgs/t/tinyhttps.lua) · [`tensorvia-cpu`](../../pkgs/t/tensorvia-cpu.lua) · [`ffmpeg`](../../pkgs/f/ffmpeg.lua)(模块层,源码经 `compat.ffmpeg` 直编) · [`opencv`](../../pkgs/o/opencv.opencv.lua)(单仓库:模块层与 OpenCV 5 全源码构建同在包内,索引侧只留本描述符) · [`mcpplibs.grpc`](../../pkgs/g/grpc.lua)(gRPC 1.83.0 —— 本索引里唯一**无法**做成 compat 描述符的库:上游不发布任何自包含源码产物,其 tag 归档里 abseil/protobuf/re2/boringssl/zlib 全是空 submodule 占位,因此 [grpc-m](https://github.com/mcpplibs/grpc-m) 的 release tarball 才是那个产物。它只 vendor gRPC 自己的源码,五个依赖全取自本索引,故同时直接使用 protobuf 的消费者链进去的是同一份而非两份)| +| 原生多模块库(按 feature 管理源码) | [`gzj-creator.galay`](../../pkgs/g/gzj-creator.galay.lua)(Galay 5.0.0 —— 上游 Form-A manifest 默认提供 `galay.utils` 与 `galay.kernel`,SSL、HTTP、数据库、RPC、MCP、tracing 等模块及其依赖按具名 feature 开启。索引保持上游 manifest 原样,Unix 成员测试默认模块表面)| | C 源码 compat(含 `features`) | [`compat.cjson`](../../pkgs/c/compat.cjson.lua) · [`compat.zlib`](../../pkgs/c/compat.zlib.lua) · [`compat.hiredis`](../../pkgs/c/compat.hiredis.lua)(经典 1.2.0 —— 7 个 C TU;tarball 平铺头经 `generated_files` 补 `hiredis/` 前缀薄包装头,消费者可写 `#include `,与上游安装布局一致) · [`compat.sqlite3`](../../pkgs/c/compat.sqlite3.lua)(纯 C 源码、无 feature:单一 `sqlite3.c` amalgamation;3.45.3,部署最广的 3.45.x 线) · [`compat.libuv`](../../pkgs/c/compat.libuv.lua)(libuv 1.48.0 —— 逐 OS 源清单转录自上游 CMakeLists,因为 `src/unix/*.c` 通配会一次编进所有 OS 的后端;linux/macos 显式列 unix 子集,windows 用 `src/win/*.c` glob) |· [`compat.xxhash`](../../pkgs/c/compat.xxhash.lua)(单 TU、单头、无 feature —— 值得说的是**没有**编译什么:`xxh_x86dispatch.c` 在运行期选择 AVX2/AVX512 路径,需要 per-file `-mavx2` 并要求每个调用点定义 `XXH_X86DISPATCH`,故本包只出无需任何 flag 的 SSE2 基线。也没有选 header-only 的 `XXH_INLINE_ALL` 模式:它会在每个做哈希的 TU 里重新展开整份实现,那只有在「恰好只有一个这样的 TU」时才划算 —— 而这件事包本身无从知道) | C 源码 compat(库本身就是内核 ABI) | [`compat.libaio`](../../pkgs/c/compat.libaio.lua)(libaio 0.3.113 —— 12 个系统调用封装 TU,`xpm` 只有 `linux` 一段,因为根本不存在「移植」可声明:`struct iocb` 就是内核的结构体,每个 TU 都是 `syscall(__NR_io_*, …)`。消费者用 `[target.'cfg(linux)'.dependencies]` 门控,与 compat.wil 互为镜像。它给出三条经验。**把唯一的公开头从源码目录里择出来**:上游只安装 `libaio.h` 一个头,但 tarball 把它放在 `src/` 里、与私有头并列 —— 其中一个恰好叫 `syscall.h`,一旦上了 include 路径就会**遮蔽** glibc 的同名头。故 `include_dirs` 只指向一个 `generated_files` 转发头;包自身的源码经它拿到真头文件,而它们引号形式的 `#include "syscall.h"` 仍按「包含者所在目录优先」解析,于是整包**不需要任何指向 `src/` 的 `-I`**。**一个会骗人的 `c_standard`**:`-std=c11` 会定义 `__STRICT_ANSI__`,从而藏掉 `syscall()` 与 `sigset_t`,连公开头都会在 `io_pgetevents` 处解析失败;写 `c_standard = "gnu11"` **看起来**是解法,但 mcpp 2026.8.27.2 接受这个字符串却依然发 `-std=c11`(在产出的 `compile_commands.json` 里可见),真正生效的写法是 `cflags` 里的 `-D_GNU_SOURCE`。**静态包里的符号版本**:`io_getevents` / `io_cancel` 在上游并没有普通定义 —— 函数名是 `io_getevents_0_4` 之类,短名经 `.symver … @@LIBAIO_0.4` 发布 —— 链接**可执行文件**时 ld.bfd 与 lld 都能解析,但消费者若直接拿这些对象去构建 `.so` 就不行,那需要上游的 `src/libaio.map`,与上游自己的 `libaio.a` 完全同理) | | C++ 源码 compat(彼此依赖) | [`compat.abseil`](../../pkgs/c/compat.abseil.lua)(151 TU;对 `absl/**` 取通配后,按上游自身的 test/benchmark 命名约定裁剪) · [`compat.protobuf`](../../pkgs/c/compat.protobuf.lua)(libprotobuf 运行时,79 TU 逐条转录自上游 `src/file_lists.cmake`;因 protobuf 公开头文件 include 了 `absl/…`,故显式依赖 `compat.abseil`;`gzip` feature 定义 `HAVE_ZLIB` 并拉入 `compat.zlib`,`upb` feature 则从同一个 tarball 里再编出 protobuf 的 64 TU C 运行时;还以 `kind = "bin"` target 暴露 **`protoc`**,消费者写 `tools = ["protoc"]` 即可从「自己链接的那个包」拿到为本机构建的编译器,使生成器与运行时的版本错配无法表达) · [`compat.re2`](../../pkgs/c/compat.re2.lua)(22 TU,取自上游自身的 `RE2_SOURCES`) · [`compat.redis-plus-plus`](../../pkgs/c/compat.redis-plus-plus.lua)(redis++ 1.3.13 —— 同步客户端,17 TU + `patterns/redlock.cpp`,依赖 `compat.hiredis`;CMake 唯一会生成的头 `hiredis_features.h` 用 `generated_files` 快照,async/TLS TU 不收,基座保持两包成对。`async` feature 补齐 libuv 版 `AsyncRedis` 接口(9 个 async TU + `compat.libuv`;`event_loop.cpp` 在后台线程跑 `uv_run`,`` 经 compat.hiredis 的包装头到达)。两个版本分处源码结构分水岭两侧,共享同一份源列表:1.3.13(现代 17-TU 布局)与 1.3.3(缺 `redis_uri.cpp`/`redlock` 的 15-TU 旧布局)—— 并集之所以成立,是因为 1.3.3 的 TU 是 1.3.13 的严格子集,恰好两个 glob 在 1.3.3 上零命中(仅警告,非错误;与 compat.catch2 同款手法)) · [`compat.sqlitecpp`](../../pkgs/c/compat.sqlitecpp.lua)(SQLite 的 RAII C++ 封装。上游用 **git submodule** 引 sqlite3,源码 tarball 里根本没有它,库因此无法链接 —— 依赖边指向 `compat.sqlite3` 替代了那个 submodule,而且更好:同一次链接里的两个 SQLite 消费者从此共享**一份** amalgamation,而不是各自内嵌一份带各自编译选项的副本。它的两个 CMake 开关有意不设 —— `SQLITECPP_USE_ASSERT_ON_ERRORS` 把错误模型从抛异常改成中止进程,`SQLITE_ENABLE_COLUMN_METADATA` 必须与 SQLite **自身**的构建一致;两者都该由消费者决定,而头文件本来就用 `#ifdef` 守着) | diff --git a/mcpp.toml b/mcpp.toml index 2156b06c..c1bfbc48 100644 --- a/mcpp.toml +++ b/mcpp.toml @@ -112,6 +112,7 @@ members = [ "tests/examples/httplib-zstd", "tests/examples/msdfgen", "tests/examples/gtl", + "tests/examples/galay", "tests/examples/miniaudio", "tests/examples/nanosvg", "tests/examples/nanodbc", diff --git a/pkgs/g/gzj-creator.galay.lua b/pkgs/g/gzj-creator.galay.lua new file mode 100644 index 00000000..80f168be --- /dev/null +++ b/pkgs/g/gzj-creator.galay.lua @@ -0,0 +1,34 @@ +-- Form A descriptor: Galay publishes its own mcpp.toml at the archive root. +-- The manifest builds the default utils/kernel C++23 module surface and keeps +-- protocol/database/TLS components behind its upstream features. +-- +-- v5.0.0 is Unix-only in the upstream manifest (Linux and macOS). Windows is +-- intentionally absent until Galay publishes a Windows-compatible manifest. +-- No mcpp-res mirror is configured locally, so the plain GLOBAL URL is the +-- documented fallback for CN consumers until a maintainer creates the mirror. +package = { + spec = "1", + namespace = "gzj-creator", + name = "galay", + description = "C++23 coroutine networking and protocol framework with named Galay modules", + licenses = {"Apache-2.0"}, + repo = "https://github.com/gzj-creator/galay", + type = "package", + + xpm = { + linux = { + ["5.0.0"] = { + url = "https://github.com/gzj-creator/galay/archive/refs/tags/v5.0.0.tar.gz", + sha256 = "8e410d97b0615333c92192633f9495acdc8eb1d56dd94f1eeecd8e68e5a4f73e", + }, + }, + macosx = { + ["5.0.0"] = { + url = "https://github.com/gzj-creator/galay/archive/refs/tags/v5.0.0.tar.gz", + sha256 = "8e410d97b0615333c92192633f9495acdc8eb1d56dd94f1eeecd8e68e5a4f73e", + }, + }, + }, + + mcpp = "*/mcpp.toml", +} diff --git a/tests/examples/galay/mcpp.toml b/tests/examples/galay/mcpp.toml new file mode 100644 index 00000000..1bab5b51 --- /dev/null +++ b/tests/examples/galay/mcpp.toml @@ -0,0 +1,16 @@ +# Public Galay Form-A package consumer. The package is Unix-only in v5.0.0; +# Windows still builds the no-op test below without resolving the dependency. +[package] +name = "galay-tests" +version = "0.1.0" + +[target.'cfg(unix)'.dependencies.gzj-creator] +galay = "5.0.0" + +[target.'cfg(unix)'.build] +cxxflags = ["-DHAVE_GALAY=1"] + +# A member-level redirect replaces the workspace root's compat redirect, so +# this test exercises the public package descriptor from this checkout. +[indices] +gzj-creator = { path = "../../.." } diff --git a/tests/examples/galay/tests/modules.cpp b/tests/examples/galay/tests/modules.cpp new file mode 100644 index 00000000..c5ed1f47 --- /dev/null +++ b/tests/examples/galay/tests/modules.cpp @@ -0,0 +1,38 @@ +// Default Galay package surface: both named modules and linked kernel code. +#ifdef HAVE_GALAY + +import std; +import galay.utils; +import galay.kernel; + +int main() { + using galay::kernel::Buffer; + using galay::kernel::Host; + using galay::kernel::IPType; + using galay::utils::Base64Util; + using galay::utils::StringUtils; + + const std::string encoded = Base64Util::Base64Encode("galay"); + if (encoded != "Z2FsYXk=") return 1; + if (Base64Util::Base64Decode(encoded) != "galay") return 2; + + const auto pieces = StringUtils::split("galay:mcpp:index", ':'); + if (pieces != std::vector{"galay", "mcpp", "index"}) return 3; + + Buffer buffer("galay", 5); + if (buffer.length() != 5 || buffer.toString() != "galay") return 4; + Buffer copy = buffer.clone(); + buffer.clear(); + if (copy.toString() != "galay" || buffer.length() != 0) return 5; + + const Host host(IPType::IPV4, "127.0.0.1", 9080); + if (!host.valid() || host.ip() != "127.0.0.1" || host.port() != 9080) return 6; + + return 0; +} + +#else + +int main() { return 0; } + +#endif