Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/"
Expand Down Expand Up @@ -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'
Expand All @@ -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/"
Expand Down
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,21 @@ Cross-process handoff uses the queue `/lib/<opcode>/vids/<vtid> = 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 `<prefix>/bin`, the libraries into `<prefix>/lib` + `<prefix>/lib/kvspace`, and the headers into `<prefix>/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.

Expand Down
16 changes: 15 additions & 1 deletion README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)→ `<prefix>/bin`;库 → `<prefix>/lib` + `<prefix>/lib/kvspace`;头 → `<prefix>/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` 示例扩展需要。

Expand Down
10 changes: 8 additions & 2 deletions ci/deps.sh
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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"
118 changes: 118 additions & 0 deletions install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#!/bin/sh
# kvlang installer — 按 OS/架构取**最新** release,安装库 + 头 + CLI。
#
# curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh
#
# 环境变量:
# PREFIX=<dir> 安装前缀(默认 Linux=/usr、macOS=/usr/local,后者因 /usr 受 SIP 保护)
# SUDO=<cmd> 提权命令(默认 sudo;已 root 时可 SUDO= 置空)
# VERSION=<tag> 指定版本,默认取最新 release(如 VERSION=v0.2.18)
set -eu

REPO=array2d/kvlang
KVSPACE_BACKEND_DIR=kvspace # 后端与 dispatch 前端同放 <prefix>/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"

# 库:顶层 → <prefix>/lib;kvspace/ → <prefix>/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/* → <prefix>/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
Loading