-
Notifications
You must be signed in to change notification settings - Fork 2
126 lines (125 loc) · 6.46 KB
/
Copy pathrelease.yml
File metadata and controls
126 lines (125 loc) · 6.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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"
# 头(递归):自己的 runtime 头 + deps.json 各依赖的头(/usr/include/<repo>/)
cp -R runtime/include/. "$d/include/kvlang/"
for h in kvspace blockmalloc slotsboxmalloc; do
[ -d "/usr/include/$h" ] && cp -R "/usr/include/$h" "$d/include/"
done
# 库(递归扫):本仓两个产物 + 依赖顶层库 + 后端库(dispatch 的 dlopen 目录)
find bin layout/target/release -maxdepth 1 \( -name 'lib*.so*' -o -name 'lib*.dylib' \) -exec cp -P {} "$d/lib/" \;
# blockmalloc / slotsboxmalloc 是 header-only(只发头、无 lib),故不收集它们的 .so
find /usr/lib/kvspace -maxdepth 1 -name '*.so*' -exec cp -P {} "$d/lib/kvspace/" \;
# 可执行:本仓 CLI + 依赖带来的 CLI
cp bin/kvlang bin/kvlanglayout "$d/bin/"
cp /usr/bin/kvspace "$d/bin/"
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
# runtime-rs 的 build.rs 在 ../bin 找 libkvlang_runtime/libkvlanglayout,必须先就位
mkdir -p bin
cp layout/target/release/libkvlanglayout.dylib bin/
cargo build --release --manifest-path runtime-rs/Cargo.toml
# kvspace CLI 用 #[link(name = "kvspace")],前端装在 /usr/local/lib/kvspace
RUSTFLAGS="-L native=/usr/local/lib/kvspace" cargo build --release --manifest-path /tmp/kvspace/cli/Cargo.toml
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"
# 头(递归):自己的 runtime 头 + 各依赖的头(/usr/local/include/<repo>/)
cp -R runtime/include/. "$d/include/kvlang/"
for h in kvspace blockmalloc slotsboxmalloc; do
[ -d "/usr/local/include/$h" ] && cp -R "/usr/local/include/$h" "$d/include/"
done
# 库(递归扫):本仓产物 + 依赖顶层 dylib + 后端 dylib(dispatch 的 dlopen 目录)
find bin layout/target/release -maxdepth 1 -name '*.dylib' -exec cp -P {} "$d/lib/" \;
find /usr/local/lib/kvspace -maxdepth 1 -name '*.dylib' -exec cp -P {} "$d/lib/kvspace/" \;
cp /tmp/kvspace-durable/target/release/libkvspace_durable.dylib "$d/lib/kvspace/"
# 可执行:本仓 CLI + 依赖带来的 CLI
cp bin/kvlang bin/kvlanglayout "$d/bin/"
cp /tmp/kvspace/cli/target/release/kvspace "$d/bin/"
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