Skip to content

Commit 30d9410

Browse files
committed
fix(builder): Replace manual cmake commands with cmake crate to support all archs.
1 parent e3ab65c commit 30d9410

File tree

2 files changed

+18
-235
lines changed

2 files changed

+18
-235
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ build = "build.rs"
1616
crate-type = ["cdylib", "lib"]
1717

1818
[dependencies]
19-
libc = "0.2.121"
2019
bitflags = "1.3.2"
20+
libc = "0.2.121"
2121
thiserror = "1.0.30"
2222

2323
[dev-dependencies]
2424
hex = "0.4.3"
2525
quickcheck = "1"
26+
27+
[build-dependencies]
28+
cmake = "0.1"

build.rs

Lines changed: 14 additions & 234 deletions
Original file line numberDiff line numberDiff line change
@@ -20,241 +20,21 @@
2020
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
2121
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2222

23-
use std::{
24-
env,
25-
fs,
26-
io::{ErrorKind, Write},
27-
path::{Path, PathBuf},
28-
process::Command,
29-
};
23+
use std::env;
24+
25+
use cmake::Config;
3026

3127
#[allow(clippy::too_many_lines)]
3228
fn main() {
33-
let out_dir = env::var("OUT_DIR").unwrap();
34-
let project_dir = Path::new(&out_dir);
35-
let cargo_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
36-
37-
let repo_dir = PathBuf::from(env::var("RANDOMX_DIR").unwrap_or_else(|_| format!("{}/RandomX", &cargo_dir)));
38-
let build_dir = &project_dir.join("randomx_build");
39-
40-
env::set_current_dir(Path::new(&repo_dir)).unwrap(); // change current path to repo for dependency build
41-
match fs::create_dir_all(build_dir) {
42-
Ok(_) => (),
43-
Err(e) => match e.kind() {
44-
ErrorKind::AlreadyExists => (),
45-
_ => panic!("{}", e),
46-
},
47-
}
48-
env::set_current_dir(build_dir).unwrap();
49-
50-
let host = env::var("HOST").unwrap();
51-
// println!("host: {}", host);
52-
let target = env::var("TARGET").unwrap();
53-
// println!("target: {}", target);
54-
if host.contains("windows") && target.contains("windows-msvc") {
55-
let c = Command::new("cmake")
56-
.arg("-G")
57-
.arg("Visual Studio 16 2019")
58-
.arg(repo_dir.to_str().unwrap())
59-
.output()
60-
.expect("failed to execute CMake");
61-
println!("status: {}", c.status);
62-
std::io::stdout().write_all(&c.stdout).unwrap();
63-
std::io::stderr().write_all(&c.stderr).unwrap();
64-
assert!(c.status.success());
65-
66-
let m = Command::new("cmake")
67-
.arg("--build")
68-
.arg(".")
69-
.arg("--config")
70-
.arg("Release")
71-
.output()
72-
.expect("failed to execute Make");
73-
println!("status: {}", m.status);
74-
std::io::stdout().write_all(&m.stdout).unwrap();
75-
std::io::stderr().write_all(&m.stderr).unwrap();
76-
assert!(m.status.success());
77-
} else if target.contains("aarch64-unknown-linux-gnu") {
78-
let c = Command::new("cmake")
79-
.arg("-D")
80-
.arg("ARCH=arm64")
81-
.arg("-D")
82-
.arg("ARCH_ID=aarch64")
83-
.arg("-D")
84-
.arg("CMAKE_CROSSCOMPILING=true")
85-
.arg("-D")
86-
.arg("CMAKE_SYSTEM_PROCESSOR=aarch64")
87-
.arg("-D")
88-
.arg("CMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc")
89-
.arg("-D")
90-
.arg("CMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++")
91-
.arg(repo_dir.to_str().unwrap())
92-
.output()
93-
.expect("failed to execute CMake");
94-
println!("status: {}", c.status);
95-
std::io::stdout().write_all(&c.stdout).unwrap();
96-
std::io::stderr().write_all(&c.stderr).unwrap();
97-
assert!(c.status.success());
98-
99-
let m = Command::new("cmake")
100-
.arg("--build")
101-
.arg(".")
102-
.arg("--config")
103-
.arg("Release")
104-
.output()
105-
.expect("failed to execute Make");
106-
println!("status: {}", m.status);
107-
std::io::stdout().write_all(&m.stdout).unwrap();
108-
std::io::stderr().write_all(&m.stderr).unwrap();
109-
assert!(m.status.success());
110-
} else if target.contains("riscv64gc-unknown-linux-gnu") {
111-
let c = Command::new("cmake")
112-
.arg("-D")
113-
.arg("ARCH=rv64gc")
114-
.arg("-D")
115-
.arg("ARCH_ID=riscv64")
116-
.arg("-D")
117-
.arg("CMAKE_CROSSCOMPILING=true")
118-
.arg("-D")
119-
.arg("CMAKE_SYSTEM_PROCESSOR=riscv64")
120-
.arg("-D")
121-
.arg("CMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc")
122-
.arg("-D")
123-
.arg("CMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++")
124-
.arg(repo_dir.to_str().unwrap())
125-
.output()
126-
.expect("failed to execute CMake");
127-
println!("status: {}", c.status);
128-
std::io::stdout().write_all(&c.stdout).unwrap();
129-
std::io::stderr().write_all(&c.stderr).unwrap();
130-
assert!(c.status.success());
131-
132-
let m = Command::new("cmake")
133-
.arg("--build")
134-
.arg(".")
135-
.arg("--config")
136-
.arg("Release")
137-
.output()
138-
.expect("failed to execute Make");
139-
println!("status: {}", m.status);
140-
std::io::stdout().write_all(&m.stdout).unwrap();
141-
std::io::stderr().write_all(&m.stderr).unwrap();
142-
assert!(m.status.success());
143-
} else if target.contains("linux-android") {
144-
let android_abi = {
145-
if target.contains("aarch64") {
146-
"arm64-v8a"
147-
} else if target.contains("x86_64") {
148-
"x86_64"
149-
} else if target.contains("armv7") {
150-
"armeabi-v7a"
151-
} else if target.contains("i686") {
152-
"x86"
153-
} else {
154-
panic!("unknown Android ABI")
155-
}
156-
};
157-
158-
let android_sdk = env::var("ANDROID_SDK_ROOT").expect("ANDROID_SDK_ROOT variable not set");
159-
160-
let android_platform = env::var("ANDROID_PLATFORM").unwrap_or_else(|_| "android-26".to_owned());
161-
let android_cmake = env::var("ANDROID_CMAKE").unwrap_or(android_sdk.clone() + "/cmake/3.22.1/bin/cmake");
162-
let android_toolchain = env::var("ANDROID_CMAKE_TOOLCHAIN")
163-
.unwrap_or(android_sdk + "/ndk/22.1.7171670/build/cmake/android.toolchain.cmake");
164-
165-
let c = Command::new(android_cmake)
166-
.arg("-D")
167-
.arg("CMAKE_TOOLCHAIN_FILE=".to_owned() + &android_toolchain)
168-
.arg("-D")
169-
.arg("ANDROID_ABI=".to_owned() + android_abi)
170-
.arg("-D")
171-
.arg("ANDROID_PLATFORM=".to_owned() + &android_platform)
172-
.arg(repo_dir.to_str().unwrap())
173-
.output()
174-
.expect("failed to execute CMake");
175-
176-
println!("status: {}", c.status);
177-
std::io::stdout().write_all(&c.stdout).unwrap();
178-
std::io::stderr().write_all(&c.stderr).unwrap();
179-
assert!(c.status.success());
180-
181-
let m = Command::new("make").output().expect("failed to execute Make");
182-
println!("status: {}", m.status);
183-
std::io::stdout().write_all(&m.stdout).unwrap();
184-
std::io::stderr().write_all(&m.stderr).unwrap();
185-
assert!(m.status.success());
186-
} else if target.contains("aarch64-apple-darwin") {
187-
let mut c = Command::new("cmake");
188-
c.arg("-D")
189-
.arg("ARCH=arm64")
190-
.arg("-D")
191-
.arg("ARCH_ID=aarch64")
192-
.arg("-D")
193-
.arg("CMAKE_CROSSCOMPILING=true")
194-
.arg("-D")
195-
.arg("CMAKE_SYSTEM_PROCESSOR=aarch64")
196-
.arg("-D")
197-
.arg("CMAKE_C_FLAGS='-arch arm64'")
198-
.arg("-D")
199-
.arg("CMAKE_CXX_FLAGS='-arch arm64'");
200-
if let Ok(env) = env::var("RANDOMX_RS_CMAKE_OSX_SYSROOT") {
201-
c.arg("-D").arg("CMAKE_OSX_SYSROOT=".to_owned() + env.as_str());
202-
}
203-
let output = c
204-
.arg(repo_dir.to_str().unwrap())
205-
.output()
206-
.expect("failed to execute CMake");
207-
println!("status: {}", output.status);
208-
std::io::stdout().write_all(&output.stdout).unwrap();
209-
std::io::stderr().write_all(&output.stderr).unwrap();
210-
assert!(output.status.success());
211-
212-
let m = Command::new("cmake")
213-
.arg("--build")
214-
.arg(".")
215-
.arg("--config")
216-
.arg("Release")
217-
.output()
218-
.expect("failed to execute Make");
219-
println!("status: {}", m.status);
220-
std::io::stdout().write_all(&m.stdout).unwrap();
221-
std::io::stderr().write_all(&m.stderr).unwrap();
222-
assert!(m.status.success());
223-
} else {
224-
let c = Command::new("cmake")
225-
.arg(repo_dir.to_str().unwrap())
226-
.output()
227-
.expect("failed to execute CMake");
228-
println!("status: {}", c.status);
229-
std::io::stdout().write_all(&c.stdout).unwrap();
230-
std::io::stderr().write_all(&c.stderr).unwrap();
231-
assert!(c.status.success());
232-
233-
let m = Command::new("make").output().expect("failed to execute Make");
234-
println!("status: {}", m.status);
235-
std::io::stdout().write_all(&m.stdout).unwrap();
236-
std::io::stderr().write_all(&m.stderr).unwrap();
237-
assert!(m.status.success());
238-
}
239-
240-
env::set_current_dir(Path::new(&project_dir)).unwrap(); // change path back to main project
241-
242-
if target.contains("windows") {
243-
let include = &build_dir.join("Release");
244-
println!("cargo:rustc-link-search=native={}", &include.to_str().unwrap());
245-
println!("cargo:rustc-link-lib=static=randomx");
246-
} else {
247-
println!("cargo:rustc-link-search=native={}", &build_dir.to_str().unwrap());
248-
println!("cargo:rustc-link-lib=static=randomx");
249-
} // link to RandomX
250-
251-
if target.contains("apple") || target.contains("android") || target.contains("freebsd") {
252-
println!("cargo:rustc-link-lib=dylib=c++");
253-
} else if target.contains("linux") {
254-
println!("cargo:rustc-link-lib=dylib=stdc++");
255-
} else if target.contains("windows") {
256-
// println!("cargo:rustc-link-lib=dylib=c++");
257-
} else {
258-
unimplemented!();
259-
}
29+
let randomx_path = Config::new(env::var("RANDOMX_DIR").unwrap_or_else(|_| "RandomX".to_string()))
30+
.define("DARCH", "native")
31+
.build();
32+
println!("cargo:rustc-link-search=native={}/lib", randomx_path.display());
33+
println!("cargo:rustc-link-lib=static=randomx");
34+
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap_or("linux".to_string());
35+
let dylib_name = match target_os.as_str() {
36+
"macos" | "ios" => "c++",
37+
_ => "stdc++",
38+
};
39+
println!("cargo:rustc-link-lib=dylib={}", dylib_name);
26040
}

0 commit comments

Comments
 (0)