From 663e7e0a8130a0751ec3751348b2151810e5b793 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sat, 12 Sep 2026 19:58:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?frontend:=20=E5=90=8E=E7=AB=AF=E8=A3=85?= =?UTF-8?q?=E8=BD=BD=E5=90=8D/=E7=9B=AE=E5=BD=95=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=84=9F=E7=9F=A5=EF=BC=88macOS=20=E4=BF=AE=E5=A4=8D=20connect?= =?UTF-8?q?=20=E6=81=92=20NULL=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit macOS 上 kvspaceConnect 必然返回 NULL: - backend_soname 硬编码 libkvspace-c.so.1 / libkvspace_durable.so.1, 而 macOS 产物是 .dylib - backend_path 默认目录硬编码 /usr/lib/kvspace,而 macOS 装 /usr/local/lib/kvspace(/usr 受 SIP 保护) 改为按 __APPLE__ 分支取 .dylib 与 /usr/local/lib/kvspace; KVSPACE_BACKEND_PATH 覆盖能力保留。Linux 行为不变(本地实测 shm:// 与 fs:// 两条 DSN 均 connect 成功)。 Co-Authored-By: Claude Code --- src/frontend.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/frontend.c b/src/frontend.c index a80c7c5..42d8f73 100644 --- a/src/frontend.c +++ b/src/frontend.c @@ -4,10 +4,10 @@ * (RTLD_NOW | RTLD_LOCAL)装载后端,把 handle 包一层 {vtable, dl, backend}。 * codec(TlvEncode、DecodeHead、New 等)无 handle,由前端静态实现,byte-identical。 * - * 后端装载名: - * shm://... → libkvspace-c.so.1 - * 其余(redis/fs/s3) → libkvspace_durable.so.1 - * 目录由 KVSPACE_BACKEND_PATH 覆盖(默认走动态链接器搜索路径)。 + * 后端装载名(后缀随平台): + * shm://... → libkvspace-c.so.1 / macOS: libkvspace-c.dylib + * 其余(redis/fs/s3) → libkvspace_durable.so.1 / macOS: libkvspace_durable.dylib + * 目录由 KVSPACE_BACKEND_PATH 覆盖,默认 Linux /usr/lib/kvspace、macOS /usr/local/lib/kvspace。 */ #include "kvspace/kvspace.h" @@ -60,15 +60,27 @@ static kvspace_handle *H(void *h) { return (kvspace_handle *)h; } /* ── 后端选择 ───────────────────────────────────────────────────────── */ +/* 后端库名:Linux 为 .so.1,macOS 为 .dylib。 */ static const char *backend_soname(const char *dsn) { - return (dsn && strncmp(dsn, "shm://", 6) == 0) - ? "libkvspace-c.so.1" - : "libkvspace_durable.so.1"; + int is_shm = dsn && strncmp(dsn, "shm://", 6) == 0; +#if defined(__APPLE__) + return is_shm ? "libkvspace-c.dylib" : "libkvspace_durable.dylib"; +#else + return is_shm ? "libkvspace-c.so.1" : "libkvspace_durable.so.1"; +#endif } +/* 后端目录默认值:Linux /usr/lib/kvspace;macOS /usr/local/lib/kvspace(/usr 受 SIP 保护)。 + * KVSPACE_BACKEND_PATH 可覆盖。 */ static char *backend_path(const char *soname, char *buf, size_t cap) { const char *dir = getenv("KVSPACE_BACKEND_PATH"); - if (!dir || !dir[0]) dir = "/usr/lib/kvspace"; + if (!dir || !dir[0]) { +#if defined(__APPLE__) + dir = "/usr/local/lib/kvspace"; +#else + dir = "/usr/lib/kvspace"; +#endif + } snprintf(buf, cap, "%s/%s", dir, soname); return buf; } From 6b111d3606fd20cd7a2c55c30a968713bc76b879 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sat, 12 Sep 2026 19:59:26 +0800 Subject: [PATCH 2/3] =?UTF-8?q?ci(macos):=20=E5=8A=A0=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E8=A3=85=E8=BD=BD=E5=86=92=E7=83=9F=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit macOS CI 原来只构建本仓(无后端),测不出 frontend 的 dlopen 平台差异。 补:源码构建 blockmalloc / slotsboxmalloc / kvspace-c 装 /usr/local, 再实际 kvspaceConnect("shm://…") 断言非 NULL。 Co-Authored-By: Claude Code --- .github/workflows/ci-macos.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index 87fef96..18b403e 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -5,9 +5,33 @@ jobs: runs-on: macos-latest steps: - uses: actions/checkout@v4 + - name: 构建依赖 blockmalloc / slotsboxmalloc / kvspace-c(macOS 无预编译 ABI,源码装 /usr/local) + run: | + set -euo pipefail + for repo in blockmalloc slotsboxmalloc kvspace-c; do + git clone --depth 1 "https://github.com/array2d/$repo.git" "/tmp/$repo" + cmake -S "/tmp/$repo" -B "/tmp/$repo/build" \ + -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local + cmake --build "/tmp/$repo/build" -j + sudo cmake --install "/tmp/$repo/build" + done - name: 构建 run: | cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local cmake --build build - name: 安装(验证安装规则) run: sudo cmake --install build + - name: 后端装载冒烟(frontend 的 dlopen 真能加载后端) + run: | + cat > /tmp/conn.c <<'EOF' + #include + #include + int main(void) { + void *h = kvspaceConnect("shm:///tmp/ks_ci_macos"); + printf("connect shm:// → %p\n", h); + if (h) kvspaceClose(h); + return h ? 0 : 1; + } + EOF + cc /tmp/conn.c -o /tmp/conn -I/usr/local/include -L/usr/local/lib/kvspace -lkvspace + DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib /tmp/conn From fb5c3d0b4a194df5a2c8a594ce02dacf2061fb1b Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sat, 12 Sep 2026 20:04:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?ci(macos):=20=E5=86=92=E7=83=9F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=A1=A5=20DYLD=20=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libkvspace 装在 /usr/local/lib/kvspace,测试程序自身加载它失败 (@rpath/libkvspace.1.dylib)。fallback 路径补上该目录;后端依赖的 libblockmalloc 仍走 /usr/local/lib。 Co-Authored-By: Claude Code --- .github/workflows/ci-macos.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index 18b403e..56e7ca7 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -34,4 +34,5 @@ jobs: } EOF cc /tmp/conn.c -o /tmp/conn -I/usr/local/include -L/usr/local/lib/kvspace -lkvspace - DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib /tmp/conn + # libkvspace 在 /usr/local/lib/kvspace;后端依赖 libblockmalloc 在 /usr/local/lib + DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/kvspace /tmp/conn