Skip to content

Merge pull request #337 from array2d/feat/install-sh #31

Merge pull request #337 from array2d/feat/install-sh

Merge pull request #337 from array2d/feat/install-sh #31

Workflow file for this run

name: release-abi
on:
push:
tags: ['v*']
permissions:
contents: write
jobs:
# Linux:deps.json 所列依赖有预编译 ABI tarball,直接下载安装后打包(自包含)。
linux:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v4
- name: 下载 ABI 依赖
env: { GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" }
run: ./ci/deps.sh
- name: 构建 runtime + layout + runtime-rs(产 bin/ 下的 CLI)
run: |
make runtime
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" "$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/"
cp layout/target/release/libkvlanglayout.so "$d/lib/"
# 自带全部 ABI 依赖 → 解包即 /usr/lib + /usr/lib/kvspace 布局
cp /usr/lib/libblockmalloc.so* /usr/lib/libslotsboxmalloc.so* "$d/lib/"
cp /usr/lib/libkvspace.so* /usr/lib/kvspace/libkvspace-c.so* /usr/lib/kvspace/libkvspace_durable.so* "$d/lib/kvspace/"
printf '{"abi":"%s"}\n' "$v" > "$d/abi-manifest.json"
tar czf "$d.tar.gz" "$d"
tar tzf "$d.tar.gz"
sha256sum "$d.tar.gz" > SHA256SUMS-linux
- name: 发布 release
run: gh release create "${GITHUB_REF_NAME}" kvlang-abi-*-linux-*.tar.gz SHA256SUMS-linux --generate-notes
# macOS:各仓只有 linux ABI tarball,依赖全部源码构建(装 /usr/local)后打包(自包含)。
macos:
needs: linux
runs-on: macos-latest
env:
GH_TOKEN: ${{ github.token }}
KVSPACE_LIB_DIR: /usr/local/lib/kvspace # /usr 受 SIP 保护
steps:
- uses: actions/checkout@v4
- name: 构建依赖链(blockmalloc / slotsboxmalloc / kvspace / kvspace-c / kvspace-durable)
run: |
set -euo pipefail
PREFIX=/usr/local
for repo in blockmalloc slotsboxmalloc kvspace 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=$PREFIX
cmake --build "/tmp/$repo/build" -j
sudo cmake --install "/tmp/$repo/build"
done
git clone --depth 1 https://github.com/array2d/kvspace-durable.git /tmp/kvspace-durable
cargo build --release --manifest-path /tmp/kvspace-durable/Cargo.toml
# 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 + 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'
#include <kvspace/kvspace.h>
#include <stdio.h>
int main(void) {
void *shm = kvspaceConnect("shm:///tmp/ks_rel_macos");
void *fs = kvspaceConnect("fs:///tmp/ks_rel_fs");
printf("shm=%p fs=%p\n", shm, fs);
if (shm) kvspaceClose(shm);
if (fs) kvspaceClose(fs);
return (shm && fs) ? 0 : 1;
}
EOF
cc /tmp/conn.c -o /tmp/conn -I/usr/local/include -L/usr/local/lib/kvspace -lkvspace
# libkvspace 在 /usr/local/lib/kvspace;后端依赖 libblockmalloc 在 /usr/local/lib
DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/kvspace /tmp/conn
- name: 打包 ABI 产物
run: |
set -euo pipefail
v="${GITHUB_REF_NAME}"
d="kvlang-abi-$v-darwin-arm64"
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/"
cp layout/target/release/libkvlanglayout.dylib "$d/lib/"
# 自带全部 ABI 依赖 → 解包即 /usr/local/lib + /usr/local/lib/kvspace 布局
cp /usr/local/lib/libblockmalloc*.dylib /usr/local/lib/libslotsboxmalloc*.dylib "$d/lib/"
cp /usr/local/lib/kvspace/*.dylib "$d/lib/kvspace/"
cp /tmp/kvspace-durable/target/release/libkvspace_durable.dylib "$d/lib/kvspace/"
printf '{"abi":"%s"}\n' "$v" > "$d/abi-manifest.json"
tar czf "$d.tar.gz" "$d"
tar tzf "$d.tar.gz"
sha256sum "$d.tar.gz" > SHA256SUMS-macos
- name: 上传到 release
run: gh release upload "${GITHUB_REF_NAME}" kvlang-abi-*-darwin-*.tar.gz SHA256SUMS-macos --clobber