From 1c8338cc1d42e1d8fb62ae27c413fe99467aa298 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sun, 13 Sep 2026 22:52:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20install.sh=20=E2=80=94=E2=80=94=20?= =?UTF-8?q?=E6=8C=89=20OS=20=E5=8F=96=E6=9C=80=E6=96=B0=20release=20?= =?UTF-8?q?=E5=AE=89=E8=A3=85=EF=BC=9Brelease=20=E8=A1=A5=E5=8F=91=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit install.sh(POSIX sh): - 识别平台 → linux-x86_64 / darwin-arm64;默认取 releases/latest (VERSION= 可指定版本),sha256 校验(sha256sum 或 macOS shasum) - PREFIX 默认 Linux=/usr、macOS=/usr/local(/usr 受 SIP 保护) - 装库 → /lib + /lib/kvspace(dispatch 前端的 dlopen 目录)、 CLI → /bin、头 → /include release 补发 CLI(此前 tarball 只有 lib/ 与 include/,装上无法运行): - linux job:make layout / runtime-rs 产 bin/kvlanglayout、bin/kvlang; kvspace CLI 由 ci/deps.sh 从 kvspace release 装入 /usr/bin - macos job:同三件 + 从 /tmp/kvspace/cli 构建 kvspace CLI - ci/deps.sh:解包时若含 bin/ 则装入 /usr/bin README:新增 Install 段(curl … | sh),原 Quick Start 标注为「从源码」。 Co-Authored-By: Claude Code --- .github/workflows/release.yml | 24 +++++-- README.md | 16 ++++- README_CN.md | 16 ++++- ci/deps.sh | 10 ++- install.sh | 118 ++++++++++++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 9 deletions(-) create mode 100755 install.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90795453..4950b615 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,17 +15,21 @@ jobs: - name: 下载 ABI 依赖 env: { GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" } run: ./ci/deps.sh - - name: 构建 runtime + layout + - name: 构建 runtime + layout + runtime-rs(产 bin/ 下的 CLI) run: | make runtime - cargo build --release --manifest-path layout/Cargo.toml + make layout # cargo build + cp kvlanglayout / libkvlanglayout.so → bin/ + make runtime-rs # → bin/kvlang - name: 打包 ABI 产物 run: | set -euo pipefail v="${GITHUB_REF_NAME}" d="kvlang-abi-$v-linux-x86_64" - mkdir -p "$d/include/kvlang" "$d/lib/kvspace" + mkdir -p "$d/include/kvlang" "$d/lib/kvspace" "$d/bin" cp runtime/include/*.h "$d/include/kvlang/" + # CLI:kvlang(Rust runtime)+ kvlanglayout(layout CLI)+ kvspace(dispatch 前端 CLI,随依赖装入) + cp bin/kvlang bin/kvlanglayout "$d/bin/" + cp /usr/bin/kvspace "$d/bin/" # 自带全部 ABI 依赖的头 → 解包即 /usr/include 布局(扩展编译需要 kvspace.h 等) cp -r /usr/include/kvspace /usr/include/blockmalloc /usr/include/slotsboxmalloc "$d/include/" cp bin/libkvlang_runtime.so "$d/lib/" @@ -65,11 +69,18 @@ jobs: # durable 为 Rust(无 install 规则),手动装入后端目录,供 frontend dlopen sudo mkdir -p "$PREFIX/lib/kvspace" sudo cp /tmp/kvspace-durable/target/release/libkvspace_durable.dylib "$PREFIX/lib/kvspace/" - - name: 构建 runtime + layout + - name: 构建 runtime + layout + runtime-rs + kvspace CLI run: | cmake -S runtime -B build/runtime -DCMAKE_BUILD_TYPE=Release -DKVSPACE_LIB_DIR="$KVSPACE_LIB_DIR" cmake --build build/runtime --target kvlang_runtime -j cargo build --release --manifest-path layout/Cargo.toml + cargo build --release --manifest-path runtime-rs/Cargo.toml + # kvspace CLI 是本步 clone 到 /tmp/kvspace 的 cli/(独立 Cargo 项目) + cargo build --release --manifest-path /tmp/kvspace/cli/Cargo.toml + mkdir -p bin + cp layout/target/release/libkvlanglayout.dylib bin/ + cp layout/target/release/kvlanglayout bin/ + cp runtime-rs/target/release/kvlang bin/ - name: 后端装载冒烟(frontend 的 dlopen 真能加载后端) run: | cat > /tmp/conn.c <<'EOF' @@ -92,8 +103,11 @@ jobs: set -euo pipefail v="${GITHUB_REF_NAME}" d="kvlang-abi-$v-darwin-arm64" - mkdir -p "$d/include/kvlang" "$d/lib/kvspace" + mkdir -p "$d/include/kvlang" "$d/lib/kvspace" "$d/bin" cp runtime/include/*.h "$d/include/kvlang/" + # CLI:kvlang(Rust runtime)+ kvlanglayout(layout CLI)+ kvspace(dispatch 前端 CLI) + cp bin/kvlang bin/kvlanglayout "$d/bin/" + cp /tmp/kvspace/cli/target/release/kvspace "$d/bin/" # 自带全部 ABI 依赖的头 → 解包即 /usr/local/include 布局 cp -r /usr/local/include/kvspace /usr/local/include/blockmalloc /usr/local/include/slotsboxmalloc "$d/include/" cp bin/libkvlang_runtime.dylib "$d/lib/" diff --git a/README.md b/README.md index 36c5077e..666bd056 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,21 @@ Cross-process handoff uses the queue `/lib//vids/ = pc`: the calli --- -## Quick Start +## Install + +```bash +curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh +``` + +Detects OS/arch and fetches the **latest** release — `linux-x86_64` or `darwin-arm64`. Each tarball is self-contained (kvlang runtime + layout, the kvspace dispatch front end, both backends, and every header), and installs to `/usr` on Linux, `/usr/local` on macOS (`/usr` is SIP-protected there). + +```bash +PREFIX=/opt/kvlang VERSION=v0.2.18 sh install.sh # override prefix / pin a version +``` + +It installs `kvlang` (runtime CLI), `kvlanglayout` (layout CLI) and `kvspace` (backend CLI) into `/bin`, the libraries into `/lib` + `/lib/kvspace`, and the headers into `/include/{kvlang,kvspace,…}`. + +## Quick Start (from source) Requirements: a C toolchain + cmake, Rust (cargo), and the kvspace ABI libraries installed to `/usr/lib/kvspace` (fetched by [`ci/deps.sh`](ci/deps.sh) from the tags in [`deps.json`](deps.json)). Go is needed only for the Go `json` example extension. diff --git a/README_CN.md b/README_CN.md index 94e3393e..ab52d3ba 100644 --- a/README_CN.md +++ b/README_CN.md @@ -72,7 +72,21 @@ kvspace 是核心的寻址空间与内存空间;语言本体是小核心 runti --- -## Quick Start +## 安装 + +```bash +curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh +``` + +自动识别 OS/架构并拉取**最新** release —— `linux-x86_64` 或 `darwin-arm64`。每个包都是自包含的(kvlang runtime + layout、kvspace dispatch 前端、两个后端、全部头文件),Linux 装到 `/usr`,macOS 装到 `/usr/local`(该平台 `/usr` 受 SIP 保护)。 + +```bash +PREFIX=/opt/kvlang VERSION=v0.2.18 sh install.sh # 覆盖前缀 / 指定版本 +``` + +安装内容:`kvlang`(runtime CLI)、`kvlanglayout`(layout CLI)、`kvspace`(后端 CLI)→ `/bin`;库 → `/lib` + `/lib/kvspace`;头 → `/include/{kvlang,kvspace,…}`。 + +## Quick Start(从源码) 依赖:C 工具链 + cmake、Rust(cargo),以及装到 `/usr/lib/kvspace` 的 kvspace ABI 库(由 [`ci/deps.sh`](ci/deps.sh) 按 [`deps.json`](deps.json) 里的 tag 拉取)。Go 仅 Go `json` 示例扩展需要。 diff --git a/ci/deps.sh b/ci/deps.sh index 17424a25..97c5942a 100755 --- a/ci/deps.sh +++ b/ci/deps.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -# 下载 ABI 依赖(deps.json: repo → tag),安装到 /usr/lib + /usr/include。本地与 CI 共用。 +# 下载 ABI 依赖(deps.json: repo → tag),安装到 /usr/lib + /usr/lib/kvspace + /usr/include + /usr/bin。 +# 本地与 CI 共用。tarball 可选带 bin/(如 kvspace 的 CLI)。 set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" for repo in $(jq -r 'keys[]' "$ROOT/deps.json"); do @@ -14,6 +15,11 @@ for repo in $(jq -r 'keys[]' "$ROOT/deps.json"); do else sudo cp "$tmp/lib/"*.so* /usr/lib/ fi + # 可选可执行(kvspace 的 CLI)→ /usr/bin + if [ -d "$tmp/bin" ]; then + sudo cp "$tmp/bin/"* /usr/bin/ + sudo chmod 755 /usr/bin/"$(ls "$tmp/bin/" | head -1)" + fi rm -rf "$tmp" done -echo "✅ ABI deps → /usr/lib + /usr/include" +echo "✅ ABI deps → /usr/lib + /usr/lib/kvspace + /usr/include + /usr/bin" diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..8597b81e --- /dev/null +++ b/install.sh @@ -0,0 +1,118 @@ +#!/bin/sh +# kvlang installer — 按 OS/架构取**最新** release,安装库 + 头 + CLI。 +# +# curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh +# +# 环境变量: +# PREFIX= 安装前缀(默认 Linux=/usr、macOS=/usr/local,后者因 /usr 受 SIP 保护) +# SUDO= 提权命令(默认 sudo;已 root 时可 SUDO= 置空) +# VERSION= 指定版本,默认取最新 release(如 VERSION=v0.2.18) +set -eu + +REPO=array2d/kvlang +KVSPACE_BACKEND_DIR=kvspace # 后端与 dispatch 前端同放 /lib/kvspace + +os=$(uname -s) +arch=$(uname -m) +case "$os-$arch" in + Linux-x86_64) plat=linux-x86_64 ;; + Darwin-arm64) plat=darwin-arm64 ;; + *) + echo "kvlang: 不支持的平台 $os-$arch(已发布 linux-x86_64 / darwin-arm64)" >&2 + exit 1 + ;; +esac + +# 前缀默认值:macOS 的 /usr 受 SIP 保护,落到 /usr/local +if [ "$os" = Darwin ]; then + PREFIX="${PREFIX:-/usr/local}" + SUDO="${SUDO-sudo}" +else + PREFIX="${PREFIX:-/usr}" + SUDO="${SUDO-sudo}" +fi + +# ── 取版本(默认最新) ─────────────────────────────────────────────── +tag="${VERSION:-}" +if [ -z "$tag" ]; then + tag=$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest" \ + | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) + [ -n "$tag" ] || { echo "kvlang: 无法获取最新版本号" >&2; exit 1; } +fi + +# ── 下载 ───────────────────────────────────────────────────────────── +base="https://github.com/$REPO/releases/download/$tag" +tarball="kvlang-abi-$tag-$plat.tar.gz" +case "$plat" in + linux-*) sums=SHA256SUMS-linux ;; + darwin-*) sums=SHA256SUMS-macos ;; +esac + +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT INT TERM + +echo "kvlang $tag ($plat) → $PREFIX" +curl -fsSL "$base/$tarball" -o "$tmp/$tarball" + +# 校验(有 SHA 清单才校验;sha256sum 或 macOS 的 shasum 皆可) +if curl -fsSL "$base/$sums" -o "$tmp/$sums" 2>/dev/null; then + want=$(sed -n "s/^\\([0-9a-f]\\{64\\}\\)[[:space:]]*\\**$tarball$/\\1/p" "$tmp/$sums" | head -1) + if [ -n "$want" ]; then + if command -v sha256sum >/dev/null 2>&1; then + got=$(sha256sum "$tmp/$tarball" | cut -d' ' -f1) + else + got=$(shasum -a 256 "$tmp/$tarball" | cut -d' ' -f1) + fi + [ "$want" = "$got" ] || { echo "kvlang: 校验失败(sha256 不匹配)" >&2; exit 1; } + echo " ✓ sha256 校验通过" + fi +fi + +tar xzf "$tmp/$tarball" -C "$tmp" +root="$tmp/kvlang-abi-$tag-$plat" +[ -d "$root" ] || { echo "kvlang: 包结构异常" >&2; exit 1; } + +# ── 安装 ───────────────────────────────────────────────────────────── +$SUDO mkdir -p "$PREFIX/lib" "$PREFIX/lib/$KVSPACE_BACKEND_DIR" "$PREFIX/bin" "$PREFIX/include" + +# 库:顶层 → /lib;kvspace/ → /lib/kvspace(dispatch 前端的 dlopen 目录) +if [ -d "$root/lib" ]; then + for f in "$root/lib"/*.so* "$root/lib"/*.dylib; do + [ -e "$f" ] && $SUDO cp -P "$f" "$PREFIX/lib/" # -P 保符号链接原样 + done + if [ -d "$root/lib/$KVSPACE_BACKEND_DIR" ]; then + for f in "$root/lib/$KVSPACE_BACKEND_DIR"/*.so* "$root/lib/$KVSPACE_BACKEND_DIR"/*.dylib; do + [ -e "$f" ] && $SUDO cp -P "$f" "$PREFIX/lib/$KVSPACE_BACKEND_DIR/" + done + fi +fi + +# CLI:kvlang / kvlanglayout / kvspace +if [ -d "$root/bin" ]; then + for f in "$root/bin"/*; do + [ -e "$f" ] && { $SUDO cp "$f" "$PREFIX/bin/"; $SUDO chmod 755 "$PREFIX/bin/$(basename "$f")"; } + done +fi + +# 头:include/* → /include(kvlang/ 与 kvspace/ 等子目录原样保留) +if [ -d "$root/include" ]; then + for d in "$root/include"/*; do + [ -e "$d" ] && $SUDO cp -R "$d" "$PREFIX/include/" + done +fi + +echo +echo "✅ kvlang $tag 已安装到 $PREFIX" +echo " CLI : $PREFIX/bin/{kvlang,kvlanglayout,kvspace}" +echo " 库 : $PREFIX/lib/ + $PREFIX/lib/$KVSPACE_BACKEND_DIR/" +echo " 头 : $PREFIX/include/{kvlang,kvspace,...}" +echo +echo "试用(后端由 KVSPACE DSN 选择):" +echo " KVSPACE=shm:///tmp/kvlang.shm $PREFIX/bin/kvlang -c 'println(\"hello\")'" +case "$plat" in + darwin-*) + echo + echo "注意:macOS 无 ldconfig,若 CLI 或扩展找不到库,请设:" + echo " DYLD_FALLBACK_LIBRARY_PATH=$PREFIX/lib:$PREFIX/lib/$KVSPACE_BACKEND_DIR" + ;; +esac