Skip to content

Commit 305a36e

Browse files
miaobyteclaude
andcommitted
ci: 支持 macOS 构建——链接参数跨平台 + KVSPACE_LIB_DIR
runtime/layout/runtime-rs 原为 Linux-only,macOS 必挂: - runtime/CMakeLists:link kvspace m pthread + GNU ld 专属 --export-dynamic/--disable-new-dtags - layout/build.rs、runtime-rs/build.rs:--disable-new-dtags、$ORIGIN、 硬编码 /usr/lib/kvspace 改法: - 引入 KVSPACE_LIB_DIR(CMake cache 变量 / 构建环境变量),默认 /usr/lib/kvspace,macOS CI 传 /usr/local/lib/kvspace(/usr 受 SIP 保护) - 平台条件化:macOS 去掉 m/pthread、去掉 --disable-new-dtags、 $ORIGIN → @loader_path - Linux 默认行为不变 新增 ci-macos.yml:源码构建 kvspace → layout/runtime/runtime-rs 编译通过。 Closes #321 Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent f8477c8 commit 305a36e

4 files changed

Lines changed: 69 additions & 17 deletions

File tree

‎.github/workflows/ci-macos.yml‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: ci-macos
2+
on: [push, pull_request]
3+
jobs:
4+
build:
5+
runs-on: macos-latest
6+
env:
7+
# /usr 受 SIP 保护,kvspace 装到 /usr/local(本仓 runtime/layout/runtime-rs 均读该变量)
8+
KVSPACE_LIB_DIR: /usr/local/lib/kvspace
9+
steps:
10+
- uses: actions/checkout@v4
11+
- name: 构建依赖 kvspace(macOS 无预编译 ABI,从源码装到 /usr/local)
12+
run: |
13+
git clone --depth 1 https://github.com/array2d/kvspace.git /tmp/kvspace
14+
cmake -S /tmp/kvspace -B /tmp/kvspace/build \
15+
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
16+
cmake --build /tmp/kvspace/build -j
17+
sudo cmake --install /tmp/kvspace/build
18+
- name: 构建 layout(Rust;macOS 产物后缀为 .dylib)
19+
run: |
20+
cargo build --release --manifest-path layout/Cargo.toml
21+
mkdir -p bin && cp layout/target/release/libkvlanglayout.dylib bin/
22+
- name: 构建 runtime(C)
23+
run: |
24+
cmake -S runtime -B build/runtime -DCMAKE_BUILD_TYPE=Release \
25+
-DKVSPACE_LIB_DIR="$KVSPACE_LIB_DIR"
26+
cmake --build build/runtime --target kvlang_runtime -j
27+
- name: 构建 runtime-rs(Rust)
28+
run: cargo build --release --manifest-path runtime-rs/Cargo.toml

‎layout/build.rs‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
// 链接 kvspace dispatch 前端(与后端同装 /usr/lib/kvspace)。布局侧只通过 extern "C" ABI 调用,
1+
// 链接 kvspace dispatch 前端(与后端同装 <prefix>/lib/kvspace)。布局侧只通过 extern "C" ABI 调用,
22
// 运行期由前端按 DSN 选后端(shm://→kvspace-c,其余→kvspace-durable)。
3+
// KVSPACE_LIB_DIR 可覆盖安装目录:macOS 的 /usr 受 SIP 保护,应指向 <prefix>/lib/kvspace。
34
fn main() {
4-
println!("cargo:rustc-link-search=native=/usr/lib/kvspace");
5+
let dir = std::env::var("KVSPACE_LIB_DIR").unwrap_or_else(|_| "/usr/lib/kvspace".into());
6+
println!("cargo:rustc-link-search=native={dir}");
57
println!("cargo:rustc-link-lib=dylib=kvspace");
6-
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags"); // rpath 转 DT_RPATH,传递解析子依赖
7-
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/kvspace");
8+
println!("cargo:rustc-link-arg=-Wl,-rpath,{dir}");
9+
if !cfg!(target_os = "macos") {
10+
// rpath 转 DT_RPATH,传递解析子依赖;ld64 无 --disable-new-dtags
11+
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags");
12+
}
813
}

