Skip to content

Commit 9edfb92

Browse files
committed
Use vendored lean-sys and fix a linking issue
1 parent f58d579 commit 9edfb92

5 files changed

Lines changed: 42 additions & 54 deletions

File tree

.cargo/config.toml

Lines changed: 0 additions & 2 deletions
This file was deleted.

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wavelet-core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ license.workspace = true
77

88
[dependencies]
99
thiserror.workspace = true
10-
lean-sys = { version = "0.0.9", default-features = false }
10+
lean-sys = { git = "https://github.com/zhengyao-lin/lean-sys.git", default-features = false, features = ["no_link"] }
1111
libc = "0.2.180"

wavelet-core/build.rs

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@ fn main() {
66
.display()
77
.to_string();
88

9-
println!("cargo:rerun-if-changed=build.rs");
10-
println!("cargo:rerun-if-changed=lean/Wavelet");
11-
println!("cargo:rerun-if-changed=lean/Wavelet.lean");
12-
println!("cargo:rerun-if-changed=lean/lake-manifest.json");
13-
println!("cargo:rerun-if-changed=lean/lakefile.lean");
14-
println!("cargo:rerun-if-changed=lean/lean-toolchain");
15-
println!("cargo:rerun-if-changed=lean/.lake/packages/batteries/.lake/build/lib");
9+
println!("cargo::rerun-if-changed=build.rs");
10+
println!("cargo::rerun-if-changed=lean/Wavelet");
11+
println!("cargo::rerun-if-changed=lean/Wavelet.lean");
12+
println!("cargo::rerun-if-changed=lean/lake-manifest.json");
13+
println!("cargo::rerun-if-changed=lean/lakefile.lean");
14+
println!("cargo::rerun-if-changed=lean/lean-toolchain");
15+
println!("cargo::rerun-if-changed=lean/.lake/packages/batteries/.lake/build/lib");
1616

17-
// Find and dynamically link against `leanshared`
18-
// Adapted from `lean-sys`'s `build.rs`
17+
// Find Lean library paths
1918
let output = Command::new("lean")
2019
.current_dir("lean")
2120
.args(["--print-prefix"])
@@ -33,35 +32,13 @@ fn main() {
3332
.expect("invalid lean library path")
3433
.trim(),
3534
);
36-
37-
let lib_dir = if cfg!(target_os = "windows") {
38-
lean_dir.join("bin")
39-
} else {
40-
lean_dir.join("lib/lean")
41-
};
42-
43-
let mut shared_lib = lib_dir.clone();
44-
let exists = if cfg!(target_os = "windows") {
45-
shared_lib.push("libleanshared.dll");
46-
shared_lib.exists()
47-
} else if cfg!(target_os = "macos") {
48-
shared_lib.push("libleanshared.dylib");
49-
shared_lib.exists()
50-
} else {
51-
shared_lib.push("libleanshared.so");
52-
shared_lib.exists()
53-
};
54-
5535
assert!(
56-
exists,
57-
"lean shared library does not exist: {}",
58-
shared_lib.display()
36+
lean_dir.exists(),
37+
"lean prefix does not exist: {}",
38+
lean_dir.display()
5939
);
6040

61-
println!("cargo:rustc-link-search=native={}", lib_dir.display());
62-
println!("cargo:rustc-link-lib=dylib=leanshared");
63-
println!("cargo:rustc-link-arg=-Wl,{}", lib_dir.display());
64-
41+
// Fetch Lake dependencies
6542
let status = Command::new("lake")
6643
.current_dir("lean")
6744
.args(["exec", "cache", "get"])
@@ -70,22 +47,38 @@ fn main() {
7047
assert!(status.success(), "`lake exec cache` get failed");
7148

7249
// Build `libWavelet` and `libBatteries`
73-
let output = Command::new("lake")
50+
let status = Command::new("lake")
7451
.current_dir("lean")
7552
.args(["build", "Wavelet", "Batteries:static"])
76-
.output()
53+
.status()
7754
.expect("failed to run `lake build`");
78-
assert!(output.status.success(), "`lake build` failed");
79-
let stdout = String::from_utf8_lossy(&output.stdout);
80-
let stderr = String::from_utf8_lossy(&output.stderr);
81-
for line in stdout.lines() {
82-
println!("cargo:warning=[lake build] {}", line);
55+
assert!(status.success(), "`lake build` failed");
56+
57+
// Include various linking search paths for Lean and Wavelet
58+
println!("cargo::rustc-link-search=native={}/lib", lean_dir.display());
59+
if cfg!(target_os = "windows") {
60+
println!("cargo::rustc-link-search=native={}", lean_dir.join("bin").display());
61+
} else {
62+
println!("cargo::rustc-link-search=native={}", lean_dir.join("lib/lean").display());
8363
}
84-
for line in stderr.lines() {
85-
println!("cargo:warning=[lake build] {}", line);
64+
println!("cargo::rustc-link-search=native={manifest_dir}/lean/.lake/build/lib");
65+
println!("cargo::rustc-link-search=native={manifest_dir}/lean/.lake/packages/batteries/.lake/build/lib");
66+
67+
// Link against various required libraries
68+
for lib in ["Wavelet", "Batteries", "Lean", "Std", "Init", "leanrt", "leancpp", "uv"] {
69+
println!("cargo::rustc-link-lib=static={lib}");
70+
}
71+
72+
if cfg!(target_os = "macos") {
73+
// macOS does not have static libc++
74+
println!("cargo::rustc-link-lib=dylib=c++");
75+
println!("cargo::rustc-link-lib=dylib=c++abi");
76+
} else {
77+
println!("cargo::rustc-link-lib=static=c++");
78+
println!("cargo::rustc-link-lib=static=c++abi");
8679
}
8780

88-
// Statically link `libWavelet`
89-
println!("cargo:rustc-link-search=native={manifest_dir}/lean/.lake/build/lib");
90-
println!("cargo:rustc-link-search=native={manifest_dir}/lean/.lake/packages/batteries/.lake/build/lib");
81+
for lib in ["m", "dl", "gmp"] {
82+
println!("cargo::rustc-link-lib=dylib={lib}");
83+
}
9184
}

wavelet-core/src/ffi.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ use lean_sys::{
1212
};
1313
use thiserror::Error;
1414

15-
#[link(name = "Batteries", kind = "static")]
16-
#[link(name = "Wavelet", kind = "static")]
1715
unsafe extern "C" {
1816
/// Auto-generated by Lean to initialize the Wavelet module.
1917
fn initialize_Wavelet(builtin: u8) -> lean_obj_res;

0 commit comments

Comments
 (0)