‎runtime-rs/build.rs‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,28 @@ fn main() {
2323
let manifest = env!("CARGO_MANIFEST_DIR");
2424
let bin = format!("{manifest}/../bin"); // kvlang/bin(新构建的 libkvlang_runtime.so)
2525

26+
// KVSPACE_LIB_DIR 可覆盖安装目录:macOS 的 /usr 受 SIP 保护,应指向 <prefix>/lib/kvspace。
27+
let kvspace_dir = std::env::var("KVSPACE_LIB_DIR").unwrap_or_else(|_| "/usr/lib/kvspace".into());
28+
2629
println!("cargo:rustc-link-search=native={bin}");
27-
println!("cargo:rustc-link-search=native=/usr/lib/kvspace");
28-
println!("cargo:rustc-link-search=native=/usr/lib");
30+
println!("cargo:rustc-link-search=native={kvspace_dir}");
2931
println!("cargo:rustc-link-lib=dylib=kvlang_runtime");
3032
println!("cargo:rustc-link-lib=dylib=kvspace");
3133
println!("cargo:rustc-link-lib=dylib=kvlanglayout");
3234

33-
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags"); // rpath 转 DT_RPATH,传递解析子依赖
34-
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN");
35-
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN/../lib");
36-
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/kvspace");
37-
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib");
35+
if cfg!(target_os = "macos") {
36+
// macOS:ld64 无 --disable-new-dtags;$ORIGIN 对应 @loader_path
37+
println!("cargo:rustc-link-arg=-Wl,-rpath,@loader_path");
38+
println!("cargo:rustc-link-arg=-Wl,-rpath,@loader_path/../lib");
39+
println!("cargo:rustc-link-arg=-Wl,-rpath,{kvspace_dir}");
40+
} else {
41+
println!("cargo:rustc-link-search=native=/usr/lib");
42+
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags"); // rpath 转 DT_RPATH,传递解析子依赖
43+
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN");
44+
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN/../lib");
45+
println!("cargo:rustc-link-arg=-Wl,-rpath,{kvspace_dir}");
46+
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib");
47+
}
3848

3949
// 内嵌顶层 stdlib/**/*.kv → EMBEDDED_KV。
4050
let libdir = format!("{manifest}/../stdlib");

‎runtime/CMakeLists.txt‎

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,19 @@ add_library(kvlang_runtime SHARED ${KVLANG_RUNTIME_SRC})
1515
target_include_directories(kvlang_runtime PUBLIC include src)
1616
target_compile_definitions(kvlang_runtime PRIVATE _GNU_SOURCE)
1717

18-
# 链接 kvspace dispatch 前端(已安装 /usr/lib),运行期按 DSN 选后端,编译期不再选后端。
19-
# 链接 kvspace dispatch 前端(与后端同装 /usr/lib/kvspace),运行期按 DSN 选后端,编译期不再选后端。
20-
target_link_directories(kvlang_runtime PRIVATE /usr/lib/kvspace)
21-
target_link_libraries(kvlang_runtime PRIVATE kvspace m pthread)
18+
# 链接 kvspace dispatch 前端(与后端同装 <prefix>/lib/kvspace),运行期按 DSN 选后端,编译期不再选后端。
19+
# KVSPACE_LIB_DIR 可覆盖安装目录:macOS 的 /usr 受 SIP 保护,应指向 <prefix>/lib/kvspace。
20+
set(KVSPACE_LIB_DIR "/usr/lib/kvspace" CACHE PATH "kvspace dispatch 前端安装目录")
21+
target_link_directories(kvlang_runtime PRIVATE ${KVSPACE_LIB_DIR})
2222

23-
# --export-dynamic 供 kvlang(term 扩展)找符号;--disable-new-dtags 使 rpath 转 DT_RPATH(传递)。
24-
set_target_properties(kvlang_runtime PROPERTIES LINK_FLAGS "-Wl,--export-dynamic -Wl,--disable-new-dtags -Wl,-rpath,/usr/lib/kvspace")
23+
if(APPLE)
24+
# macOS:数学/线程符号在 libSystem 内(无 -lm/-lpthread);ld64 无 --disable-new-dtags
25+
target_link_libraries(kvlang_runtime PRIVATE kvspace)
26+
set_target_properties(kvlang_runtime PROPERTIES
27+
LINK_FLAGS "-Wl,-export_dynamic -Wl,-rpath,${KVSPACE_LIB_DIR}")
28+
else()
29+
target_link_libraries(kvlang_runtime PRIVATE kvspace m pthread)
30+
# --export-dynamic 供 kvlang(term 扩展)找符号;--disable-new-dtags 使 rpath 转 DT_RPATH(传递)。
31+
set_target_properties(kvlang_runtime PROPERTIES
32+
LINK_FLAGS "-Wl,--export-dynamic -Wl,--disable-new-dtags -Wl,-rpath,${KVSPACE_LIB_DIR}")
33+
endif()

0 commit comments

Comments
 (0)